How to set background color of window after I have registered it?

56,584

Solution 1

From Window Background comes:

...The system paints the background for a window or gives the window the opportunity to do so by sending it a WM_ERASEBKGND message when the application calls BeginPaint. If an application does not process the message but passes it to DefWindowProc, the system erases the background by filling it with the pattern in the background brush specified by the window's class.....

...... An application can process the WM_ERASEBKGND message even though a class background brush is defined. This is typical in applications that enable the user to change the window background color or pattern for a specified window without affecting other windows in the class. In such cases, the application must not pass the message to DefWindowProc. .....

So, use the WM_ERASEBKGND message's wParam to get the DC and paint the background.

Solution 2

You may try the following:

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

Solution 3

Short answer: Handle WM_ERASEBKGND.

Longer answer:

When you register the WNDCLASS, you're providing information about all windows of that class. So if you want to change the color of just one instance of the window, you'll need to handle it yourself.

When it's time to repaint your window, the system will send your wndproc a WM_ERASEBKGND message. If you don't handle it, the DefWindowProc will erase the client area with the color from the window class. But you can handle the message directly, painting whatever color (or background pattern) you like.

Share:
56,584
Kaije
Author by

Kaije

Updated on July 19, 2022

Comments

  • Kaije
    Kaije almost 2 years

    I am not using a dialog, I'm using my own custom class which I have registered and then used the CreateWindow call to create it, I have preset the background color to red when registering:

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

    But now I want to change the background color at runtime, by e.g. clicking a button to change it to blue.

    I have tried to use SetBkColor() call in the WM_PAINT, and tried returning a brush from the WM_CTLCOLORDLG message, they don't work.

    Any help?