我正在使用带有OnCtrlcolor
事件的标签:
我已经将标签的背景颜色设置为与表单相同,
if (iD == IDCmylabel)
{
pDC->SetTextColor(blue);
COLORREF normal = RGB(245, 245, 245);
pDC->SetBkColor(normal);
return (HBRUSH)GetStockObject(NULL_BRUSH);
}
所以我想用toogle:
SetWindowTextW("abc..."); // will show the color as expected.
SetWindowTextW(nullptr); // will remove the text color.
然而,这对我不起作用(标题没有重新绘制,因为它仍然存在(。
我该如何解决这个问题?
NULL_BRUSH
是一种画笔,用于指示系统将使用该画笔的任何绘制操作变成非操作。使用它实际上并不能使控件透明。它只是看起来是透明的,直到(它的一部分(被画好。
若您想要一个具有特定背景颜色的控件,不管显示的文本大小如何,都必须提供一个纯色画笔。
最简单的方法是返回DC_BRUSH
,并附带调用SetDCBrushColor
来请求颜色,即
if (iD == IDCmylabel) {
pDC->SetTextColor(blue);
COLORREF normal = RGB(245, 245, 245);
// Still required so that the text background matches that of the rest
pDC->SetBkColor(normal);
// Request brush color for the control background
pDC->SetDCBrushColor(normal);
// Note: Stock objects do not need to be freed by client code
return (HBRUSH)GetStockObject(DC_BRUSH);
}
有了它,您可以使用任意参数调用SetWindowText
,并获得您想要的结果。
有人需要擦除旧文本下的背景。
您正在返回NULL_BRUSH
,因此";擦除背景";什么也不做。
返回颜色为RGB(245, 245, 245)
的实心笔刷。设置新文本后,您可能还需要为该窗口调用Invalidate
。