溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MFC OnPaint被不斷調(diào)用的問(wèn)題

發(fā)布時(shí)間:2020-07-23 16:16:12 來(lái)源:網(wǎng)絡(luò) 閱讀:3716 作者:llf_17 欄目:編程語(yǔ)言

本人最近在開(kāi)發(fā)一個(gè)繪圖程序,需用到OnPaint。雖說(shuō)MFC也用了比較久了,但對(duì)OnPaint還是理解不深。在OnPaint中我把 CPaintDC dc(this); 注釋掉了。然后自己手動(dòng)獲取 CDC 進(jìn)行操作。導(dǎo)致OnPaint被不斷的調(diào)用。導(dǎo)致這個(gè)問(wèn)題的原因就是不應(yīng)該把 CPaintDC dc(this); 注釋掉。要使用它。

因?yàn)镃PaintDC dc(this); 的構(gòu)造,析構(gòu)里調(diào)用了CWnd::BeginPaint、CWnd::EndPaint 。具體如下:

CPaintDC的獨(dú)到之處就在于,它在構(gòu)造函數(shù)中調(diào)用了 CWnd::BeginPaint在析構(gòu)時(shí)調(diào)用了CWnd::EndPaint,而且它只能響應(yīng)WM_ONPAINT消息。而這個(gè)BeginPaint會(huì) 發(fā)送WM_ONERASEBKGND消息,因此,它只擦除指定的背景并重畫(huà),不影響對(duì)話框內(nèi)的其他控件。值得注意的是,在這操作之后不要再調(diào)用 CDialog::Onpaint函數(shù)。


而之前的方法之所以不成功是因?yàn)椋?/span>

BeginPaint() 和EndPaint() 可以刪除消息隊(duì)列中的WM_PAINT消息,并使無(wú)效區(qū)域有效。
GetDC()和ReleaseDC()并不刪除也不能使無(wú)效區(qū)域有效,因此當(dāng)程序跳出 WM_PAINT 時(shí) ,無(wú)效區(qū)域仍然存在。系統(tǒng)就回不斷發(fā)送WM_PAINT消息,于是程序不斷處理WM_PAINT消息。其中無(wú)效區(qū)域是指需要重畫(huà)的區(qū)域,無(wú)效的意思是:當(dāng)前內(nèi)容是舊的,過(guò)時(shí)的。

只 有當(dāng)一個(gè)窗口消息空閑時(shí),系統(tǒng)才會(huì)抽空檢查一下這個(gè)窗口的無(wú)效區(qū)域是否為非空(WM_PAINT的優(yōu)先級(jí)是最低的。這也就是為什么系統(tǒng)很忙時(shí)窗口和桌面往 往會(huì)出現(xiàn)變白、刷新不了、留拖拽痕跡等現(xiàn)象的原因),如果非空,系統(tǒng)就發(fā)送WM_PAINT。所以一定要用BeginPaint、EndPaint把無(wú)效 區(qū)域設(shè)為空,否則WM_PAINT將一直被發(fā)送。


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI