定时器的三种使用方法:
方法一:
这是最方便的一种方法,它让Windows把WM_TIMER消息发送到应用程序的正常窗口消息处理程序中,SetTimer呼叫如下所示:
SetTimer (hwnd, 1, uiMsecInterval, NULL) ;
第一个参数是其窗口消息处理程序将接收WM_TIMER消息的窗口句柄。第二个参数是定时器ID,它是一个非0数值,在整个例子中假定为1。第三个参数是一个32位无正负号整数,以毫秒为单位指定一个时间间隔,一个60,000的值将使Windows每分钟发送一次WM_TIMER消息。
您可以通过呼叫
KillTimer (hwnd, 1) ;
在任何时刻停止WM_TIMER消息(即使正在处理WM_TIMER消息)。此函数的第二个参数是SetTimer呼叫中所用的同一个定时器ID。在终止程序之前,您应该响应WM_DESTROY消息停止任何活动的定时器。
当您的窗口消息处理程序收到一个WM_TIMER消息时,wParam参数等于定时器的ID值(上述情形为1),lParam参数为0。如果需要设定多个定时器,那么对每个定时器都使用不同的定时器ID。wParam的值将随传递到窗口消息处理程序的WM_TIMER消息的不同而不同。为了使程序更具有可读性,您可以使用#define叙述定义不同的定时器ID:
#define TIMER_SEC 1 #define TIMER_MIN 2 在窗口过程处理函数中增加:
caseWM_TIMER: switch (wParam) { case TIMER_SEC: //每秒一次的处理 break ; case TIMER_MIN: //每分钟一次的处理 break ; } return 0 ; 进行处理。
方法二:
让Windows直接将定时器消息发送给您程序的另一个函数。
SetTimer (hwnd, iTimerID, iMsecInterval, TimerProc) ;我们把以下的callback函数称为TimerProc(您能够选择与其它一些用语不会发生冲突的任何名称),它只处理WM_TIMER消息:
VOID CALLBACK TimerProc ( HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime) { 处理WM_TIMER消息 }TimerProc的参数hwnd是在呼叫SetTimer时指定的窗口句柄。Windows只把WM_TIMER消息送给TimerProc,因此消息参数总是等于WM_TIMER。
iTimerID值是定时器ID,dwTimer值是与从GetTickCount函数的传回值相容的值。这是自Windows启动后所经过的毫秒数。
方法三:
设定定时器的第三种方法类似于第二种方法,只是传递给SetTimer的hwnd参数被设定为NULL,并且第二个参数(通常为定时器ID)被忽略了,最后,此函数传回定时器ID:
iTimerID = SetTimer (NULL, 0, wMsecInterval, TimerProc) ;如果没有可用的定时器,那么从SetTimer传回的iTimerID值将为NULL。
KillTimer的第一个参数(通常是窗口句柄)也必须为NULL,定时器ID必须是SetTimer的传回值:
KillTimer (NULL, iTimerID) ;传递给TimerProc定时器函数的hwnd参数也必须是NULL。这种设定定时器的方法很少被使用。如果在您的程序在不同时刻有一系列的SetTimer呼叫,而又不希望追踪您已经
用过了那些定时器ID,那么使用此方法是很方便的。
该章节中出现的一些函数:
1.MessageBeep (-1) ;
播放声音,参数可以取下面一些值来播放不同的声音。返回值为BOOL类型,成功返回非零,失败返回0。
如果失败可以调用
DWORD GetLastError(VOID);函数来得到错误类型。
Value | Sound |
---|---|
-1 | Standard beep using the computer speaker |
MB_ICONASTERISK | SystemAsterisk |
MB_ICONEXCLAMATION | SystemExclamation |
MB_ICONHAND | SystemHand |
MB_ICONQUESTION | SystemQuestion |
MB_OK | SystemDefault |
2.BOOL InvalidateRect( HWND hWnd, // handle to window CONST RECT *lpRect, // rectangle coordinates BOOL bErase // erase state );
InvalidateRect (hwnd, NULL, FALSE) ; 参数1指向需要更新窗口的句柄;参数2指向需要更新的区域,为NULL时说明整个区域都要更新;
参数3指示更新时背景是否擦除,TRUE时擦除,FALSE时不擦除。
3.BOOL GetClientRect( HWND hWnd, // handle to window LPRECT lpRect // client coordinates );
得到hWnd所指向的窗口的客户区并且放入到lprect中。
4.GetClientRect (hwnd, &rc)
5.FillRect (hdc, &rc, hBrush) ;
6.Polygon (hdc, ptSegment [iSeg], 6) ;
7. OffsetWindowOrgEx (hdc, -42, 0, NULL) ; 8.GetLocalTime (&st) ;函数传回目前的当地(计算机设置的)时间
GetSystemTime(&st) ;函数传回目前的世界时间 typedef struct _SYSTEMTIME { WORD wYear ; WORD wMonth ; WORD wDayOfWeek ; WORD wDay ; WORD wHour ; WORD wMinute ; WORD wSecond ; WORD wMilliseconds ; } SYSTEMTIME, * PSYSTEMTIME ;
9.GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_ITIME, szBuffer, 2) ;
int GetLocaleInfo( LCID Locale, // locale identifier LCTYPE LCType, // information type LPTSTR lpLCData, // information buffer int cchData // size of buffer );
根据参数2得到系统的或用户的指定信息,放在szBuffer空间中,如果最后的长度为0,返回值为得到的信息的长度。 10. SetMapMode (hdc, MM_ISOTROPIC) ; 11. SetWindowExtEx (hdc, 276, 72, NULL) ; 12. SetViewportExtEx (hdc, cxClient, cyClient, NULL) ;
13. SetWindowOrgEx (hdc, 138, 36, NULL) ; 14. SetViewportOrgEx (hdc, cxClient / 2, cyClient / 2, NULL) ;
该章节程序调试中出现的错误:
Linking...
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/test.exe : fatal error LNK1120: 1 unresolved externals
解决办法:这个文件中使用了WinMian而不是main作为入口函数。vc这时的默认设置是针对控制台程序的。
解决方法:
1.进入project->setting->c/c++, 在category(第一行)中选择preprocessor,在processor definitions中添加_WINDOWS, 删除_CONSOLE
2.进入project->setting->Link, 在Project options中将/subsystem:console.改为/subsystem:windows
3.保存设置,Rebuild All.