How to set background color of window after I have registered it?
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.
Kaije
Updated on July 19, 2022Comments
-
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 theWM_PAINT
, and tried returning a brush from theWM_CTLCOLORDLG
message, they don't work.Any help?