C++ Invalidaterect()函數(shù)作用案例詳解
函數(shù)原型:
BOOLInvalidateRect( HWND hWnd, // handle of window withchanged update region 窗口句柄。 CONST RECT *lpRect, // address ofrectangle coordinates rect結構體的指針。 BOOL bErase // erase-background flag 是否要發(fā)送WM_ERASEBKGND消息從而擦除原來的背景 );
這個函數(shù)的作用是,使得Client的一個矩形區(qū)域變得無效,rect結構體可以自己編輯,也可以使用GetClientRcet()來填充(這里的矩形大小Client的大?。?,最主要的是第三個參數(shù),第三個參數(shù)決定了是否發(fā)送WM_ERASEBKGND消息,從而決定了是否擦除Client原有的圖形。當然InvalidateRect發(fā)送WM_PAINT的形式是一種POST形式(即發(fā)送到程序消息隊列),而不是像SendMessage一樣直接讓操作系統(tǒng)帶著消息,調(diào)用WndProc。
當然如果想像SendMessage一樣的??梢栽诤竺娼又褂肬pdateWindow()直接繞過程序消息隊列直接發(fā)送消息到WndProc函數(shù),來重繪窗口。
分析一下下面的程序會更加的清晰:
case WM_RBUTTONDOWN: hdc = GetDC(hwnd); GetClientRect(hwnd, &rect); DrawText(hdc, TEXT("右鍵鍵被單機咯!"), 13, &rect, DT_VCENTER | DT_SINGLELINE); ReleaseDC(hwnd, hdc); InvalidateRect(hwnd, NULL, true); //UpdateWindow(hwnd); Sleep(1000); return 0; case WM_LBUTTONDOWN: hdc = GetDC(hwnd); GetClientRect(hwnd, &rect); DrawText(hdc, TEXT("左鍵被單機咯!"), 13, &rect, DT_CENTER | DT_SINGLELINE); ReleaseDC(hwnd, hdc); return 0;
這里為了能看到效果我使用了Sleep。在實際編程處理消息,不是在多線程時,這樣的使用是十分愚蠢的,因為,消息循環(huán)的機制,如果你不快速的處理每一條消息。用戶的體驗將會受到很大的影響。比如,,無法操作,,這是最尷尬的。
1,這里如果UpdateWindow(hwnd)被注釋掉的情況下,單機左鍵后,客戶區(qū)屏幕打印出左鍵被單機咯,單機右鍵后打印出右鍵被單機咯。隨后,調(diào)用了InvalidateRect()發(fā)送了WM_PAINT和WM_ERASEBKGND消息到消息隊列,因為Invalidate第三個參數(shù)是true所以背景被重畫,并且使rect的矩形范圍失效。從而延遲1000ms后,處理WM_PAINT消息后,窗口上的左鍵…右鍵…..的字樣都被清除。
2,如果UpdateWindow(hwnd) 沒被注釋掉。左鍵單機,右鍵單機,出現(xiàn)兩條提示后,立即都消失(一般情況看不到右鍵點擊的提示,而是直接擦除左鍵點擊的提示的效果),為什么呢,因為UpdateWindow的作用,直接繞過隊列,帶到WndProc中去。所以直接重繪了。
3.如果InvalidateRect里面是false則結果將是沒有任何效果。難道真的是沒有效果嗎。當然不是,實際上是有效果的。因為,這里InvalidateRect還是使得rect的區(qū)域失效了,只是不會擦除背景也就是原來打印在屏幕上的提示都不會被清除。而且還是發(fā)送了WM_PAINT消息,所以WM_PINT消息內(nèi)的處理,會執(zhí)行一次。
4.第三種情況,不就是使得區(qū)域無效,而且發(fā)送了WM_PAINT消息嗎。實際上,就算不發(fā)送WM_PAINT消息,系統(tǒng)也會派送WM_PAINT消息。因為無效了。我又想到UpdateWindow不也是給WndPro帶來了WM_PAINT消息嗎?窗口不會重繪嗎?答案是不會。因為窗口沒有無效的區(qū)域,所以WM_PAINT內(nèi)部的代碼也沒有執(zhí)行。(為什么沒有執(zhí)行,原因是UpdateWindow內(nèi)部檢測了是否有無效區(qū)域,如果沒有則不發(fā)送消息)。
到此這篇關于C++ Invalidaterect()函數(shù)作用案例詳解的文章就介紹到這了,更多相關C++ Invalidaterect()函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用Qt的QChartView實現(xiàn)縮放和放大功能
QCustomPlot是一個小型的Qt畫圖標類,支持繪制靜態(tài)曲線、動態(tài)曲線、多重坐標曲線,柱狀圖,蠟燭圖,這篇文章主要介紹了Qt的QChartView實現(xiàn)縮放和放大功能,需要的朋友可以參考下2022-09-09dev-c++創(chuàng)建lib(靜態(tài)鏈接庫)文件的實現(xiàn)步驟
本文主要介紹了dev-c++創(chuàng)建lib(靜態(tài)鏈接庫)文件的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06