我不知道如何处理用于为静态文本背景着色的画笔。
最初,一切看起来都不错,因为应该是:



但是,在多次重绘静态变量之后,它们将更改为:



我还注意到,这取决于我是在每种情况下直接返回相同的笔刷(用于调试),还是在不同的情况下使用实际的代码(第一次重画后使用灰色框)。

我的WM_CTLCOLORSTATIC消息处理如下所示:

case WM_CTLCOLORSTATIC:
    {
        HDC hdcStatic = (HDC) wParam;
        SetTextColor(hdcStatic, RGB(0,0,0));
        HBRUSH hbrDefault = CreateSolidBrush(RGB(255,255,255));
        return (INT_PTR)hbrDefault;


(简化调试)

我猜想这与在使用DeleteObject()之后释放笔刷有关,但是当我需要返回笔刷但要在离开函数之前删除它们时,该怎么办呢?
MSDN资源没有帮助:WM_CTLCOLORSTATIC

编辑:我发现了我的错误。

我将笔刷声明为这样的全局变量:

HBRUSH hbrBkFoodCat[FOODCAT_LENGTH];
HBRUSH hbrDefault;


但是后来我在启动时像这样初始化了它们:

for(int i=0;i<FOODCAT_LENGTH;i++) {
    hbrBkFoodCat[i] = CreateSolidBrush(foodCatClr[i]);
}
HBRUSH hbrDefault = CreateSolidBrush(RGB(255,255,255));


如您所见,我不小心再次声明了hbrDefault,但这一次是作为局部变量,因此在消息处理中,我得到了那个灰色框(NULL笔刷)。
我尝试过的(我知道的愚蠢想法)是在消息处理时初始化它们。由于我只是将该初始化复制粘贴到处理中,因此它再次成为局部变量,但这一次它在返回范围内。这使我认为释放画笔有问题,因为在获得灰色背景之前必须多次重绘(尽管仍然没有得到)。

无论如何,谢谢大家的帮助!

最佳答案

每次处理WM_CTLCOLORSTATIC消息时,请勿创建新画笔。那是资源泄漏。一次创建画笔,一次是在您第一次创建静态文本控件时,就是在第一次向您发送WM_CTLCOLORSTATIC时。继续为每个WM_CTLCOLORSTATIC消息返回相同的画笔:

HBRUSH hbrStaticBkg = NULL;

...

case WM_CTLCOLORSTATIC:
{
    HDC hdc = (HDC) wParam;
    SetTextColor(hdc, RGB(...));
    if (!hbrStaticBkg) hbrStaticBkg = CreateSolidBrush(RGB(...));
    return (LRESULT) hbrStaticBkg;
}


仅在销毁静态文本控件之后销毁画笔。

DestroyWindow(hwndStatic);
if (hbrStaticBkg) {
    DeleteObject(hbrStaticBkg);
    hbrStaticBkg = NULL;
}


如果要在静态文本控件的生存期内更改背景颜色,请销毁画笔并使该控件无效以触发重新绘制,然后在需要时创建新的画笔。

COLOREREF clrStaticText = RGB(0,0,0);
COLORREF clrStaticBkg = RGB(255,255,255);
HBRUSH hbrStaticBkg = NULL;

...

case WM_CTLCOLORSTATIC:
{
    HDC hdc = (HDC) wParam;
    SetTextColor(hdc, clrStaticText);
    if (!hbrStaticBkg) hbrStaticBkg = CreateSolidBrush(clrStaticBkg);
    return (LRESULT) hbrStaticBkg;
}

...

clrStaticText = RGB(...);
clrStaticBkg = RGB(...);
if (hbrStaticBkg) {
    DeleteObject(hbrStaticBkg);
    hbrStaticBkg = NULL;
}
InvalidateRect(hwndStatic, NULL, TRUE);

关于c - WinAPI管理笔刷,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39301373/

10-11 00:57