定時器的三種使用方法:
方法一:
這是最方便的一種方法,它讓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.