云顶娱乐手机官网-云顶娱乐网址

热门关键词: 云顶娱乐手机官网,云顶娱乐网址

第七章 鼠标(CHECKER1)

2019-11-07 作者:网络操作   |   浏览(184)
  1 /*--------------------------------------------
  2 CHECKER1.C -- Mouse Hit-Test Demo Program No.1
  3               (c) Charles Petzold, 1998
  4 --------------------------------------------*/
  5 
  6 #include <Windows.h>
  7 
  8 #define DIVISION 5
  9 
 10 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 11 
 12 int WINAPI WinMain( __in HINSTANCE hInstance
 13                     , __in_opt HINSTANCE hPrevInstance
 14                     , __in LPSTR lpCmdLine
 15                     , __in int nShowCmd )
 16 {
 17     static TCHAR szAppName[] = TEXT("Checker1");
 18     HWND hwnd;
 19     MSG msg;
 20     WNDCLASS wndclass;
 21 
 22     wndclass.style = CS_HREDRAW | CS_VREDRAW;
 23     wndclass.lpfnWndProc = WndProc;
 24     wndclass.cbClsExtra = 0;
 25     wndclass.cbWndExtra = 0;
 26     wndclass.hInstance = hInstance;
 27     wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
 28     wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
 29     wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 30     wndclass.lpszMenuName = NULL;
 31     wndclass.lpszClassName = szAppName;
 32 
 33     if (!RegisterClass(&wndclass))
 34     {
 35         MessageBox(NULL, TEXT("Program requires Windows NT!")
 36             , szAppName, MB_ICONERROR);
 37         return 0;
 38     }
 39 
 40     hwnd = CreateWindow(szAppName, TEXT("Checker1 Mouse Hit-Test Demo")
 41         , WS_OVERLAPPEDWINDOW
 42         , CW_USEDEFAULT, CW_USEDEFAULT
 43         , CW_USEDEFAULT, CW_USEDEFAULT
 44         , NULL, NULL, hInstance, NULL);
 45 
 46     ShowWindow(hwnd, nShowCmd);
 47     UpdateWindow(hwnd);
 48 
 49     while (GetMessage(&msg, NULL, 0, 0))
 50     {
 51         TranslateMessage(&msg);
 52         DispatchMessage(&msg);
 53     }
 54 
 55     return msg.wParam;
 56 }
 57 
 58 LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
 59 {
 60     static BOOL fState[DIVISION][DIVISION];
 61     static int cxBlock, cyBlock;
 62     HDC hdc;
 63     int x, y;
 64     PAINTSTRUCT ps;
 65     RECT rect;
 66 
 67     switch (message)
 68     {
 69     case WM_SIZE:
 70         cxBlock = LOWORD(lParam) / DIVISION;
 71         cyBlock = HIWORD(lParam) / DIVISION;
 72         return 0;
 73 
 74     case WM_LBUTTONDOWN:
 75         x = LOWORD(lParam) / cxBlock;
 76         y = HIWORD(lParam) / cyBlock;
 77 
 78         if (x < DIVISION && y < DIVISION)
 79         {
 80             fState[x][y] ^= 1;
 81 
 82             rect.left = x * cxBlock;
 83             rect.top = y * cyBlock;
 84             rect.right = (x + 1) * cxBlock;
 85             rect.bottom = (y + 1) * cyBlock;
 86 
 87             InvalidateRect(hwnd, &rect, FALSE);
 88         }
 89         else
 90             MessageBeep(0);
 91         return 0;
 92 
 93     case WM_PAINT:
 94         hdc = BeginPaint(hwnd, &ps);
 95 
 96         for (x = 0; x < DIVISION; ++x)
 97             for (y = 0; y < DIVISION; ++y)
 98             {
 99                 Rectangle(hdc, x * cxBlock, y * cyBlock
100                     , (x + 1) * cxBlock, (y + 1) * cyBlock);
101 
102                 if (fState[x][y])
103                 {
104                     MoveToEx(hdc, x * cxBlock, y * cyBlock, NULL);
105                     LineTo(hdc, (x + 1) * cxBlock, (y + 1) * cyBlock);
106                     MoveToEx(hdc, x * cxBlock, (y + 1) * cyBlock, NULL);
107                     LineTo(hdc, (x + 1) * cxBlock, y * cyBlock);
108                 }
109             }
110 
111         EndPaint(hwnd, &ps);
112         return 0;
113 
114     case WM_DESTROY:
115         PostQuitMessage(0);
116         return 0;
117     }
118 
119     return DefWindowProc(hwnd, message, wParam, lParam);
120 }

     前边的意气风发篇文章里面,小编模仿这本精髓的书写了一个windows程序, 对windows的顺序设计有了一小点的神志认知, 可是对于程序的准备依然眼光浅短,因而需求继续自学, 接着看那本卓越的书......

CHECKER1.C

        3、假如程序呼叫InvalidateRect使展现区域中的矩形失效,则InvalidateRect函数的末段贰个参数会钦命是还是不是擦除背景。假如那个参数为FALSE
           则windows不会擦除背景,并且在呼唤完BeginPaint后将置 ps.fErase=TRUE 非零。
           在处理WM_PAINT新闻时,假如要求在低效区域外拓宽重绘,可以呼叫InvalidateRect函数:
            Exp:
                 InvalidateRect(hwnd,NULL,TRUE);
            在BeginPaint函数以前呼叫InvalidateRect函数使整个突显区域成为无效,并擦除背景;但假如最后三个参数等于FALSE,则不会擦除背景,窗口
            中原始的音信还保留在原处。
        4、RECT rcPaint 是叁个RECT型的结构体, PAINTSTRUCT结构中的rcPaint成员定义了没用区域的边际。

CHECKE景逸SUV1程序将顾客细分分为二十九个矩形,构成一个5*5的数组。假使在内部三个矩形内单击鼠标,就用X形填充该矩形。再度单击,则X形消失。

4.1   呈现和换代
windows应用程序的显得区域:
       除标题栏、应用程序边框、菜单栏、工具栏、滚动条和境况条外的系统一分配配给应用程序的窗口区域。
Windows突显文字和图表的艺术:
       1、通过绘制应用程序的显得区域来促成
       2、当应用程序的一点部分被蒙蔽后,windows不会保留被覆盖的区域,当程序移开后,windows通过发送音信通告
            应用程序需求再度绘制被隐讳的区域来落实呈现
       3、windows通过发送WM_PAINT新闻来打招呼应用程序的窗口音信管理程序,必要重新绘制呈现区域
4.2  WM_PAINT消息:
  WM_PAINT音信的发生时机:
       1、在调用UpdateWindow函数时,windows会像应用程序发送两个WM_PAINT新闻,告示应用程序要求重绘显示区域。
       2、在应用程序的使用者移动窗口时,窗口中先前被隐形的区域重新可以知道
       3、使用者退换窗口的大小,同一时间wndclass.style 中设定了CS_VREDRAW 和CS_HREDRAW
       4、程序中调用ScrollWindow或ScrollDC函数滚动呈现区域的一片段
       5、程序中运用InvalidateRect或Invalidate库罗德gn函数发生WM_PAINT消息

当CHECKETiggo1程序收到WM_PAINT新闻时,它会再也绘制整个客商区,利用GDI中的Rectangle函数画出装有的矩形。若fState值为真,则CHECKE奥迪Q51程序调用函数MoveToEx和函数LineTo函数画出两条直线。

    上边的有些函数的原型未有指明重返值类型, 我们能够因此编写翻译景况要好查看, 因为小编有一点点懒,所以就没查看了。

云顶娱乐手机官网 1云顶娱乐手机官网 2

    作者意识用LiveWrite那些事物相比较好.......

云顶娱乐手机官网 3

眼前的内容差不离的描述了选择BeginPaint和EndPaint函数来拍卖WM_PAINT音讯的机制,通晓不做到的地点请各位见谅。

全数二十二个矩形具备相符的大幅度和中度,这个宽度和惊人被封存在cxBlock、cyBlock中。不论几时转移顾客区的轻重缓急,程序都将重新总括cxBlock、cyBlock。WM_LBUTTONDOWN管理逻辑利用鼠标的坐标来决断哪些矩形被单击,然后在fState数组中央银行使位运算符(按位异或^卡塔尔国计算那多少个矩形的新图景,最后强制使该矩形失效,进而产生WM_PAINT消息。

 大概发生WM_PAINT的时机:
       1、Windows擦除了覆盖应用程序的对话框恐怕新闻框
       2、菜单下拉下拉后然后被保释
       3、呈现ToolTip提醒音讯后
   以下情状Windows通过保存音信来苏醒展现区域
       1、鼠标的光标穿越突显区域
       2、Logo拖过展现区域
   处理进程:
      应用程序保留重新绘制呈现区域的具备新闻,并且当收到到WM_PAINT音信时开展展示区域的双重绘制或然第意气风发绘制(UpdateWindow时卡塔尔
4.3 无效矩形和有效矩形
   无效矩形:
       1、应用程序的显得区域中被掩瞒的区域正是行不通矩形区域。无效矩形也称作无效区域。
       2、正是因为无效矩形的留存才使Windows发送WM_PAINT新闻给应用程序,唯有在展现区域的某意气风发局地失效后应用程序窗口才会接到WM_PAINT消息
   绘图消息结构:
       1、 windows内部为每一个窗口保存二个制图新闻结构, 这些结构包括了重围无效区域的细小矩形的坐标以至其余消息
       2、如若在应用程序处理WM_PAINT音信以前, 展现区域的另三个区域改为无效,则windows会计算出多少个暗含两个区域的新的无效区域,并将这种转变新闻保存在绘图音信结构
       3、windows不会将八个WM_PAINT新闻放到音讯对列
   InvalideateRect函数
       1、窗口音信管理程序能够透过呼叫InvalidateRectangular使展现区域内的矩形无效
       2、调用InvalidateRect函数时意气风发旦音讯队列中已经存在WM_PAINT,即现已存在无效区域,windows将总结新的不算区域。就算新闻队列无WM_PAINT则将
          一个WM_PAINT音讯投递到音讯队列。
       3、在抽取到WM_PAINT音信时,窗口管理程序/函数能够赢得无效区域的坐标。
       4、在任曾几何时刻可以因而呼叫GetUpdateRect得到无效区域的坐标
   Tip:
       在处理WM_PAINT音讯时,窗口语资音信管理程序在呼叫BeginPaint之后整个区域马上造成有效, 程序也能够透过呼叫ValidateRect函数使突显区域内的自便矩形都改为有效。
       假设呼叫具备令整个展现区域改为有效的职能,则当前音信队列中的WM_PAINT都将被删去。
4、4 GDI
   GDI:
        要在窗口体现区域绘图,能够利用windows的图像设备接口:GDI
   文字绘制:
        1、DrawText函数
        2、TextOut函数
           原型: TextOut(HDC hdc, int x, int y,char *psText,int iLength);
           hdc: 设备内容句柄
           x:显示文字先河的x坐标
           y: 显示文字起头的y坐标
           psText: 指向要出示的字符串的指针
           iLength: 待凸显字符串的长短
   设备内容:
       1、设备内容句柄是GDI函数的通行证,通过配备内容句柄, 程序就足以在体现区域上制图。
       2、设备内容 DC: 是GDI内部保存的数据结构,设备内容与一定的展现设备相关。对于系统桌面, 设备内容总是与显示器上的一定窗口相关
       3、设备内容中某些值是图表属性,那些属性定义了GDI绘图函数的细节。
云顶娱乐手机官网,   通过配备内容绘图的长河:
       1、程序供给绘图时,必需得到设备内容句柄,在得到该句柄后,windows系统用钦定的属性值填入在那之中设施内容结构
       2、能够呼叫不相同的GDI函数获取器材内容的属性值
       3、能够呼叫GDI函数改造设备内容的属性值
       4、利用此外GDI函数在呈现区域绘图
       5、当程序在展现区域绘图完结后,必得释放设备内容句柄, 被假释的句柄无法再被应用
       6、程序必得在管理单个音信管理时期得到和假释设备内容句柄。
       Tip:
         除了呼叫CreateDC建设构造的设备内容外,程序不能够在四个音信之间保存其余装置内容句柄。
   获取器械内容句柄:  
   方法一:处理WM_PAINT音信时利用
       1、BeginPaint和EndPaint函数
            BeginPaint和EndPaint函数供给窗口句柄(在windows呼叫应用程序窗口管理函数时,作为参数字传送递给应用程序窗口管理函数卡塔 尔(英语:State of Qatar)
          和PAINTSTRUCT结构之处作为参数。
            BeginPaint函数再次来到叁个与窗口相关联的配备内容句柄。
           其原型如下:
                        HDC  BeginPaint(HWND, PAINTSTRUCT *)
           而EndPaint函数释放由BeginPaint函数拿到的设备内容句柄,其原型如下:
                             EndPaint(HWND, PAINTSTURCT *)
       2、WM_PAINT音信管理进程
          PreStep:
                  HDC hdc;
                  PAINTSTRUCT  ps;
          step1: 首先呼叫BeginPaint函数获得三个与窗口相关联的装置内容句柄;
                  hdc=BeginPaint(hwnd,&ps);
          Step2:  使用GDI函数举办绘图;
          Step3: 释放由BeginPaint函数获得设备内容句柄:
                  EndPaint(hwnd,&ps);
          EndStep: return 0;//在种种音讯管理完后,均需求重返到windows系统,何况只要成功实行窗口回调函数则赶回0.
       3、WM_PAINT新闻管理组织:
            case WM_PAINT:
                     hdc=BeginPaint(hwnd,&ps);
                     call other GDI function
                     EndPaint(hwnd,&ps);
                     return 0;
       4、 假诺在窗口消息管理函数中不管理WM_PAINT新闻,则必需将WM_PAINT新闻传递给DefWindowProc函数举办拍卖,DefWindowProc函
           数以上边包车型客车代码管理WM_PAINT消息:
            case WM_PAINT:
                 BeginPaint(hwnd,&ps);
                 EndPaint(hwnd,&ps);
                 return 0;
           表明以下DefWindowProc的原型:
                  DefWindowProc(HWND, MSG,WPARAM,LPARAM卡塔 尔(阿拉伯语:قطر‎;//与窗口音讯管理函数基本等同的布局
       5、windows产生WM_PAINT音信是因为展现区域的某些区间产生无效, 借使不呼叫BeginPaint和EndPaint,可能ValidateRect,则windows
         不会是对事情未有什么益处区域改为有效,相反windows会发送另三个WM_PAINT新闻,且一贯发送过去。 
   绘图音讯结构  PAINTSTRUCT:
       1、绘图音信结构定义:
              typedef struct tagPAINTSTRUCT
                {
                     HDC   hdc;   //设备内容句柄
                     BOOL  fErase;  //是还是不是业已擦除无效矩形的背景
                     RECT  rcPaint;
                     BOOL  fRestore;
                     BOOL  fIncUpdate;
                     BYTE  rgbReserved[32];
                 }PAINTSTRUCT;
        2、windows 呼叫
              在程序呼叫BeginPaint函数时,windows会将该协会的逐个成员填充好,应用程序只利用前四个字段,其余由windows内部接纳。
           呼叫BeginPaint函数时填充ps.f伊Russe字段来表示是还是不是曾经擦除无效区域的背景:
                  ps.f伊Russe = FALSE (0) 则表示早就擦除无效区域背景;同期windows会接纳wndclass.hbrBcakground钦命的画刷来擦除背景。

CHECKE景逸SUV1程序展现结果如图所示:

     下边是自个儿的有个别总括吧,贴出来让各位英豪看看,希望英豪们请教, 建议本身认知中的不当之处,以救助本身在自学的历程中增长.......

只要客商区的肥瘦和冲天不能够被5整除,客商区的左边或尾巴部分就能够现身七个小长条区域,不被实行覆盖。在这里片区域张开鼠标单击时,CHECKEPRADO1程序会调用MessageBeep函数实行响应。

     哈哈哈..........

    哈哈哈哈................原本windows下的主次设计有C的基础,加上学习一大堆windows定义各样API函数, 加上有的运转坐飞机制的知情,固然是新手级的不入门的程序编制程序人士(就如自身日常)也能兑现两个大致的应用....................

本文由云顶娱乐手机官网发布于网络操作,转载请注明出处:第七章 鼠标(CHECKER1)

关键词: