Visual C++——定时刷新重绘窗口[WM_PAINT消息]解决方案
基本概念
定時器:每隔一定時間執(zhí)行一次的任務(wù)。
API
SetTimer的函數(shù)原型:?
UINT_PTR SetTimer(?HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc )?;?
其中?
hWnd是和timer關(guān)聯(lián)的窗口句柄,此窗口必須為調(diào)用SetTimer的線程所有;如果hWnd為NULL,沒有窗口和timer相關(guān)聯(lián)并且nIDEvent參數(shù)被忽略?
nIDEvent是timer的標識,為非零值;如果hWnd為NULL則被忽略;如果hWnd非NULL而且與timer相關(guān)聯(lián)的窗口已經(jīng)存在一個為此標識的timer,則此次SetTimer調(diào)用將用新的timer代替原來的timer。timer標識和窗口相關(guān),兩個不同的窗口可以擁有nIDEvent相同的tiemr?
uElapse是以毫秒指定的計時間隔值,范圍為1毫秒到4,294,967,295毫秒(將近50天),這個值指示W(wǎng)indows每隔多久時間給程序發(fā)送WM_TIMER消息。?
lpTimerFunc是一個回調(diào)函數(shù)的指針,俗稱TimerFunc;如果lpTimerFunc為NULL,系統(tǒng)將向應(yīng)用程序隊列發(fā)送WM_TIMER消息;如果lpTimerFunc指定了一個值,DefWindowProc將在處理WM_TIMER消息時調(diào)用這個lpTimerFunc所指向的回調(diào)函數(shù),因此即使使用TimerProc代替處理WM_TIMER也需要向窗口分發(fā)消息。?
返回值:如果hWnd為NULL,返回值為新建立的timer的ID,如果hWnd非NULL,返回一個非0整數(shù),如果SetTimer調(diào)用失敗則返回0?
KillTimer的函數(shù)原型:
BOOL KillTimer( HWND hWnd, UINT_PTR uIDEvent ) ;
InvalidateRect的函數(shù)原型:
BOOL InvalidateRect(
HWND hWnd, // handle of window withchanged update region 窗口句柄。
CONST RECT *lpRect, // address ofrectangle coordinates rect結(jié)構(gòu)體的指針。
BOOL bErase // erase-background flag 是否要發(fā)送WM_ERASEBKGND消息從而擦除原來的背景
);
作用:使得Client的一個矩形區(qū)域變得無效,rect結(jié)構(gòu)體可以自己編輯,也可以使用GetClientRcet()來填充(這里的矩形大小Client的大小),
最主要的是第三個參數(shù),第三個參數(shù)決定了是否發(fā)送WM_ERASEBKGND消息,從而決定了是否擦除Client原有的圖形。
關(guān)于WM_TIMER消息?
wParam為計時器的ID;
如果需要設(shè)定多個計時器,那么對每個計時器都使用不同的計時器ID。
wParam的值將隨傳遞到窗口過程中的WM_TIMER消息的不同而不同。?
lParam為指向TimerProc的指針,如果調(diào)用SetTimer時沒有指定TimerProc(參數(shù)值為NULL),則lParam為0(即NULL)。?
可以通過在窗口過程中提供一個WM_TIMER case處理這個消息,或者,默認窗口過程會調(diào)用SetTimer中指定的TimerProc來處理
解決方案
例:每隔一秒(1000毫秒)執(zhí)行一次,但每次的情況不同,所以用一個BOOL類型的變量來標識,如果為TRUE就在WM_PAINT事件中把窗口的客戶區(qū)域填充為紅色,如果為FALSE就不填充。如此,就可以使得窗口呈現(xiàn)出一閃一閃的效果。?
// Timer的回調(diào)函數(shù) 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;?運行結(jié)果
?
參考文章
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位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Visual C++——定时刷新重绘窗口[WM_PAINT消息]解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Visual C++——获取屏幕大小、窗
- 下一篇: C#——实现IComparable接口、