>学习笔记-键盘-CHECKER1 .C

CHECKER1.C
       
/*-------------------------------------------------------------------------
       
  CHECKER1.C --      Mouse Hit-Test Demo Program No. 1
       
                                                         (c) Charles Petzold, 1998
       
--------------------------------------------------------------------------*/
       
#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-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,LPARAMlParam)
       
{
       
           static BOOL   fState[DIVISIONS][DIVISIONS] ;
       
           static int            cxBlock, cyBlock ;
       
           HDC                                  hdc ;
       
           int                                  x, y ;
       
           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 (x < DIVISIONS && y < DIVISIONS)
       
                  {
       
                                         fState [x][y] ^= 1 ;    //异或指令,这是“X”能够点一下显示,再点一下消失的原因。
        
                                         rect.left                     = x * cxBlock ;
       
                                         rect.top                      = y * cyBlock ;
       
                                       rect.right                    = (x + 1) * cxBlock ;
       
                                         rect.bottom           = (y + 1) * cyBlock ;
       
            
       
                                         InvalidateRect (hwnd, &rect, FALSE) ;//该函数第三个参数针对的是“background ”即
  //背景,其使用方法还进一步实践。
                  }
       
                  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) ;
       
}

/------------------------------------------------------------------------------------------------------------------------------------------

在处理WM_PAINT期间,CHECKER1在重新绘制之前并不检查每个矩形区域的有效性,尽管它可以这样做。检查有效性的一种方法是在循环中为每个矩形块建立RECT结构(使用与WM_LBUTTONDOWN处理程序中相同的公式),并使用IntersectRect函数检查它是否与无效矩形(ps.rcPaint)相交。

/-------------------------------------------------------------------------------------------------------------------------------------------

 该程序的paint部分重绘所有的小矩形,这不是必要的,因为只有一个小矩形无效而引发paint消息,也就是说,只要更新这个无效的小矩形就行了,我想原程序为了简便起见,更新了整个客户区。如果要检查每个矩形区域的有效性,paint部分可改为:

        (先定义一个用来充放目标矩形的: RECT DesRect;)

           case   WM_PAINT :
       
            hdc = BeginPaint (hwnd, &ps) ;
        
           for (x = 0 ; x < DIVISIONS ; x++)
        
           for (y = 0 ; y < DIVISIONS ; y++)
       
        
                 {
        
                                                 rect.left     = x * cxBlock ;
       
                                                 rect.top      = y * cyBlock ;
       
                                                 rect.right    = (x + 1) * cxBlock ;
       
                                                 rect.bottom   = (y + 1) * cyBlock ;
        
                                                 if(IntersectRect(&DesRect,&rect,&ps.rcPaint));

                                 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) ;
       
                                }//end if

        
                                                     
               }//end for
         
        
                  EndPaint (hwnd, &ps) ;
       
                  return 0 ;
        
问题:我不知道这种pain方式和原来的paint方式哪一种更合理,效率更高一些?             
        

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值