Windows程序设计SINEWARE.c的问题

浏览:812 发布日期:2023-01-23 22:27:03

《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的处理中,cxClientcyClient都是0,也就不会看到绘制的任何内容。

要解决此问题,添加处理WM_CREATE的内容即可:

case WM_CREATE:
    {
        RECT rect;
        GetClientRect(hwnd, &rect);
        cxClient = rect.right;
        cyClient = rect.bottom;

        return 0;
    }