帮忙看看这个时钟程序

taoanran 2009-10-26 08:32:42
#include <windows.h>
#include <time.h>
#include <string.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{


static TCHAR szAppName[] = TEXT ("HelloWin") ;

HWND hwnd ;


MSG msg ;

WNDCLASS wndclass ;




wndclass.style = CS_HREDRAW | CS_VREDRAW ;

wndclass.lpfnWndProc = WndProc ;


wndclass.cbClsExtra = 0 ;

wndclass.cbWndExtra = 0 ;

wndclass.hInstance = hInstance ;



wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;


wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;





wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;

wndclass.lpszMenuName = NULL ;

wndclass.lpszClassName= szAppName ;



if (!RegisterClass (&wndclass))

{

MessageBox ( NULL, TEXT ("This program requires Windows XP!"),

szAppName, MB_ICONERROR) ;

return 0 ;

}

hwnd = CreateWindow( szAppName,

TEXT ("关机定时器"),

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

NULL,

NULL,

hInstance,

NULL) ;



ShowWindow (hwnd, iCmdShow) ;

UpdateWindow (hwnd) ;






while (GetMessage (&msg, NULL, 0, 0))
{

TranslateMessage (&msg) ;

DispatchMessage (&msg) ;

}

return msg.wParam ;

}


long CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//窗口消息处理程序

{

HDC hdc ;


PAINTSTRUCT ps ;

RECT rect ;



switch (message)
{
case WM_CREATE:

//PlaySound (TEXT ("关机.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
SetTimer(hwnd,1,1000,NULL);
return 0 ;


case WM_PAINT:
{
int space_num=0,n=0;
char timing[30];
char *p1;
time_t t;

time(&t);
p1=ctime(&t);

while(1)
{
if(p1[n]==' ')
{
space_num++;
p1++;
}
else p1++;
if(space_num==3)
{
while(p1[n]!=' ')
{
timing[n]=p1[n];
n++;
}
timing[n]='\0';
break;
}
}

if(strcmp("08:33:50",timing)==0)//问题处在这!!!!!!
{
MessageBox(hwnd,"到时间啦,关机了!!","关机提示",MB_YESNO);

}
hdc=BeginPaint(hwnd,&ps) ;

GetClientRect (hwnd,&rect) ;

DrawText (hdc, TEXT(ctime(&t)), -1, &rect,

DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;


EndPaint (hwnd, &ps) ;

return 0 ;
}

case WM_TIMER:
InvalidateRect(hwnd, NULL, TRUE);
return 0;


case WM_DESTROY:
KillTimer(hwnd,1);
PostQuitMessage (0) ;

return 0 ;

}

return DefWindowProc (hwnd, message, wParam, lParam) ;

}

/*
这是一个闹钟,希望在某一时刻提示用户“时间到了”,但是在MessageBox那条语句那,循环执行了,
我希望只执行一次(就是不会出现 对话框 一直出现,关不掉这种情况),能帮忙解决吗??
*/
...全文
63 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
TADICAN 2009-10-26
  • 打赏
  • 举报
回复
循环刷新导致的问题。
把提示放到WM_TIMER里面去吧。
la_feng 2009-10-26
  • 打赏
  • 举报
回复
#include <windows.h> 
#include <time.h>
#include <string.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{


static TCHAR szAppName[] = TEXT ("HelloWin") ;

HWND hwnd ;


MSG msg ;

WNDCLASS wndclass ;




wndclass.style = CS_HREDRAW | CS_VREDRAW ;

wndclass.lpfnWndProc = WndProc ;


wndclass.cbClsExtra = 0 ;

wndclass.cbWndExtra = 0 ;

wndclass.hInstance = hInstance ;



wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;


wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;





wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;

wndclass.lpszMenuName = NULL ;

wndclass.lpszClassName= szAppName ;



if (!RegisterClass (&wndclass))

{

MessageBox ( NULL, TEXT ("This program requires Windows XP!"),

szAppName, MB_ICONERROR) ;

return 0 ;

}

hwnd = CreateWindow( szAppName,

TEXT ("关机定时器"),

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

CW_USEDEFAULT,

NULL,

NULL,

hInstance,

NULL) ;



ShowWindow (hwnd, iCmdShow) ;

UpdateWindow (hwnd) ;






while (GetMessage (&msg, NULL, 0, 0))
{

TranslateMessage (&msg) ;

DispatchMessage (&msg) ;

}

return msg.wParam ;

}


long CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)//窗口消息处理程序

{

HDC hdc ;


PAINTSTRUCT ps ;

RECT rect ;

int space_num=0,n=0;
char timing[30];
char *p1;
time_t t;

switch (message)
{
case WM_CREATE:

//PlaySound (TEXT ("关机.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
SetTimer(hwnd,1,1000,NULL);
return 0 ;


case WM_PAINT:
{
time(&t);

hdc=BeginPaint(hwnd,&ps) ;

GetClientRect (hwnd,&rect) ;

DrawText (hdc, TEXT(ctime(&t)), -1, &rect,

DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;


EndPaint (hwnd, &ps) ;

return 0 ;
}

case WM_TIMER:


time(&t);
p1=ctime(&t);

while(1)
{
if(p1[n]==' ')
{
space_num++;
p1++;
}
else p1++;
if(space_num==3)
{
while(p1[n]!=' ')
{
timing[n]=p1[n];
n++;
}
timing[n]='\0';
break;
}
}

if(strcmp("09:08:40",timing)==0)//问题处在这!!!!!!
{
MessageBox(hwnd,"到时间啦,关机了!!","关机提示",MB_YESNO);
KillTimer(hwnd,1);
}
InvalidateRect(hwnd, NULL, TRUE);

return 0;


case WM_DESTROY:
KillTimer(hwnd,1);
PostQuitMessage (0) ;

return 0 ;

}

return DefWindowProc (hwnd, message, wParam, lParam) ;

}
luckyboy101 2009-10-26
  • 打赏
  • 举报
回复
还有一点是你这个提醒为什么要放到WM_PAINT里,要用WM_TIMER去刷新页面,这样的话即使没有定时器,页面重画也会触发WM_PAINT执行。为什么不直接放在WM_TIMER消息里去执行?
luckyboy101 2009-10-26
  • 打赏
  • 举报
回复
if(strcmp("08:33:50",timing)==0)//问题处在这!!!!!!
{
KillTimer(hwnd,1);
MessageBox(hwnd,"到时间啦,关机了!!","关机提示",MB_YESNO);
}
//你的定时器要等程序关闭了才被关闭,当然一直会跳出对话框了,此外MessageBox跳出来以后,要等点击是或者否按钮才顺序往下执行,所以定时器要放在MessageBox之前关闭
ToperRay 2009-10-26
  • 打赏
  • 举报
回复
调试timing这个值,你看看对不对啊。

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧