windows編程學習筆記之定時器

來源:互聯網
上載者:User

定時器的三種使用方法:

方法一:

這是最方便的一種方法,它讓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.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.