国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

定位MFC程序GDI對象泄漏過程中的一些經驗

2019-11-14 11:40:20
字體:
來源:轉載
供稿:網友

定位MFC程序GDI對象泄漏過程中的一些經驗

之前接觸MFC比較少,最近一個程序需要使用MFC寫界面。寫完之后發現程序運行一段時間后異常卡頓,并且Win7系統任務欄圖標出現一些毛邊等異常情況。重新運行程序,打開任務管理器發現GDI對象不斷增加,且數量到達9999后程序開始異常。因此判斷程序可能存在GDI對象泄漏,即創建的GDI對象沒有及時釋放。 鑒于GDI對象不斷自動增加,判斷GDI泄漏可能位于定時器觸發的OnTimer函數中。OnTimer函數調用方法如下:

LRESULT CVServerView::OnChangeTime(WPARAM wParam, LPARAM lParam) { CString strText; FormatTime((INT)wParam, 30, strText); m_editPush.SetWindowText(strText); return 0; }

可以看出函數僅僅是調用了API函數SetWindowText,理論上不應該導致GDI泄漏。但奇怪的是注釋掉SetWindowText后程序就正常了。后來發現原因在于程序重寫了OnCtlColor函數。

HBRUSH CVServerView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){ HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: 在此更改 DC 的任何特性 if (pWnd->GetDlgCtrlID() == IDC_EDIT_PUSH) { pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(255, 255, 255)); return HBRUSH(CreateSolidBrush(RGB(56, 56, 56))); } // TODO: 如果默認的不是所需畫筆,則返回另一個畫筆 return hbr;}

SetWindowText函數會調用以上OnCtlColor函數。OnCtlColor中CreateSolidBrush創建了GDI對象沒有釋放導致GDI對象不斷增加,這就是問題所在。因此將程序修改為創建一個全局畫筆m_brushBack=CreateSolidBrush(RGB(56, 56, 56)),OnDestroy時釋放掉。修改代碼如下:

HBRUSH CVServerView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor){ HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: 在此更改 DC 的任何特性 if (pWnd->GetDlgCtrlID() == IDC_EDIT_PUSH) { pDC->SetBkMode(TRANSPARENT); pDC->SetTextColor(RGB(255, 255, 255)); return HBRUSH(m_brushBack); } // TODO: 如果默認的不是所需畫筆,則返回另一個畫筆 return hbr;}

回頭再看,問題很簡單并且出現在細節地方,主要原因在于自己對GDI對象管理了解太少,隨意創建GDI對象不及時釋放。以此提醒自己需要牢記GDI對象創建及釋放問題。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汉源县| 藁城市| 门源| 九龙县| 平谷区| 聂拉木县| 神池县| 遂平县| 龙胜| 磐石市| 杨浦区| 内黄县| 海安县| 富锦市| 广丰县| 政和县| 定襄县| 老河口市| 孝感市| 庄河市| 绥阳县| 缙云县| 洛隆县| 东明县| 维西| 盘锦市| 荃湾区| 永济市| 敖汉旗| 扶沟县| 陇川县| 乃东县| 夹江县| 腾冲县| 汝州市| 邳州市| 鲁山县| 石首市| 房产| 天柱县| 赣榆县|