请教这段windows api 代码错哪了?小弟我为什么得不到预期的结果

请问这段windows api 代码哪里错了?我为什么得不到预期的结果?
我在写一段关于扫雷的程序,现在写到这里错误连连,晕死了。。。
可以运行,有窗口,有最初的绘画,但是当我点击了鼠标的左键后,屏幕上“最初的图案”消失了,本应该改变成“点击图案”的啊!!!!!
C/C++ code

//*****************************************************************//

#include"stdafx.h"
#include <windows.h>
#include <stdio.h>
#include"mineswepper.h"
 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
struct Block
 {
    bool ifOpened;  //if the block has been clicked
    bool ifMined;   //if the block contains a mine
    bool ifFlaged;  //if user has flgged the block as a mine
    int minesAround;
 };
 static Block blocks[20][20];

 static bool startFlag=false;

 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
   
   TCHAR szAppName[]=TEXT("Minesweeper");
   TCHAR szClassName[]=TEXT("MinesweeperClassName");
   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 =szClassName;
   RegisterClass(&wndclass);
   hwnd=CreateWindow(szClassName,TEXT("Mineswepper"), WS_OVERLAPPEDWINDOW &~ WS_SIZEBOX,CW_USEDEFAULT,CW_USEDEFAULT,
                 CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);

   ShowWindow(hwnd,nCmdShow);
   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)
{
   
   PAINTSTRUCT ps;
   RECT rect;
   HDC hdc , hdcMem;
   static HBITMAP hBitmap;
   BITMAP bm;
   static int bmX = 0;
   static int bmY = 0;
   static int mouseX;
   static int mouseY;
   static int row = 20;
   static int coloum = 20;


   switch (message) 
   {

       case WM_CREATE:
      {   
         for(int i=0;i<row;++i)
         {
            for(int l=0;l<coloum;++l)
            {
               blocks[i][l].ifMined=false;
               blocks[i][l].ifFlaged=false;
               blocks[i][l].ifOpened=false;
            }
         }
         hBitmap=(HBITMAP)LoadImage(NULL,TEXT("Blocks.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
         GetObject(hBitmap,sizeof(BITMAP),&bm);
         bmX=bm.bmWidth;
         bmY=bm.bmHeight;
         return 0;
      }



      case WM_PAINT:
      {
         if(!startFlag)
            {
                hdc=BeginPaint(hwnd,&ps);
                hdcMem=CreateCompatibleDC(hdc);
                SelectObject(hdcMem,hBitmap);
                
                   for(int i=0;i<coloum;++i)
                   {
                        for(int l=0;l<row;++l)
                        {
                             BitBlt(hdc,(i*bmX),(l*bmY),bmX,bmY,hdcMem,0,0,SRCCOPY);
                        }
                      }
                EndPaint(hwnd,&ps);
                startFlag=true;
                return 0;
            }

            for(int i=0;i<coloum;++i)
            {
                  for(int l=0;l<row;++l)
                 {
                     if(blocks[i][l].ifOpened)
                     {
                         hdc=BeginPaint(hwnd,&ps);
                         hdcMem=CreateCompatibleDC(hdc);
                         SelectObject(hdcMem,hBitmap);
                         hBitmap=(HBITMAP)LoadImage(NULL,TEXT("mineKEYDOWN.bmp"),IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
                         GetObject(hBitmap,sizeof(BITMAP),&bm);
                         bmX=bm.bmWidth;
                         bmY=bm.bmHeight;
                         BitBlt(hdc,(i*bmX),(l*bmY),bmX,bmY,hdcMem,0,0,SRCCOPY);
                         EndPaint(hwnd,&ps);
                     }
                 }
                 
             }
                return 0;
      }



      case WM_LBUTTONDOWN:
      {
         mouseX=LOWORD(lParam);
         mouseY=HIWORD(lParam);
         if( (mouseX<(coloum*bmX)) && (mouseY<(row*bmY)) )
         {
             int box_X = (mouseX/bmX)*bmX;
             int box_Y = (mouseY/bmY)*bmY;
              blocks[box_Y][box_X].ifOpened=true;
              InvalidateRect(hwnd,NULL,true);
         }
         return 0;
      }


      case WM_DESTROY:
         {
             DeleteObject(hBitmap);
             PostQuitMessage(0);
             return 0;
         }

   }
 return DefWindowProc(hwnd,message,wParam,lParam);
}