CDialogEx::OnPaint()的问题,或者为什么在对话框程序的OnPaint中绘图无效的问题
這是一個基于對話框的程序,對話框上有按鈕,還有幾個CStatic用來繪圖,之前都是好好的,今天改成Unicode版本后,編譯正常,運行時CStatic中的圖像怎么也不顯示,有時候會閃現(xiàn)一次就消失,問題非常詭異。同樣的代碼,如果工程屬性中選回“使用多字節(jié)字符集”,則沒有問題;若再改成“使用Unicode字符集”,則問題重現(xiàn)。
研究了半天,發(fā)現(xiàn)網(wǎng)上相關(guān)的解釋一般都是說把OnPaint中的對基類的調(diào)用CDialogEx::OnPaint();這句注釋掉,或者放在自己的繪圖代碼后面,試了下并沒有效果。
基于MFC原理,OnPaint中是對無效區(qū)域進(jìn)行繪圖處理的,基類的CDialogEx::OnPaint()調(diào)用之后,所有的無效區(qū)域都不存在了,因此之后的任何繪圖代碼都不會反映在界面上。正因為如此,把自己的繪圖代碼放在CDialogEx::OnPaint()之前是有必要的,但前提是你應(yīng)該在CPaintDC dc(this)中繪制圖像,因為此時的無效區(qū)域就是它。
如果你繪圖的區(qū)域不在CPaintDC中,比如是在CStatic中,那么在繪圖之前,你必須先強(qiáng)制CStatic更新,即像下面代碼那樣處理
CStatic* pHeadPhoto = (CStatic*)GetDlgItem(IDC_STATIC_HEADPHOTO); pHeadPhoto->UpdateWindow();CDC* pDC = pHeadPhoto->GetDC(); // 以下是具體的繪圖代碼(略)
通過以上這些處理,你完全沒必要注釋掉CDialogEx::OnPaint()的調(diào)用,卻讓程序跑得更好。
(實際上一旦注釋掉CDialogEx::OnPaint(),界面的默認(rèn)處理就失效了,比如按鈕就不會及時刷新。)
轉(zhuǎn)載于:https://www.cnblogs.com/cner/p/6928690.html
總結(jié)
以上是生活随笔為你收集整理的CDialogEx::OnPaint()的问题,或者为什么在对话框程序的OnPaint中绘图无效的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Golang入门教程(二)Ubuntu1
- 下一篇: docker安装问题:E: Packag