我不知道如何处理用于为静态文本背景着色的画笔。
最初,一切看起来都不错,因为应该是:
但是,在多次重绘静态变量之后,它们将更改为:
我还注意到,这取决于我是在每种情况下直接返回相同的笔刷(用于调试),还是在不同的情况下使用实际的代码(第一次重画后使用灰色框)。
我的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/