我按照 Microsoft 的示例使用
WM_CTLCOLORSTATIC
但我很好奇如何使用DeleteObject
。
如果
DeleteObject
放置在 return 之后,那么它永远不会被使用。
然而在 Windows 文档中它说你必须DeleteObject
。它提到一个对话框被破坏,但这不适用于我这里的情况。
我正在尝试纠正几个静态文本框对象中的背景颜色。
case WM_CTLCOLORSTATIC:
{
hdc = ( HDC ) wParam;
if ( lParam == ( LPARAM ) *phwndTextBox )
{
SetTextColor ( hdc, 0x000000 );
SetBkColor ( hdc, 0xBEBEBE );
return ( LRESULT ) CreateSolidBrush ( 0xBEBEBE );
// Alternative return ( LRESULT ) GetStockObject ( LTGRAY_BRUSH );
}
if ( lParam == ( LPARAM ) *phwndinfoBox01 )
{
SetTextColor ( hdc, 0x000000 );
SetBkColor ( hdc, colorbkgnd01 );
return ( LRESULT ) CreateSolidBrush ( colorbkgnd01 );
// alternative return ( LRESULT ) GetStockObject ( WHITE_BRUSH );
}
} break;
代码正在子窗口的回调函数中运行,我似乎遇到了资源泄漏。我可以看到,每次调用
WM_CTLCOLORSTATIC
时,代码都会继续在此处创建画笔。除此之外,我得到了我正在寻找的结果。例如,如果我使用 GetStockObject ( WHITE_BRUSH )
,它不会按我预期的方式工作,但我不会出现资源泄漏。
如果有的话,我无法遵循逻辑。任何建议或帮助将不胜感激。
当您使用
CreateSolidBrush()
时,您就是 HBRUSH
的所有者,并且在使用完毕后必须释放它。 这甚至在 WM_CTLCOLORSTATIC
文档中也有说明:
如果应用程序返回它创建的画笔(例如,通过使用
或CreateSolidBrush
函数),应用程序必须释放该画笔。如果应用程序返回一个系统画笔(例如,由CreateBrushIndirect
或GetStockObject
函数检索的画笔),则应用程序不需要释放该画笔。GetSysColorBrush
因此,您需要保存您创建的画笔,以便以后可以释放它们,例如:
HBRUSH hBrushForTextBox, hBrushForInfoBox;
...
case WM_CREATE:
{
hBrushForTextBox = CreateSolidBrush ( 0xBEBEBE );
hBrushForInfoBox = CreateSolidBrush ( colorbkgnd01 );
break;
}
case WM_DESTROY:
{
DeleteObject( hBrushForTextBox );
DeleteObject( hBrushForInfoBox );
break;
}
case WM_CTLCOLORSTATIC:
{
...
if ( lParam == ( LPARAM ) *phwndTextBox )
{
...
return ( LRESULT ) hBrushForTextBox;
}
if ( lParam == ( LPARAM ) *phwndinfoBox01 )
{
...
return ( LRESULT ) hBrushForInfoBox;
}
} break;