windows程序设计--鼠标消息---程序击中测试

来源:互联网 发布:淘宝网棉被单人多少钱 编辑:程序博客网 时间:2024/05/16 08:58

Windows程序设计 第五版 Charles PetZold 

P232

/*-------------------------------------------------   CHECKER1.C -- Mouse Hit-Test Demo Program No. 1                 (c) Charles Petzold, 1998  -------------------------------------------------*/#include <windows.h>#define DIVISIONS 5int flag =0;//测试看看InvalidateRect怎么工作的.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 (GRAY_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-Test Demo"),                          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 ;     HDC         hdc ;     int         x, y ;     PAINTSTRUCT ps ;     RECT        rect ;          switch (message)     {     case WM_SIZE : //在WM_SIZE 中 lParam 保存的是客户区的宽与高          cxBlock = LOWORD (lParam) / DIVISIONS ;          cyBlock = HIWORD (lParam) / DIVISIONS ;          return 0 ;               case WM_LBUTTONDOWN :// 在鼠标消息中,lParam保存的是鼠标相对于客户区的坐标          x = LOWORD (lParam) / cxBlock ;          y = HIWORD (lParam) / cyBlock ;                    if (x < DIVISIONS && y < DIVISIONS)          {              //异或运算,与1进行异或,等于是把fState [x][y]取反,起到交替绘画的效果.  // 第一次点击鼠标时,这个fState [x][y]被取反,就变成了1,这样WM_PAINT消息中就画了对角线  // 当再次单击鼠标时,对角线消失了,而fState [x][y]就由1变成0,WM_PAINT就不会重绘对角线  fState [x][y] ^= 1 ;                  // 计算矩形大小               rect.left   = x * cxBlock ;               rect.top    = y * cyBlock ;               rect.right  = (x + 1) * cxBlock ;               rect.bottom = (y + 1) * cyBlock ;               // 使得该矩形区无效,这个动作会产生WM_PAINT消息.   // 并使得该区域画的对角线消失,也就是第二次单击鼠标时,   // 已经绘好的对角线会消失,而此时fState [x][y]=FALSE,WM_PAINT不会重绘该区域.   // 因此第二次单击鼠标时,对角线就消失了且没有重绘.    InvalidateRect (hwnd, &rect, FALSE);              /*   if(flag==0)   {    InvalidateRect (hwnd, &rect, FALSE); flag =1;   }   */          }          else               MessageBeep (0) ;          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) ;                                   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) ;               }          }          EndPaint (hwnd, &ps) ;          return 0 ;                    case WM_DESTROY :          PostQuitMessage (0) ;          return 0 ;     }     return DefWindowProc (hwnd, message, wParam, lParam) ;}

   

原创粉丝点击