跟我一起玩Win32開發(24) 計時器

2022-05-10 15:07:37 字數 1628 閱讀 8689

有好些時間沒寫部落格了,今天要來耍一下計時器,就是我們常說的timer,它雖然不是什麼複雜的東西,也稱不 上牛x,不過,用處還是不少的,對於那些需要每隔一定時間執行一次的任務,那是相當有用。

先來認識一下一對函式,注意,是一對,不是乙個。

settimer——設定並啟用計時器;

killtimer——取消計時器。

現在你明白為什麼要一對的原因了,就好比程序操作,有啟動或建立程序的函式,就肯定要有關閉程序的函式;有getdc就肯定要伴隨著releasedc函式。陰與陽是此消彼長的。

先說settimer,函式的定義我不說了,自己看標頭檔案和msdn就行了,主要說說以下兩個引數:

nidevent指的是計時器的id,乙個數值,你可以隨例取,只要不是負數不是小數就行,例如10,200,56,115,222等;最後乙個引數lptimerfunc是指向乙個**函式的指標,這個與windowproc類似的,但是這個引數是可以為null的。

當該引數為null時,在windowproc中你就要捕捉wm_timer訊息,不過,這個是訊息是低優先順序的,系統會在處理完其他訊息後,閒著沒事幹才會來處理wm_timer訊息。如果lptimerfunc引數不為null,就不用捕捉wm_timer了,直接在**函式中處理即可。

如果所使用的timer的id已經存在,那麼就會以新的timer來取代原有的timer。

killtimer好說,就是銷毀計時器,其中,timer的id要與前面settimer時用的id保持一致,這個就不用特別說明了,你拿著你的借書證去圖書館借書,到還書的時候,你當然不會拿別人的借書證去還書吧?

理論的東西都是說多無益,還是用例項來說話吧。

先簡單說說這個例子,主要運用計時器,每隔一秒(1000毫秒)執行一次,但每次的情況不同,所以用乙個bool型別的變數來標識,如果為true就在wm_paint事件中把視窗的客戶區域填充為紅色,如果為false就不填充。如此,就可以使得視窗呈現出一閃一閃的效果。

我只貼出核心**,完整的例子我隨後上傳到【資源】中。

[cpp]view plain

copy

// timer的**函式  

void callback timerproc(  

_in_  hwnd hwnd,  

_in_  uint umsg,  

_in_  uint_ptr idevent,  

_in_  dword dwtime  

)    

[cpp]view plain

copy

/* 處理wm_paint訊息 */  

ase wm_paint:  

hdc = beginpaint(hwnd, &ps);  

// todo: 在此新增任意繪圖**...  

// 獲取視窗邊框矩形  

rect rect;  

getclientrect(hwnd, &rect);  

if (isborderdrawed)  

endpaint(hwnd, &ps);  

break;  

結果就如下面兩圖所示。

跟我一起玩WPF 繫結控制項

wpf有了大致的了解。本篇部落格給大家準備了乙個輕鬆且實用的實踐內容。可能這個過程中,你會想到之前做過的 html 會想到 xmal asp.net 和剛入門時接觸的vb 沒錯,這就對啦。我們還是從 demo 開始,雖然例子都很簡單,但是我們通過乙個個例子的組合就已經夠實現乙個比較複雜的系統了。第乙...

跟我一起玩VSTS1 安裝

microsoft visual studio 2005 team system 功能 改進軟體開發生命週期 資訊交流 整合的工具 簡化整合的工作流和過程 增加的投資回報 也就是照顧到軟體開發過程的方方面面。使用者 架構師 開發人員 測試人員 專案管理人員 團隊開發 清潔工.安裝這個龐然大物,微軟都...

Android跟我一起來開發 微影之開篇

醞釀了許久還是決定針對 微影 來發表幾篇博文,一是可以跟大家一起學習分享,另一是感覺自己工作也快四年了手上沒什麼東西,對於一直在開源世界裡挖掘偷用的慣犯感覺該是貢獻自己小小力量的時候了。當然了,專案中還是使用了大量的開源專案,或者針對大神的 做了一些小小的改動,再次感謝大神的無私奉獻 資料介面 架構...