windows刷新客户区的有关问题

windows刷新客户区的问题
C/C++ code

#include <windows.h>
#define DIVISIONS 5
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR  szCmdLine, int iCmdShow)
{
    static TCHAR      szAppName[] = TEXT ("Checker1") ;
    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 ("Program requires Windows NT!"),
                        szAppName, MB_ICONERROR) ;
        return 0 ;
    }
    hwnd = CreateWindow (szAppName, TEXT ("Checker1 Mouse Hit-TestDemo"),
                         WS_OVERLAPPEDWINDOW,
                         CW_USEDEFAULT, CW_USEDEFAULT,
                         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)
{
    static BOOL          fState[DIVISIONS][DIVISIONS] ;
    static int            cxBlock, cyBlock ,nHit ;
    static  char        szBuffer[59];
    HDC                    hdc ;
    int                     x, y ;
    static int             nx,ny;
    PAINTSTRUCT           ps ;
    RECT                   rect ;

    switch (message)
    {
    case   WM_SIZE :
        cxBlock = LOWORD (lParam) / DIVISIONS ;
        cyBlock = HIWORD (lParam) / DIVISIONS ;
        return 0 ;

    case WM_LBUTTONDOWN :
         x = LOWORD (lParam) / cxBlock ;
        y = HIWORD (lParam)  / cyBlock ;

        if (nx==x&&ny==y)
        {
            nHit++;
            hdc=BeginPaint(hwnd,&ps);
            TextOut(hdc,10,10,szBuffer,wsprintf(szBuffer,"hit is :%d",nHit));
            EndPaint(hwnd,&ps);
            InvalidateRect (hwnd, &rect, FALSE) ;
        }
        else
        {
            InvalidateRect (hwnd, &rect, FALSE) ;
        }

        return 0 ;

    case   WM_PAINT :
        hdc = BeginPaint (hwnd, &ps) ;

        for (x = 0 ; x < DIVISIONS ; x++)
            for (y = 0 ; y < DIVISIONS ; y++)
            {
                Rectangle (hdc, x * cxBlock, y * cyBlock, (x + 1) * cxBlock, (y + 1) * cyBlock) ;
            }
        TextOut(hdc,10,10,szBuffer,wsprintf(szBuffer,"hit is :%d",nHit));
        srand(time(0));
        nx=x=rand()%5;
        ny=y=rand()%5;
        fState[x][y]=1;
        if ( fState [x][y] )
                {
                    MoveToEx (hdc, x * cxBlock,  y * cyBlock, NULL) ;
                    LineTo(hdc, (x+1) * cxBlock, (y+1) * cyBlock) ;
                    MoveToEx (hdc, x * cxBlock, (y+1) * cyBlock, NULL) ;
                    LineTo (hdc, (x+1) * cxBlock, y  * cyBlock) ;
                }
        InvalidateRect (hwnd, NULL, FALSE) ;
        Sleep(500);
        fState[x][y]=0;
        EndPaint (hwnd,&ps);

        return 0 ;

    case   WM_DESTROY :
        PostQuitMessage (0) ;
        return 0 ;
    }
    return DefWindowProc (hwnd, message, wParam, lParam) ;
}