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

问题描述 投票:0回答:4

我没有使用对话框,我使用的是我自己注册的自定义类,然后使用

CreateWindow
调用来创建它,我在注册时将背景颜色预设为红色:

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

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

我尝试在

SetBkColor()
中使用
WM_PAINT
调用,并尝试从
WM_CTLCOLORDLG
消息中返回画笔,但它们不起作用。

有什么帮助吗?

c++ api winapi
4个回答
27
投票

来自窗口背景来自:

...系统绘制背景 窗口或给窗口 有机会通过向其发送 WM_ERASEBKGND 消息时 应用程序调用 BeginPaint。如果 应用程序不处理 消息但将其传递给 DefWindowProc,系统擦除 背景通过填充 背景画笔中的图案 由窗口的类指定......

......应用程序可以处理 WM_ERASEBKGND 消息,即使 定义了类背景画笔。 这在以下应用中是典型的: 使用户能够更改窗口 背景颜色或图案 指定窗口而不影响 班级中的其他窗口。在这样的 情况下,申请不得通过 发送给 DefWindowProc 的消息。 ......

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


17
投票

您可以尝试以下方法:

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

5
投票

简短回答:处理

WM_ERASEBKGND

更长的答案:

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

当需要重新绘制窗口时,系统将向您的 wndproc 发送一条

WM_ERASEBKGND
消息。如果你不处理它,
DefWindowProc
将会用窗口类中的颜色擦除客户区。但您可以直接处理该消息,绘制您喜欢的任何颜色(或背景图案)。


0
投票

刚刚使用C++启动了Windows应用程序。我的意思是大约5分钟前。有人可以解释一下吗?

© www.soinside.com 2019 - 2024. All rights reserved.