I'm reading Charles Petzold's "Programming Windows" and I think I didn't fully understand the term of erasing / (in)validating / painting a window.
At the bottom of the post, you'll find the example code from the book.
Now, if I understood correctly, the window is being created by CreateWindow. This function reserves memory space for the window and sends the first WM_CREATE message to windows procedure. Next, ShowWindow sends the first WM_ERASEBKGND and WM_SIZE messages. Finally, WM_PAINT from UpdateWindow paints the window.
Now, the window procedure is (through the message loop) ready to receive additional messages (input from user).
Now, my questions:
1) As you can see, in this example, window procedure can only process WM_CREATE, WM_PAINT and WM_DESTROY messages, while other messages are processed by DefWindowProc. What does this function exactly do? Invalidates/repaints the whole client area?
2) During WM_PAINT, BeginPaint paints the client area. Does this function paint the whole client area (always) or can it paint only part of it (after uncovering a hidden window part)? What erases the client area before painting?
Code:
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
static TCHAR szAppName[]=TEXT("HelloWin");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.style=CS_HREDRAW | CS_VREDRAW;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon=LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor=LoadCursor(NULL, IDC_ARROW);
wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndclass.lpszMenuName=NULL;
wndclass.lpszClassName=szAppName;
if (!RegisterClass(&wndclass)) {
MessageBox(NULL, TEXT("This program requires Windows NT!"), szAppName, MB_ICONERROR);
return 0;
}
hwnd=CreateWindow(szAppName, TEXT("The Hello Program"), WS_CAPTION, 0, 0, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, iCmdShow);
UpdateWindow(hwnd);
while(GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
HDC hdc;
PAINTSTRUCT ps;
RECT rect;
switch(message) {
case WM_CREATE: return 0;
case WM_PAINT:
hdc=BeginPaint(hwnd, &ps);
GetClientRect(hwnd, &rect);
DrawText(hdc, TEXT("Hello, Windows 98!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_CENTER);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}