C++ Invalidaterect()函數(shù)作用案例詳解
函數(shù)原型:
BOOLInvalidateRect( 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消息從而擦除原來(lái)的背景 );
這個(gè)函數(shù)的作用是,使得Client的一個(gè)矩形區(qū)域變得無(wú)效,rect結(jié)構(gòu)體可以自己編輯,也可以使用GetClientRcet()來(lái)填充(這里的矩形大小Client的大?。钪饕氖堑谌齻€(gè)參數(shù),第三個(gè)參數(shù)決定了是否發(fā)送WM_ERASEBKGND消息,從而決定了是否擦除Client原有的圖形。當(dāng)然InvalidateRect發(fā)送WM_PAINT的形式是一種POST形式(即發(fā)送到程序消息隊(duì)列),而不是像SendMessage一樣直接讓操作系統(tǒng)帶著消息,調(diào)用WndProc。
當(dāng)然如果想像SendMessage一樣的??梢栽诤竺娼又褂肬pdateWindow()直接繞過(guò)程序消息隊(duì)列直接發(fā)送消息到WndProc函數(shù),來(lái)重繪窗口。
分析一下下面的程序會(huì)更加的清晰:
case WM_RBUTTONDOWN: hdc = GetDC(hwnd); GetClientRect(hwnd, &rect); DrawText(hdc, TEXT("右鍵鍵被單機(jī)咯!"), 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("左鍵被單機(jī)咯!"), 13, &rect, DT_CENTER | DT_SINGLELINE); ReleaseDC(hwnd, hdc); return 0;
這里為了能看到效果我使用了Sleep。在實(shí)際編程處理消息,不是在多線程時(shí),這樣的使用是十分愚蠢的,因?yàn)?,消息循環(huán)的機(jī)制,如果你不快速的處理每一條消息。用戶的體驗(yàn)將會(huì)受到很大的影響。比如,,無(wú)法操作,,這是最尷尬的。
1,這里如果UpdateWindow(hwnd)被注釋掉的情況下,單機(jī)左鍵后,客戶區(qū)屏幕打印出左鍵被單機(jī)咯,單機(jī)右鍵后打印出右鍵被單機(jī)咯。隨后,調(diào)用了InvalidateRect()發(fā)送了WM_PAINT和WM_ERASEBKGND消息到消息隊(duì)列,因?yàn)镮nvalidate第三個(gè)參數(shù)是true所以背景被重畫(huà),并且使rect的矩形范圍失效。從而延遲1000ms后,處理WM_PAINT消息后,窗口上的左鍵…右鍵…..的字樣都被清除。
2,如果UpdateWindow(hwnd) 沒(méi)被注釋掉。左鍵單機(jī),右鍵單機(jī),出現(xiàn)兩條提示后,立即都消失(一般情況看不到右鍵點(diǎn)擊的提示,而是直接擦除左鍵點(diǎn)擊的提示的效果),為什么呢,因?yàn)閁pdateWindow的作用,直接繞過(guò)隊(duì)列,帶到WndProc中去。所以直接重繪了。
3.如果InvalidateRect里面是false則結(jié)果將是沒(méi)有任何效果。難道真的是沒(méi)有效果嗎。當(dāng)然不是,實(shí)際上是有效果的。因?yàn)?,這里InvalidateRect還是使得rect的區(qū)域失效了,只是不會(huì)擦除背景也就是原來(lái)打印在屏幕上的提示都不會(huì)被清除。而且還是發(fā)送了WM_PAINT消息,所以WM_PINT消息內(nèi)的處理,會(huì)執(zhí)行一次。
4.第三種情況,不就是使得區(qū)域無(wú)效,而且發(fā)送了WM_PAINT消息嗎。實(shí)際上,就算不發(fā)送WM_PAINT消息,系統(tǒng)也會(huì)派送WM_PAINT消息。因?yàn)闊o(wú)效了。我又想到UpdateWindow不也是給WndPro帶來(lái)了WM_PAINT消息嗎?窗口不會(huì)重繪嗎?答案是不會(huì)。因?yàn)榇翱跊](méi)有無(wú)效的區(qū)域,所以WM_PAINT內(nèi)部的代碼也沒(méi)有執(zhí)行。(為什么沒(méi)有執(zhí)行,原因是UpdateWindow內(nèi)部檢測(cè)了是否有無(wú)效區(qū)域,如果沒(méi)有則不發(fā)送消息)。
到此這篇關(guān)于C++ Invalidaterect()函數(shù)作用案例詳解的文章就介紹到這了,更多相關(guān)C++ Invalidaterect()函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Qt的QChartView實(shí)現(xiàn)縮放和放大功能
QCustomPlot是一個(gè)小型的Qt畫(huà)圖標(biāo)類,支持繪制靜態(tài)曲線、動(dòng)態(tài)曲線、多重坐標(biāo)曲線,柱狀圖,蠟燭圖,這篇文章主要介紹了Qt的QChartView實(shí)現(xiàn)縮放和放大功能,需要的朋友可以參考下2022-09-09C語(yǔ)言模擬實(shí)現(xiàn)字符串庫(kù)函數(shù)的示例講解
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言模擬實(shí)現(xiàn)字符串庫(kù)函數(shù)的具體方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01C++使用標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)事件和委托以及信號(hào)和槽機(jī)制
這篇文章主要為大家詳細(xì)介紹了C++如何使用標(biāo)準(zhǔn)庫(kù)實(shí)現(xiàn)事件和委托以及信號(hào)和槽機(jī)制,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-11-11C語(yǔ)言面試常見(jiàn)考點(diǎn)排序總結(jié)
深處開(kāi)發(fā)崗,其實(shí)排序也是繞不開(kāi)的環(huán)節(jié),其中冒泡排序,選擇排序,插入排序,歸并排序,快速排序,堆排序也是我在秋招以來(lái)頻繁問(wèn)到的技術(shù)點(diǎn),今天我們來(lái)重點(diǎn)聊聊排序2021-11-11dev-c++創(chuàng)建lib(靜態(tài)鏈接庫(kù))文件的實(shí)現(xiàn)步驟
本文主要介紹了dev-c++創(chuàng)建lib(靜態(tài)鏈接庫(kù))文件的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06C語(yǔ)言動(dòng)態(tài)內(nèi)存函數(shù)詳解
這篇文章主要介紹了C語(yǔ)言動(dòng)態(tài)內(nèi)存函數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-09-09