Drawing a Custom Window Background

You can draw your own window background rather than having Windows draw it for you. Most applications specify a brush handle or system color value for the class background brush when registering the window class; Windows uses the brush or color to draw the background. If you set the class background brush to NULL, however, Windows sends a WM_ERASEBKGND message to your window procedure whenever the window background must be drawn, letting you draw a custom background.

In the following example, the window procedure draws a large checkerboard pattern that fits neatly in the window. The procedure fills the client area with a white brush and then draws thirteen 20-by-20 rectangles using a gray brush. The display DC to use when drawing the background is specified in the wParam parameter for the message.

HBRUSH hbrWhite, hbrGray;

.

.

.

case WM_CREATE:

hbrWhite = GetStockObject(WHITE_BRUSH);

hbrGray = GetStockObject(GRAY_BRUSH);

return 0L;

case WM_ERASEBKGND:

hdc = (HDC) wParam;

GetClientRect(hwnd, &rc);

SetMapMode(hdc, MM_ANISOTROPIC);

SetWindowExtEx(hdc, 100, 100, NULL);

SetViewportExtEx(hdc, rc.right, rc.bottom, NULL);

FillRect(hdc, &rc, hbrWhite);

for (i = 0; i < 13; i++) {

x = (i * 40) % 100;

y = ((i * 40) / 100) * 20;

SetRect(&rc, x, y, x + 20, y + 20);

FillRect(hdc, &rc, hbrGray);

}

return 1L;

If the application draws its own minimized window, Windows also sends the WM_ERASEBKGND message to the window procedure to draw the background for the minimized window. You can use the same technique used by WM_PAINT to determine whether the window is minimized ¾ that is, call the IsIconic function and check for the return value TRUE.