我在我們龐大的應用軟件中發現了GDI泄漏。GDI資源泄漏
下面是一個簡單的程序來測試這個問題。 想法是主對話框打開另一個對話框(對話框A)。 如果對話框A包含CStatic控件的位圖函數,則它將創建GDI泄漏。
即使當我使用「DeleteObject(位圖)」。
我做錯了什麼? 你有什麼想法嗎?
謝謝。
// Resource File
...
DIALOG_BOXA DIALOGEX 0, 0, 219, 142
STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_BORDER
EXSTYLE WS_EX_STATICEDGE
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "OK",IDOK,46,121,50,14
PUSHBUTTON "Cancel",IDCANCEL,119,121,50,14
CONTROL 131,RED_LIGHT0,"Static",SS_BITMAP,7,17,80,37
PUSHBUTTON "",RED_LIGHT1,7,60,80,37,BS_BITMAP | NOT WS_TABSTOP
END
// head file
DialogBoxA: public CDialog
{
...
CStatic m_static;
CButton m_button ;
...
}
/////////////////////////////////////////////////////////
void DialogBoxA::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, RED_LIGHT0, m_static);
DDX_Control(pDX, RED_LIGHT1, m_button);
}
BOOL DialogBoxA::OnInitDialog()
{
CDialog::OnInitDialog();
HBITMAP bitmap ;
// This will create GDI leak !!!
bitmap = LoadBitmap (AfxGetApp()->m_hInstance,BEACON_BIG_RED_ON) ;
m_static.SetBitmap (bitmap);
DeleteObject(bitmap);
// This is OK !!!
bitmap = LoadBitmap (AfxGetApp()->m_hInstance,BEACON_BIG_RED_ON) ;
m_button.SetBitmap (bitmap);
DeleteObject(bitmap);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
您是如何建立泄漏的? – noelicus
此外,MSDN指出你應該使用LoadImage而不是LoadBitmap ......你有沒有試過改變它? – noelicus
謝謝你的回覆。是的,我使用「GDIView」和「Windows任務管理器」來監視這個,我發現打開「DialogBoxA」後增加了「GDI對象」。 – ybc45