用Sysinternals工具裏的process explorer監控發現 GDI Handles在不斷增加,大概是每秒增加2個。
檢查原書代碼:
case WM_TIMER:
{
// Èç¹û´°¿Ú´¦ÓÚ×îС»¯×´Ì¬¾ÍʲôҲ²»×ö
if(::IsIconic(hWnd)) // IsIconicº¯ÊýÓÃÀ´Åжϴ°¿ÚÊÇ·ñ´¦ÓÚ×îС»¯×´Ì¬
return 0;
// È¡µÃϵͳʱ¼ä
SYSTEMTIME time;
::GetLocalTime(&time);
// ½¨Á¢×ø±êϵ
HDC hdc = ::GetDC(hWnd);
SetIsotropic(hdc, s_cxClient, s_cyClient);
// ÒÔCOLOR_3DFACEΪ±³¾°É«¾Í¿ÉÒÔ²Á³ýÖ¸ÕëÁË£¨ÒòΪ´°¿ÚµÄ±³¾°É«Ò²ÊÇCOLOR_3DFACE£©
COLORREF crfColor = ::GetSysColor(COLOR_3DFACE);
// Èç¹û·ÖÖӸıäµÄ»°¾Í²Á³ýʱÕëºÍ·ÖÕë
if(time.wMinute != s_nPreMinute)
{
// ²Á³ýʱÕëºÍ·ÖÕë
DrawHand(hdc, 200, 8, s_nPreHour*30 + s_nPreMinute/2, crfColor);
DrawHand(hdc, 400, 6, s_nPreMinute*6, crfColor);
s_nPreHour = time.wHour;
s_nPreMinute = time.wMinute;
}
// Èç¹ûÃë¸Ä±äµÄ»°¾Í²Á³ýÃëÕ룬ȻºóÖØ»ËùÓÐÖ¸Õë
if(time.wSecond != s_nPreSecond)
{
// ²Á³ýÃëÕë
DrawHand(hdc, 400, 1, s_nPreSecond*6, crfColor);
// ÖØ»ËùÓÐÖ¸Õë
DrawHand(hdc, 400, 1, time.wSecond*6, RGB(0, 0, 0));
DrawHand(hdc, 200, 8, time.wHour*30 + time.wMinute/2, RGB(0, 0, 0));
DrawHand(hdc, 400, 6, time.wMinute*6, RGB(0, 0, 0));
s_nPreSecond = time.wSecond;
}
return 0;
}
發現
case WM_TIMER:
消息處理中在取得HDC使用完畢後沒有釋放DC句柄,需要在
return 0;
語句之前添加釋放hdc語句:
::ReleaseDC (hWnd, hdc);
Build後用Process Explorer再次檢查發現GDI句柄數量不再隨時間增加。