用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句柄数量不再随时间增加。