《windows程序设计第5版》第5章第一个例子——SINEWAVE.c的WndProc的代码如下:
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static int cxClient, cyClient;
HDC hdc;
int i;
PAINTSTRUCT ps;
POINT apt[NUM];
switch (message)
{
case WM_SIZE:
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
return 0;
case WM_PAINT:
hdc = BeginPaint(hwnd, &ps);
MoveToEx(hdc, 0, cyClient / 2, NULL);
LineTo(hdc, cxClient, cyClient / 2);
for (i = 0; i < NUM; i++)
{
apt[i].x = i * cxClient / NUM;
apt[i].y = (int)(cyClient / 2 * (1 - sin(TWOPI * i / NUM)));
}
Polyline(hdc, apt, NUM);
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}按书上的程序,正弦曲线并没有显示,只有调整窗口大小后才会出现。为什么?因为在WinApi中的代码:
ShowWindow(hwnd, iCmdShow) UpdateWindow(hwnd)
会先产生WM_PAINT消息,然后才会产生WM_SIZE,而书中WM_PAINT的处理中,cxClient和cyClient都是0,也就不会看到绘制的任何内容。
要解决此问题,添加处理WM_CREATE的内容即可:
case WM_CREATE:
{
RECT rect;
GetClientRect(hwnd, &rect);
cxClient = rect.right;
cyClient = rect.bottom;
return 0;
}