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