。。在一個子對話框的全屏界面多次重繪呼叫onpaint函式,結果不僅子對話框白屏,其他的對話框也出現白屏情況。跪求各位大神幫幫我。
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
不要直接呼叫OnPaint,OnPaint只能在WM_PAINT事件里呼叫uj5u.com熱心網友回復:
對話框白屏 ?一開始 白屏 不 ? 多久后 白屏 ?
uj5u.com熱心網友回復:
一開始不白屏,

這是全屏的對話框。我一直alt+tab 切換界面也會導致這種白屏的問題,一旦這個界面出現白屏,主界面也加載不出來了
uj5u.com熱心網友回復:
各種更新控制元件顯示的方法我都試過了,我剛做MFC兩個月,有些細節的地方不是很明白。。我整個工程中都習慣用redrawWindow來更新界面。還有另一個全屏的界面就沒問題,也不存在白屏的情況。uj5u.com熱心網友回復:
OnPaint 中 GDI 句柄泄漏 ?uj5u.com熱心網友回復:
void CMhsuper::OnPaint(){
CPaintDC dc(this); // device context for painting
// TODO: 在此處添加訊息處理程式代碼
// 不為繪圖訊息呼叫 CDialog::OnPaint()
// CDC* pdc = pwnd->GetDC();
float iWidth = GetSystemMetrics(SM_CXSCREEN);
float iHeight = GetSystemMetrics(SM_CYSCREEN);
float biwidht = iWidth / 1920;
float biheight = iHeight / 1080;
//CBrush hBrush = CreateSolidBrush(RGB(206, 217, 237));
CBrush brush2(RGB(206, 217, 237));
CRect rect(0, 80* biheight, 2000, 2000); //
dc.FillRect(&rect, &brush2);
CBrush brush3(RGB(130, 167, 209));
CRect rect2(0, 0, 2000, 80* biheight); //
dc.FillRect(&rect2, &brush3);
if (m_addzero == 1)
{
m_addzerobutton.LoadBitmaps(IDB_zidongjialingdown);
m_addzerobutton.SizeToContent();
}
else
{
m_addzerobutton.LoadBitmaps(IDB_zidongjialingup);
m_addzerobutton.SizeToContent();
}
if (sendflag == 0)
{
m_phonemodern.LoadBitmaps(IDB_allscrphonemodern);
m_phonemodern.SizeToContent();
}
else
{
m_phonemodern.LoadBitmaps(IDB_allscrguhuamodern);
m_phonemodern.SizeToContent();
}
m_nextpagetwo.LoadBitmaps(IDB_nextpageup, AFX_IDS_FONT_PPG);
m_nextpagetwo.SizeToContent();
m_lastpagetwo.LoadBitmaps(IDB_shangyiyeupup, IDB_shangyiyedown);
m_lastpagetwo.SizeToContent();
m_dianhuamodern.LoadBitmaps(IDB_guhuamoshi2up, IDB_guhuamoderndown);
m_dianhuamodern.SizeToContent();
m_add0modern.LoadBitmaps(IDB_guhuaadd0up, IDB_guhuaADD0odown);
m_add0modern.SizeToContent();
m_qunfa.LoadBitmaps(IDB_zaiciqunfaup, IDB_zaiciqunfadown);
m_qunfa.SizeToContent();
m_allmsg.LoadBitmaps(IDB_allmsgup, IDB_suoyouduanxindown);
m_allmsg.SizeToContent();
brush2.DeleteObject();
brush3.DeleteObject();
}
這是有問題的界面的onpaint函式
uj5u.com熱心網友回復:
1 所有 .LoadBitmaps 放 初始化中2 習慣用redrawWindow來更新界面 ,壞習慣 ! 用 Invalidate() !
uj5u.com熱心網友回復:
把 CPaintDC dc(this) 后面的代碼屏蔽了 還會出現白屏么?uj5u.com熱心網友回復:
m_addzerobutton.LoadBitmaps(IDB_zidongjialingdown);圖片加載放到初始化中。。。避免每次重繪都加載!!!
uj5u.com熱心網友回復:
檢查是否資源泄漏的辦法之一:在任務管理器 行程 查看 選擇列 里面選擇:記憶體使用、虛擬記憶體大小、句柄數、執行緒數、USER物件、GDI物件
讓你的程式(行程)不退出,回圈執行主流程很多遍,越多越好,比如1000000次甚至無限回圈,記錄以上各數值,再隔至少一小時,越長越好,比如一個月,再記錄以上各數值。如果以上兩組數值的差較大或隨時間流逝不斷增加,則鐵定有對應資源的資源泄漏!
搜“GDI泄露檢測”
uj5u.com熱心網友回復:
只留一個控制元件,其他全刪掉。再除錯看看uj5u.com熱心網友回復:
最后加上CDialogEx::OnPaint();試試uj5u.com熱心網友回復:
你可以看下onsize函式,因為你對話框不但變白而且布局也變了。還有除了redawwindow,估計其他地方用了另一種重繪。uj5u.com熱心網友回復:
應該是這個問題吧!你自己通過任務管理器“詳細資訊”中把"GDI物件“這一列顯示出來,如果達到9999就是問題了
uj5u.com熱心網友回復:
WM_ERASEBKEGNDuj5u.com熱心網友回復:
CPaintDC dc(this);這個dc需要釋放吧
uj5u.com熱心網友回復:
那么多LoadBitmaps ,但是沒看到在哪里釋放,應該是GDI一直在創建,未釋放。Windows程式一個行程中GDI上限好像是9999吧,到這這個數界面就沒法顯示了uj5u.com熱心網友回復:
檢查windowproc的回傳值。默認的訊息被屏蔽了嗎?uj5u.com熱心網友回復:
典型的GDI泄露問題,檢查一下各種畫界面的句柄有沒有釋放DeleteObject、ReleaseDC、DeleteDC
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/55952.html
標籤:界面
