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