我没有使用对话框,我使用的是我自己注册的自定义类,然后使用
CreateWindow
调用来创建它,我在注册时将背景颜色预设为红色:
WNDCLASSEX wc;
wc.hbrBackground = CreateSolidBrush(RGB(255, 0, 0));
但现在我想在运行时更改背景颜色,例如单击按钮将其更改为蓝色。
我尝试在
SetBkColor()
中使用 WM_PAINT
调用,并尝试从 WM_CTLCOLORDLG
消息中返回画笔,但它们不起作用。
有什么帮助吗?
来自窗口背景来自:
...系统绘制背景 窗口或给窗口 有机会通过向其发送 WM_ERASEBKGND 消息时 应用程序调用 BeginPaint。如果 应用程序不处理 消息但将其传递给 DefWindowProc,系统擦除 背景通过填充 背景画笔中的图案 由窗口的类指定......
......应用程序可以处理 WM_ERASEBKGND 消息,即使 定义了类背景画笔。 这在以下应用中是典型的: 使用户能够更改窗口 背景颜色或图案 指定窗口而不影响 班级中的其他窗口。在这样的 情况下,申请不得通过 发送给 DefWindowProc 的消息。 ......
因此,使用 WM_ERASEBKGND 消息的 wParam 来获取 DC 并绘制背景。
您可以尝试以下方法:
HBRUSH brush = CreateSolidBrush(RGB(0, 0, 255));
SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG_PTR)brush);
简短回答:处理
WM_ERASEBKGND
。
更长的答案:
当您注册 WNDCLASS 时,您将提供有关该类的所有窗口的信息。因此,如果您只想更改窗口的一个实例的颜色,则需要自己处理。
当需要重新绘制窗口时,系统将向您的 wndproc 发送一条
WM_ERASEBKGND
消息。如果你不处理它,DefWindowProc
将会用窗口类中的颜色擦除客户区。但您可以直接处理该消息,绘制您喜欢的任何颜色(或背景图案)。
我刚刚使用C++启动了Windows应用程序。我的意思是大约5分钟前。有人可以解释一下吗?