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

时间:2010-08-11 22:48:34

标签: c++ api winapi

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

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

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

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

任何帮助?

3 个答案:

答案 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将使用窗口类中的颜色擦除客户区。但是你可以直接处理消息,绘制你喜欢的任何颜色(或背景图案)。