WM_CTLCOLORSTATIC 但如何释放hdc

问题描述 投票:0回答:1

我按照 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 )
,它不会按我预期的方式工作,但我不会出现资源泄漏。 如果有的话,我无法遵循逻辑。任何建议或帮助将不胜感激。

c++ winapi
1个回答
0
投票

当您使用

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;
© www.soinside.com 2019 - 2024. All rights reserved.