Visual C++——定时刷新重绘窗口[WM_PAINT消息]解决方案
基本概念
定時器:每隔一定時間執行一次的任務。
API
SetTimer的函數原型:?
UINT_PTR SetTimer(?HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc )?;?
其中?
hWnd是和timer關聯的窗口句柄,此窗口必須為調用SetTimer的線程所有;如果hWnd為NULL,沒有窗口和timer相關聯并且nIDEvent參數被忽略?
nIDEvent是timer的標識,為非零值;如果hWnd為NULL則被忽略;如果hWnd非NULL而且與timer相關聯的窗口已經存在一個為此標識的timer,則此次SetTimer調用將用新的timer代替原來的timer。timer標識和窗口相關,兩個不同的窗口可以擁有nIDEvent相同的tiemr?
uElapse是以毫秒指定的計時間隔值,范圍為1毫秒到4,294,967,295毫秒(將近50天),這個值指示Windows每隔多久時間給程序發送WM_TIMER消息。?
lpTimerFunc是一個回調函數的指針,俗稱TimerFunc;如果lpTimerFunc為NULL,系統將向應用程序隊列發送WM_TIMER消息;如果lpTimerFunc指定了一個值,DefWindowProc將在處理WM_TIMER消息時調用這個lpTimerFunc所指向的回調函數,因此即使使用TimerProc代替處理WM_TIMER也需要向窗口分發消息。?
返回值:如果hWnd為NULL,返回值為新建立的timer的ID,如果hWnd非NULL,返回一個非0整數,如果SetTimer調用失敗則返回0?
KillTimer的函數原型:
BOOL KillTimer( HWND hWnd, UINT_PTR uIDEvent ) ;
InvalidateRect的函數原型:
BOOL InvalidateRect(
HWND hWnd, // handle of window withchanged update region 窗口句柄。
CONST RECT *lpRect, // address ofrectangle coordinates rect結構體的指針。
BOOL bErase // erase-background flag 是否要發送WM_ERASEBKGND消息從而擦除原來的背景
);
作用:使得Client的一個矩形區域變得無效,rect結構體可以自己編輯,也可以使用GetClientRcet()來填充(這里的矩形大小Client的大小),
最主要的是第三個參數,第三個參數決定了是否發送WM_ERASEBKGND消息,從而決定了是否擦除Client原有的圖形。
關于WM_TIMER消息?
wParam為計時器的ID;
如果需要設定多個計時器,那么對每個計時器都使用不同的計時器ID。
wParam的值將隨傳遞到窗口過程中的WM_TIMER消息的不同而不同。?
lParam為指向TimerProc的指針,如果調用SetTimer時沒有指定TimerProc(參數值為NULL),則lParam為0(即NULL)。?
可以通過在窗口過程中提供一個WM_TIMER case處理這個消息,或者,默認窗口過程會調用SetTimer中指定的TimerProc來處理
解決方案
例:每隔一秒(1000毫秒)執行一次,但每次的情況不同,所以用一個BOOL類型的變量來標識,如果為TRUE就在WM_PAINT事件中把窗口的客戶區域填充為紅色,如果為FALSE就不填充。如此,就可以使得窗口呈現出一閃一閃的效果。?
// Timer的回調函數 VOID CALLBACK TimerProc(_In_ HWND hwnd,_In_ UINT uMsg,_In_ UINT_PTR idEvent,_In_ DWORD dwTime ) {isBorderDrawed = !isBorderDrawed;RECT rect;GetClientRect(hwnd,&rect);InvalidateRect(hwnd, &rect, TRUE); } /* 處理WM_PAINT消息 */case WM_PAINT:hdc = BeginPaint(hWnd, &ps);// TODO: 在此添加任意繪圖代碼...// 獲取窗口邊框矩形RECT rect;GetClientRect(hWnd, &rect);if (isBorderDrawed){HBRUSH hb = CreateSolidBrush(RGB(255,0,0));FillRect(hdc,&rect, hb);SelectObject(hdc,hb);}EndPaint(hWnd, &ps);break;?運行結果
?
參考文章
https://shentuzhigang.blog.csdn.net/article/details/105288759
https://blog.csdn.net/u012104827/article/details/105278079/
https://blog.csdn.net/tcjiaan/article/details/8916626
https://blog.csdn.net/u011580175/article/details/56354223
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Visual C++——定时刷新重绘窗口[WM_PAINT消息]解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual C++——获取屏幕大小、窗
- 下一篇: Visual C++——《可视化编程技术