windows编程学习笔记之定时器

来源:互联网 发布:秀恩爱 知乎 编辑:程序博客网 时间:2024/06/13 09:03

定时器的三种使用方法:

方法一:

这是最方便的一种方法,它让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.

原创粉丝点击