如何在注册窗口后设置窗口的背景颜色?

29

我没有使用对话框,我正在使用我自己的自定义类,我已经注册了它并使用了CreateWindow调用来创建它,我在注册时预设了背景颜色为红色:

WNDCLASSEX wc;
wc.hbrBackground = CreateSolidBrush(RGB(255, 0, 0));

但现在我想在运行时更改背景颜色,例如通过点击按钮将其更改为蓝色。

我尝试在WM_PAINT中使用SetBkColor()调用,并尝试从WM_CTLCOLORDLG消息返回一个画刷,它们都不起作用。

有任何帮助吗?

3个回答

27

来自窗口背景

...当应用程序调用BeginPaint时,系统会为窗口绘制背景或通过发送WM_ERASEBKGND消息给窗口提供绘制背景的机会。如果应用程序未处理该消息而将其传递给DefWindowProc,则系统将使用窗口类别中指定的背景画刷填充并擦除背景。......

......即使定义了类别背景画刷,应用程序也可以处理WM_ERASEBKGND消息。这在启用用户更改特定窗口的背景颜色或图案而不影响类别中的其他窗口的应用程序中很常见。在这种情况下,应用程序不能将消息传递给DefWindowProc。

因此,使用WM_ERASEBKGND消息的wParam获取DC并绘制背景。


2
没错,它起作用了。我处理了这个消息并使用FillRect()调用来绘制我的背景。 - Kaije
2
我对Windows C++有点陌生。这里的“DC”是什么意思? - Alexander Ryan Baggett
1
DC = 设备上下文 https://msdn.microsoft.com/zh-cn/library/windows/desktop/dd183554(v=vs.85).aspx - Zabba

17

您可以尝试以下方法:

HBRUSH brush = CreateSolidBrush(RGB(0, 0, 255));
SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG_PTR)brush);

这会改变该类的所有实例。您还需要使窗口无效以引起擦除和重绘。 - Adrian McCarthy
是的,这个方法可行,但我有自己的类包装器,而我想在注册后设置它的原因是我希望来自同一类的窗口具有不同的背景颜色。 - Kaije

5

简短回答:处理WM_ERASEBKGND

更详细的回答:

当您注册WNDCLASS时,您提供了有关该类所有窗口的信息。因此,如果您想更改窗口的一个实例的颜色,您需要自己处理它。

当需要重新绘制您的窗口时,系统会向您的wndproc发送WM_ERASEBKGND消息。如果您不处理它,DefWindowProc将使用窗口类中的颜色擦除客户区域。但是,您可以直接处理该消息,绘制任何颜色(或背景图案)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接