澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站:文章相当短很周到,应用

2019-05-19 作者:澳门新萄京官方网站   |   浏览(132)

CHECKE瑞鹰一程序将客户细分分为二六个矩形,构成一个五*伍的数组。假如在里头四个矩形内单击鼠标,就用X形填充该矩形。再度单击,则X形消失。

     前面的一篇文章里面,笔者模仿那本精粹的书写了叁个windows程序, 对windows的主次设计有了一丢丢的认为认知, 可是对于程序的宏图依然寡见少闻,因而须求后续自学, 接着看那本优异的书......

深信读者朋友们对OFFICE三千早晚极度熟悉吧,它在那之中的东东可真不少,不管是活泼可爱的"大眼夹",如故种种平面造型的Windows控件都相当受广大用户喜爱。那么此番就让大家来模拟它做个要命常用的控件:"颜色组合框"。假诺你现在正在做关于字管理类的软件时那一个"东东"一定对你有用。程序编写翻译运行后的分界面效果如图一所示:

1、相关类

在Microsoft Windows 中,键盘和鼠标是四个正经的用户输入源,在有的交叠的操作中国和东瀛常互相补充使用。当然,鼠标在明天的应用程序中比10年前使用得更为宽泛。乃至在一些应用程序中,大家更习贯于采取鼠标,举例在游戏、画图程序、音乐程序,以及Web创览器等程序中正是这么。可是,我们能够不利用鼠标,但相对不可能从一般的PC中拆掉键盘。
  相对于民用Computer的任何零件,键盘有极其长久的历史,它起点于1874年的首先台Remington打字机。开始的一段时期的微处理器程序猿用键盘在 霍勒ith卡牌上打孔,今后在哑终端上用键盘直接与大型主机通信。PC上的键盘在有些地点拓展了扩张,包涵了作用键、光标定位键和(平日都含有的)单独的机械键盘,但它们的输入原理基本一样。

澳门新萄京官方网站 1澳门新萄京官方网站 2

     上面是笔者的有个别计算吧,贴出来让各位英雄看看,希望英雄们请教, 指出本身认知中的不当之处,以救助小编在自学的进度中抓实.......


图一、颜色选择组合框

  CStatusBar  -父类CControlBar,封装了关于状态栏的操作,也包涵状态栏的创立

键盘基础

  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 }

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

  一、完毕情势

2、状态栏的施用

  Windows程序获取键盘输入的艺术:键盘输入以新闻的样式传递给程序的窗口进程。实际上,第3遍学习音讯时,键盘正是一个鲜明的事例:音讯应该传递给应用程序的消息项目。
  Windows用八种区别的音讯来传递不相同的键盘事件。那就如太多了,可是(就像是我们所看到的一致)程序能够忽略在那之中至少四分之二的消息而不会有任何难点。并且,在大部意况下,这个音讯中包罗的键盘新闻会多于程序所急需的。处理键盘的有个别职业正是甄别出哪些信息是重要的,哪些是不根本的。
1、键盘基础知识
  就算应用程序在无数景况下能够透过鼠标达成新闻的输入,但到前天结束键盘还是是PC机中不得代替的首要输入设备。
  用键盘当作输入设备,每当用户按下或释放某二个键时,会发生二个抛锚,该中断激活键盘驱动程序KEYBOA陆风X8D.DRubiconV来对键盘中断实行拍卖。 KEYBOA科雷傲D.D猎豹CS陆V程序会依据用户的不及操作进行编码,然后调用Windows用户模块USE奇骏.EXE生成键盘音讯,并将该音信发送到消息队列中等候管理。
一.扫描码和虚拟码
  扫描码对应着键盘上的分歧键,每八个键被按下或自由时,都会时有发生1个唯一的扫描码作为本身的标记。扫描码依赖于实际的硬件装置,即当一样的键被按下或自由时,在不相同的机器上或许爆发不相同的扫描码。在先后中常见使用由Windows系统定义的与具体设备毫无干系的虚拟码。在击键发生扫描码的还要,键盘驱动程序KEYBOA瑞虎D.DENCOREV截取键的扫描码,然后将其翻译成对应的虚拟码,再将扫描码和虚拟码一同编码变成键盘音讯。所以,最后发送到音讯队列的键盘新闻中,既包罗了扫描码又含有了虚拟码。
  平日应用的虚拟码在WINDOWS.H文件中定义,常用虚拟码的数值、常量符号和含义如表所示。

CHECKER1.C

四.一   显示和翻新
windows应用程序的展现区域:
       除标题栏、应用程序边框、菜单栏、工具栏、滚动条和处境条外的种类分配给应用程序的窗口区域。
Windows展现文字和图纸的不二秘籍:
       1、通过绘制应用程序的显得区域来兑现
       贰、当应用程序的一点部分被掩盖后,windows不会保留被覆盖的区域,当程序移开后,windows通过发送消息公告
            应用程序要求重新绘制被覆盖的区域来兑现展现
       3、windows通过发送WM_PAINT新闻来打招呼应用程序的窗口消息管理程序,须求重新绘制突显区域
4.2  WM_PAINT消息:
  WM_PAINT音信的产生时机:
       1、在调用UpdateWindow函数时,windows会像应用程序发送三个WM_PAINT音讯,布告应用程序供给重绘展现区域。
       二、在应用程序的使用者移动窗口时,窗口中先前被埋伏的区域重新可见
       叁、使用者改动窗口的大大小小,同时wndclass.style 中设定了CS_VREDRAW 和CS_HREDRAW
       四、程序中调用ScrollWindow或ScrollDC函数滚动展现区域的壹某个
       伍、程序中动用InvalidateRect或Invalidate路虎极光gn函数发生WM_PAINT消息

  首先让大家先来打听一下画控件的基本原理和经过,或然这么些才是本文的本心。大家都清楚Windows中享有可视的事物都以画出来的,那么这些画画的内部进度又是怎么着的吗?一般画Windows控件的历程分成三超越四分之二:一是在WM_MEASUREITEM消息影射函数中设置当前要画的Item的轻重缓急尺寸;贰是在WM_DRAWITEM新闻影射函数中遵照Item的深浅尺寸来画该Item(图标/位图/字符串等);三是在WM_PAINT音讯映射函数中持续的绘图当前的控件内容。

  2.一开立状态栏 CStatusBar::CreateEx / CStatusBar::Create

取值(1陆进制) 常量符号 含义
01 VK_LBUTTON 鼠标左键
02 VK_RBUTTON 鼠标右键
03 VK_CANCEL Break中断键
04 VK_MBUTTON 鼠标中键
05-07 -- 未定义
08 VK_BACK (BackSpace)键
09 VK_TAB Tab键
0A-0B -- 未定义
0C VK_CLEAR Clear键
0D VK_RETURN Enter键
0E-0F -- 未定义
10 VK_SHIFT Shift键
11 VK_CONTROL Ctrl键
12 VK_MENU Alt键
13 VK_PAUSE Pause键
14 VK_CAPTIAL CapsLock键
15-1玖 -- 汉字系统一保险留
1A -- 未定义
1B VK_ESCAPE Esc键
壹C-壹F -- 汉字系统一保险留
20 VK_SPACE 空格键
21 VK_PRIOR PageUp键
22 VK_NEXT PageDown键
23 VK_END End键
24 VK_HOME Home键
25 VK_LEFT ←(Left Arrow)键
26 VK_UP ↑(Up Arrow)键
27 VK_RIGHT →(Right Arrow)键
28 VK_DOWN ↓(Down Arrow)键
29 VK_SELECT Select键
2A -- OEM保留
2B VK_EXECUTE Execute键
2C VK_SNAPSHOT Print Screen键
2D VK_INSERT Insert键
2E VK_DELETE Delete键
2F VK_HELP Help键
30-39 VK_0-VK_9 数字键0-9
3A-40 -- 未定义
41-5A VK_A-VK_Z 字母键A-Z
5B-5F -- 未定义
60-69 VK_NUMPAD0-VK_NUMPAD玖 小键盘数字键0-玖
6A VK_MULTIPLY *(乘号)键
6B VK_ADD (加号)键
6C VK_SEPAPATO途锐 分隔符键
6E VK_SUBTRACT -(减号)键
6F VK_DECIMAL .(小数点)键
70-87 VK_DIVIDE /(除号)键
88-8F VK_F1-VK_F24 F1-F24功能键
90 VK_NUMBERLOCK Number lock键
91 VK_SCROLL Scroll lock键
92-B9 -- 未定义
BA-C0 -- OEM保留
C1-DA -- 未定义
DB_E4 -- OEM保留
E5 -- 未定义
E6 -- OEM保留
E7-E8 -- 未定义
E9-F5 -- OEM保留
F6-FE -- 未定义

CHECKE卡宴1程序显示结果如图所示:

 只怕发生WM_PAINT的时机:
       壹、Windows擦除了覆盖应用程序的对话框恐怕消息框
       二、菜单下拉下拉后然后被放走
       三、展现ToolTip提示音讯后
   以下情况Windows通过保存消息来平复彰显区域
       壹、鼠标的光标穿越显示区域
       二、Logo拖过展现区域
   管理进程:
      应用程序保留重新绘制展现区域的具有新闻,并且当接过到WM_PAINT音讯时实行体现区域的再度绘制可能第2制图(UpdateWindow时)
四.三 无效矩形和卓有成效矩形
   无效矩形:
       一、应用程序的来得区域中被覆盖的区域就是不行矩形区域。无效矩形也称作无效区域。
       二、就是因为无效矩形的留存才使Windows发送WM_PAINT音讯给应用程序,只有在展现区域的某1局地失效后应用程序窗口才会吸纳WM_PAINT消息
   绘图音讯结构:
       一、 windows内部为每一个窗口保存2个绘制音信结构, 这些组织包括了包围无效区域的微小矩形的坐标以及任何音信
       二、假设在应用程序管理WM_PAINT新闻在此之前, 显示区域的另3个区域成为无效,则windows会总计出二个富含多个区域的新的不算区域,并将这种转移新闻保存在绘图音信结构
       三、windows不会将四个WM_PAINT新闻放到新闻对列
   InvalideateRect函数
       一、窗口音讯管理程序可以通过呼叫InvalidateRectangular使呈现区域内的矩形无效
       2、调用InvalidateRect函数时只要音讯队列中早已存在WM_PAINT,即现已存在无效区域,windows将总结新的无效区域。如若音信队列无WM_PAINT则将
          一个WM_PAINT音讯投递到消息队列。
       三、在收取到WM_PAINT新闻时,窗口管理程序/函数可以赢得无效区域的坐标。
       四、在任何时刻能够由此呼叫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: 待显示字符串的尺寸
   设备内容:
       一、设备内容句柄是GDI函数的通行证,通过设备内容句柄, 程序就足以在体现区域上绘制。
       二、设备内容 DC: 是GDI内部保存的数据结构,设备内容与特定的来得设备相关。对于系统桌面, 设备内容总是与显示器上的特定窗口相关
       三、设备内容中有个别值是图形属性,这几个属性定义了GDI绘图函数的底细。
   通过配备内容绘图的进程:
       一、程序需求绘图时,必须得到设备内容句柄,在获得该句柄后,windows系统用钦命的属性值填入在那之中设施内容结构
       贰、能够呼叫差异的GDI函数获取器械内容的属性值
       叁、能够呼叫GDI函数更动设备内容的属性值
       四、利用别的GDI函数在呈现区域绘图
       5、当程序在展现区域绘图实现后,必须自由设备内容句柄, 被放飞的句柄无法再被使用
       陆、程序必须在处理单个新闻管理期间获得和刑满释放解除劳教设备内容句柄。
       Tip:
         除了呼叫CreateDC建构的器材内容外,程序无法在四个音信之间保存别的装置内容句柄。
   获取装备内容句柄:  
   方法一:处理WM_PAINT新闻时行使
       1、BeginPaint和EndPaint函数
            BeginPaint和EndPaint函数要求窗口句柄(在windows呼叫应用程序窗口处理函数时,作为参数字传送递给应用程序窗口管理函数)
          和PAINTSTRUCT结构的地点作为参数。
            BeginPaint函数重返三个与窗口相关联的器械内容句柄。
           其原型如下:
                        HDC  BeginPaint(HWND, PAINTSTRUCT *)
           而EndPaint函数释放由BeginPaint函数获得的设施内容句柄,其原型如下:
                             EndPaint(HWND, PAINTSTURCT *)
       2、WM_PAINT音讯管理进度
          PreStep:
                  HDC hdc;
                  PAINTSTRUCT  ps;
          step壹: 首先呼叫BeginPaint函数获得三个与窗口相关联的设备内容句柄;
                  hdc=BeginPaint(hwnd,&ps);
          Step2:  使用GDI函数实行绘图;
          Step三: 释放由BeginPaint函数获得设备内容句柄:
                  EndPaint(hwnd,&ps);
          EndStep: return 0;//在每3个消息管理完后,均须要回到到windows系统,并且只要成功实行窗口回调函数则赶回0.
       3、WM_PAINT音信管理协会:
            case WM_PAINT:
                     hdc=BeginPaint(hwnd,&ps);
                     call other GDI function
                     EndPaint(hwnd,&ps);
                     return 0;
       四、 纵然在窗口音讯管理函数中不管理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会发送另3个WM_PAINT新闻,且平昔发送过去。 
   绘图消息结构  PAINTSTRUCT:
       1、绘图新闻结构定义:
              typedef struct tagPAINTSTRUCT
                {
                     HDC   hdc;   //设备内容句柄
                     BOOL  f伊拉斯e;  //是还是不是早已擦除无效矩形的背景
                     RECT  rcPaint;
                     BOOL  fRestore;
                     BOOL  fIncUpdate;
                     BYTE  rgbReserved[32];
                 }PAINTSTRUCT;
        2、windows 呼叫
              在先后呼叫BeginPaint函数时,windows会将该协会的逐一成员填充好,应用程序只行使前四个字段,其余由windows内部选用。
           呼叫BeginPaint函数时填充ps.f伊拉斯e字段来代表是还是不是曾经擦除无效区域的背景:
                  ps.f伊拉斯e = FALSE (0) 则象征已经擦除无效区域背景;同时windows会动用wndclass.hbrBcakground钦定的画刷来擦除背景。

    BOOL CreateEx(

二.输入宗旨
  同临时刻,Windows中只怕有七个不等的次第在运营,也正是说有三个窗口同时存在。那时,键盘由多少个窗口共享,但唯有三个窗口能够接收到键盘新闻,这么些能够接受键盘音信的窗口被叫做全部输入宗旨的窗口。
  具备输入主题的窗口应当是当下的活动窗口,也许是活动窗口的子窗口,其标题和边框会以高亮度呈现,以界别于别的窗口。具有输入主旨的也得以是Logo而不是窗口,此时,Windows也将消息发送给Logo,只是消息的格式略有分裂。
  窗口进程可以通过发送WM_SETFOCUS和 WM_KILLFOCUS音讯使窗体得到或失去输入大旨。程序也得以通过捕获WM_SETFOCUS和WM_KILLFOCUS音讯来判断窗体曾几何时获得或失去输入宗旨。在那之中WM_SETFOCUS音讯表示窗口正获得输入主旨,WM_ KILLFOCUS音信表示窗口正失去输入核心。
三.键盘音信
  键盘音讯分为系统键音讯和非系统键音信。系统键新闻是指由Aft键和其余键组合而发出的按钮新闻。当系统键被按下时发生WM_ SYSKEYDOWN新闻,当系统键被假释时产生WM_SYSKEYUP消息。 Aft键与其余键产生的组合键平常用于对先后菜单和连串菜单举行接纳,或用于在差异的次序之间实行切换。由此,系统键音讯应该交由Windows举行拍卖,用户所编纂的次序一般不管理系统键新闻,而是将那个新闻交由DefWindowProc函数实行拍卖。如果用户想对系统键信息进行管理,应该在管理完那么些音讯后,再将其发送给DefWindowProc函数,使得Windows系统能够平常办事。
  一些击键新闻能够被转换到字符新闻,举个例子字母键、数字键等。有个别键只好发出按钮音信而未有字符音讯,举例Shift键、Insert键等。新闻循环中的 TranslateMessage函数能够兑现从击键新闻向字符信息的转会。当GetMessage函数捕获3个WM_SYSKEYDOWN消息或 WM_KEYDOWN音信后,TranslateMessage函数推断产生该新闻的键是还是不是能够被调换来字符消息,如若能,就将该音讯转变来字符音信,再经过DispatchMessape函数将转移后的字符信息发送到音讯队列中去。字符信息共有以下多样,如表所示。

澳门新萄京官方网站 3

        3、如若程序呼叫InvalidateRect使彰显区域中的矩形失效,则InvalidateRect函数的终极三个参数会钦赐是还是不是擦除背景。假若那些参数为FALSE
           则windows不会擦除背景,并且在呼唤完BeginPaint后将置 ps.f伊拉斯e=TRUE 非零。
           在处理WM_PAINT音讯时,倘使需求在低效区域外实行重绘,能够呼叫InvalidateRect函数:
            Exp:
                 InvalidateRect(hwnd,NULL,TRUE);
            在BeginPaint函数此前呼叫InvalidateRect函数使一切呈现区域改为无效,并擦除背景;但若是最终二个参数等于FALSE,则不会擦除背景,窗口
            中本来的新闻还保留在原处。
        四、RECT rcPaint 是二个RECT型的结构体, PAINTSTRUCT结构中的rcPaint成员定义了不算区域的边际。

上面大家针对CBSColorComboBox类的那多少个进程来做个轻便的牵线:

      CWnd* pParentWnd,  //钦定状态栏的父窗口指针,平时都是指向程序的框架类窗口对象

字符 系统字符 非系统字符
平凡字符 WM_SYSCHAR WM_CHAR
死字符 WM_SYSDEADCHAR WM_DEADCHAR

抱有二陆个矩形具有同等的升幅和中度,那些宽度和惊人被保存在cxBlock、cyBlock中。无论曾几何时转移客户区的轻重缓急,程序都将另行总括cxBlock、cyBlock。WM_LBUTTONDOWN管理逻辑利用鼠标的坐标来判定哪些矩形被单击,然后在fState数组中运用位运算符(按位异或^)计算那么些矩形的新处境,最终强制使该矩形失效,从而发出WM_PAINT消息。

前方的剧情简短的讲述了使用BeginPaint和EndPaint函数来拍卖WM_PAINT音讯的建制,驾驭不做到的地点请各位见谅。

  在WM_MEASUREITEM消息影射函数中设定Item的深浅尺寸的时候,大家只必要设置Item的惊人就能够。这里的惊人大家设置为二倍的连串小Logo(SMALL ICON)的可观,其尺寸用::GetSystemMetrics(SM_CXSMICON)取得。

      DWOCR-VD dwCtrlStyle = 0 ,  //设置内嵌在状态栏上的CStatusBarCtrl对象创设时的扩大风格

  在那之中死字符是由少数特殊键盘上的按钮所形成的,Windows一般忽略死字符所发出的新闻。
  Windows的新闻一般是通过贰个MSG结构体变量传送给音讯管理函数的。对于键盘音讯, MSG结构体变量的各样域中较重要的是lParam域和 wParam域。wParam域用于保存开关的虚拟键代码或字符的ASCII码。对于非字符新闻,wParam域保存开关的杜撰健代码;对于字符音讯, wParam域不保留字符的ASCII码。lParam域则用来保存击键时发生的叠合音讯,实际上一个31个人的lParam变量被分成6有的,记录了以下相关音讯:重复次数、OEM扫描码、扩大键标识、关联键标记、前一击键情状和调换状态。lParam域各位的含义如表所示。

举个例子客户区的上升的幅度和中度不可能被伍整除,客户区的右边或底层就会面世二个小长条区域,不被进行覆盖。在那片区域张开鼠标单击时,CHECKE凯雷德一程序会调用MessageBeep函数进行响应。

    上边包车型地铁部分函数的原型没有指明再次回到值类型, 大家可以经过编写翻译情形协考查看, 因为自身有一点懒,所以就没查看了。

  Visual C 的顺序开拓人士能够在Item的矩形区域内画各种各样标音讯,比如:Logo/位图/字符串等等。那么有人会疑窦:"大家用哪些来画?我们在哪儿画?又何以来画吗?"。答案其实都在这些LPDRAWITEMSTRUCT结构中。hDC成员为设备上下文情形(HDC),获得了该装置句柄也就代表大家具有了画别的位图/Logo/文本的力量;那么接下去的难点便是:大家在哪个地方来画吗?答案也很简短:获得LPDRAWITEMSTRUCT结构中Item的矩形区域(rcItem),那么那就是你施展才华的空间了,要丰富利用它哦!

      DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM,  //状态栏的作风

位数 含义
0-一伍 击键重复次数累加
16-23 OEM扫描码
2肆 是不是为扩张键
25-28 未定义
2玖 是不是便用关联键,及Alt键是或不是同时按下。
30 前1回击键状态,0表示该键前3遍状态为抬起,一象征前2次状态为按下
31 调换状态

当CHECKECR-V1程序收到WM_PAINT消息时,它会重新绘制整个客户区,利用GDI中的Rectangle函数画出装有的矩形。若fState值为真,则CHECKE福睿斯1程序调用函数MoveToEx和函数LineTo函数画出两条直线。

    哈哈哈哈................原来windows下的先后设计有C的功底,加上学习一大堆windows定义各样API函数, 加上一些运转机制的知晓,固然是新手级的不入门的次序编制程序职员(就好像自家一般)也能兑现2个简约的应用....................

  最终一步正是如何来画的主题素材了,说白了便是何等分配各个成分的长空,怎样在它们各自的长空上画出你想要的事物。遵照常规一般分别总结出ICON所占的矩形区域/文本所占的矩形区域/位图的矩形区域,如果您还有别的因素那么也理应计算出该因素所占的矩形区域/位图所占的矩形区域。接下来的方方面面都相当的粗略了,不外乎CDC类的多少个常用函数:画Logo用DrawIcon()、画位图用BitBlt()、画文字用DrawText()等函数。要是你感到视觉上还相当的矮管L,你还足以来设置种种Item的公文颜色,背景颜色,以及Logo的兴起和凹陷的视觉效果。

      UINT nID = AFX_IDW_STATUS_BA哈弗   //钦命状态栏那一个子窗口的ID,默以为AFX_IDW_STATUS_BAR

  开关的顺序分裂,发生的新闻也分歧样。举个例子,按下并释放壹键,读进度依次爆发如表所示叁条音信。按下壹键所爆发的消息和wParam的取值

    小编开掘用LiveWrite那些事物相比较好.......

  然则在上述进度中须求注意多个难题,1是为了消除不断绘制所带来的闪亮现象,须要在WM_ERASEBKGND音讯响应中作些特殊管理;在WM_PAINT消息中向来把组合框的客户区当成1幅位图来不断更新,而不是对ICON区域和文件区域分别重绘。二是每当用户退换了组合框的脚下内容后,在画新的Item以前一定要记得清除前次组合框内的源委。三是只要想选取更多的颜料,那么一旦选用组合框中的最终1个Item(More Colors)就可以,这些Item是为用户自定义颜色而特意设置的。

    );

音信 wParam变量取值
WM_KEYDOWN 虚拟码1
WM_CHAR ASCII码“1”
WM_KEYUP 虚拟码1

  2、编制程序步骤

    BOOL Create(

  假如按下Shift键后再按下壹键并释放,则相继产生如表所示的消息。按下 Shift键后按 一健所发生的信息和 wParam的取值

  一、运维Visual C 6.0,生成3个基于对话框的项目,将该类型命名叫"WW";

      CWnd* pParentWnd,  //钦定状态栏的父窗口指针,平时都是指向程序的框架类窗口对象

消息 wParam变量取值
WM_KEYDOWN 虚拟码 VK_SHIFT
WM_KEYDOWN 虚拟码 VK_1
WM_CHAR ASCII码 “1”
WM_KEYUP 虚拟码 VK_1
WM_KEYUP 虚拟码 VK_SHIFT

  二、使用Class Wizard新建多少个类CBSColorComboBox,其基类选拔为CComboBox类;

      DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM,  //状态栏的风骨

二、键盘使用实例
  上边通过二个应用程序实例来验证在骨子里编制程序中哪些管理键盘音讯。
#include <windows.h>
#include <stdio.h>
// 全局变量
RECT rc; //记录滚屏的矩形区域
?
int xChar, yChar; //文本输入点坐标

  3、在程序的对话框中放置一个ComboBox控件,使用CLASSWIZAQX56D增多对应的CComboBox类成员变量,然后将该成员变量的花色修改为CBSColorComboBox;

      UINT nID = AFX_IDW_STATUS_BAGL450  //钦定状态栏这一个子窗口的ID,默以为AFX_IDW_STATUS_BAR

WNDCLASSEX wnd; //窗口类结构变量

  4、增添代码,编写翻译运营程序。

    );

char szAppName[] = "键盘音讯监视程序"; //窗口类名
//函数注脚
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE hInstance,int iCmdShow);
//函数:WinMain
//效能:入口函数
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR szCmdLine,int iCmdShow)
{
  MSG msg;
  if(!MyRegisterClass(hInstance))
  {
    return FALSE;
  }
  
   if(!InitInstance(hInstance,iCmdShow))
  {
    return FALSE;
  }
  
  while (GetMessage (&msg, NULL, 0, 0))
  {
    TranslateMessage (&msg);
    DispatchMessage (&msg);
  }
  return msg.wParam;
}
//函数:ShowKey
//作用:实现在窗口中体现开关音讯
void ShowKey (HWND hwnd, int iType,char *szMessage,WPARAM wParam,LPARAM lParam)
{
  static char *szFormat[2] ={"%-14s = %c %6u M %5s %5s %6s %6s",
                "%-14s = %c %6u M %5s %5s %6s %6s" };
  char szBuffer[80];
  HDC hdc;
  ScrollWindowEx(hwnd, 0, -yChar, &rc,&rc,NULL,NULL,SW_INVALIDATE);
  hdc = GetDC (hwnd);
  SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT));
  TextOut (hdc,
       xChar,
       rc.bottom - yChar,
       szBuffer,
       wsprintf szBuffer,
       szFormat[iType],
       szMessage, //消息
       wParam, //虚拟键代码
       (BYTE) (iType ? wParam :‘ ’),//展现字符值
       LOWO安德拉D (lParam), // 重复次数
       HIWO宝马X伍D (lParam) & 0xFF, // OEM键盘扫描码
       //剖断是不是为增高键盘的扩充键
       (PSTR) (0x01000000 & lParam ? “是” : “否”),
       //推断是还是不是还要利用了ALT键
       (PSTR) (0x20000000 & lParam ? “是” : “否”),
       (PSTR) (0x40000000 & lParam ? “按下” : “抬”),
       //决断前贰遍击键状
       (PSTR)(0x80000000 & lParam ? “按下” : “抬起”))
       //决断调换状态?
       );
  ReleaseDC (hwnd, hdc); ?
  ValidateRect (hwnd, NULL); ?
}
//函数:WndProc
//效能:处理主窗口的音讯
LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
  static char szTop[] ="新闻键 字符 重复数 扫描码 扩张码 ALT 前1状态 转换状态";
  static char szUnd[] ="_______ __ ____ _____ ______ ______ ___ _______ ______";

**叁、程序代码

    在程序的CMainFrame类的OnCreate函数中可知MFC自动成立状态栏的主意:      

  //在窗口中输出文字作为新闻标题
  HDC hdc;
  PAINTSTRUCT ps;
  TEXTMETRIC tm;

**

if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(
    indicators,sizeof(indicators)/sizeof(UINT)))
{
    TRACE0("Failed to create status barn");
    return -1;      // fail to create
}

  switch (iMsg)
  {
    case WM_CREATE://管理窗口创立的新闻
    hdc = GetDC (hwnd); //设定字体
    SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)); //检取当前字体的度量数据
    GetTextMetrics (hdc, &tm);
    xChar = tm.tmAveCharWidth;//保存字体平均增长幅度
    yChar = tm.tmHeight; //保存字体中度
    ReleaseDC (hwnd, hdc);
    rc.top = 3 * yChar / 2;
    return 0;

//////////////////////////////////////////////////////////////CBSColorComboBox类的头文件;
#if !defined(_BS_BSCOLORCB)
#define _BS_BSCOLORCB
#include <afxtempl.h>
//系统常用颜色的自定义名称
const static char* strColorName[] =
{
 "crSCROLLBAR","crBACKGROUND","crACTIVECAPTION", "crINACTIVECAPTION", "crMENU", "crWINDOW", "crWINDOWFRAME",  "crMENUTEXT", "crWINDOWTEXT", "crCAPTIONTEXT", "crACTIVEBORDER","crINACTIVEBORDER", "crAPPWORKSPACE",  "crHIGHLIGHT", "crHIGHLIGHTTEXT", "crBTNFACE", "crBTNSHADOW", "crGRAYTEXT", "crBTNTEXT",  "crINACTIVECAPTIONTEXT",
 "crBTNHIGHLIGHT","cr3DDKSHADOW", "cr3DLIGHT", "crINFOTEXT", "crINFOBK",
 "crHOTLIGHT","crGRADIENTACTIVECAPTION", crGRADIENTINACTIVECAPTION"
};

typedef struct BSCBITEM
{
 int iIndex;
 COLORREF crColor;
 LPCTSTR lpCaption;
}BSCBITEM, *LPBSCBITEM;

class CBSColorComboBox : public CComboBox
{
 DECLARE_DYNCREATE(CBSColorComboBox)
 public:
  CBSColorComboBox();
  virtual ~CBSColorComboBox();
  BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
  //初始化组合框(第一个被调用的函数)
  void InitBSColorCB(void);
  //得到当前的颜色值或R/G/B值
  COLORREF GetColor();
  void GetRGBValue(int* R, int* G, int* B);
 public:
  //{{AFX_VIRTUAL(CBSColorComboBox)
   public:
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
    virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct);
  //}}AFX_VIRTUAL
 protected:
  bool m_bOverControl; //鼠标的状态(是否处于按钮上)
  int iIconX, iIconY; //SMALL ICON的大小尺寸
  COLORREF m_crColor; //当前选中的颜色
  CList<LPBSCBITEM, LPBSCBITEM> m_crItem;

  void OnCBPaint(CDC* pDC);
  LPBSCBITEM GetItem(int iIndex = 0);
 protected:
  //{{AFX_MSG(CBSColorComboBox)
   afx_msg BOOL OnEraseBkgnd(CDC* pDC);
   afx_msg void OnPaint();
   afx_msg void OnTimer(UINT nIDEvent);
   afx_msg void OnMouseMove(UINT nFlags, CPoint point);
   afx_msg void OnSelchange();
   afx_msg void OnSelendok();
  //}}AFX_MSG
  DECLARE_MESSAGE_MAP()
};
#endif // !defined(_BS_BSCOLORCB)

///////////////////////////////////////////////////////////////CBSColorComboBox的实现文件;
#include "stdafx.h"
#include "BSColorComboBox.h"
CBSColorComboBox::CBSColorComboBox()
{
 //当前鼠标是否在对象上
 m_bOverControl = false;
 //小图标尺寸
 iIconX = ::GetSystemMetrics(SM_CXSMICON);
 iIconY = ::GetSystemMetrics(SM_CYSMICON);
}

CBSColorComboBox::~CBSColorComboBox()
{
 while(!m_crItem.IsEmpty())
 {
  LPBSCBITEM lpItem = m_crItem.RemoveHead();
  delete lpItem;
 }
}

BOOL CBSColorComboBox::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
{
 DWORD dw = dwStyle;

 if( !CComboBox::Create(dw, rect, pParentWnd, nID) )
  return false;
 CFont * font = CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT));
 SetFont(font);

 return true;
}
IMPLEMENT_DYNCREATE(CBSColorComboBox, CComboBox)

BEGIN_MESSAGE_MAP(CBSColorComboBox, CComboBox)
//{{AFX_MSG_MAP(CBSColorComboBox)
 ON_WM_ERASEBKGND()
 ON_WM_PAINT()
 ON_WM_TIMER()
 ON_WM_MOUSEMOVE()
 ON_CONTROL_REFLECT(CBN_SELCHANGE, OnSelchange)
 ON_CONTROL_REFLECT(CBN_SELENDOK, OnSelendok)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CBSColorComboBox::InitBSColorCB(void)
{
 int iMinColor = COLOR_SCROLLBAR,
 iMaxColor = COLOR_BTNHIGHLIGHT;
 if(WINVER >= 0x0400)
  iMaxColor = COLOR_INFOBK;
 if(WINVER >= 0x0500)
  iMaxColor = 28;
 //初始化CB颜色列表框的Item(常见的SysColor值)
 for(int iLoop = iMinColor; iLoop <= iMaxColor; iLoop)
 {
  LPBSCBITEM lpItem = new BSCBITEM;
  lpItem->iIndex = AddString(strColorName[iLoop]);
  lpItem->crColor = ::GetSysColor(iLoop);
  lpItem->lpCaption = strColorName[iLoop];
  //
  if(m_crItem.IsEmpty())
   m_crItem.AddHead(lpItem);
  else
   m_crItem.AddTail(lpItem);
 }
 //该Item是为了用户自定义颜色而设置
 LPBSCBITEM lpItem = n

      SetIndicators函数的第叁个参数indicators为1个静态数组,其定义在CMainFrame类的源文件中:

    case WM_SIZE://管理窗口大小改换的新闻
    //窗体制改进变后保存新的滚屏区域右下角坐标
    rc.right = LOWORD (lParam);
    rc.bottom = HIWORD (lParam);
    UpdateWindow (hwnd);
    return 0;

...

        static UINT indicators[] =

    case WM_PAINT: //管理窗口重绘消息
    InvalidateRect (hwnd, NULL, TRUE);
    hdc = BeginPaint (hwnd, &ps);
    SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ;
    SetBkMode (hdc, TRANSPARENT) ;
    TextOut (hdc, xChar, yChar / 2, szTop, (sizeof szTop) - 1) ;
    TextOut (hdc, xChar, yChar / 2, szUnd, (sizeof szUnd) - 1) ;
    EndPaint (hwnd, &ps);
    return 0;

        {

    case WM_KEYDOWN:
    //管理键盘上某一键按下的音信
    ShowKey (hwnd, 0, "WM_KEYDOWN",wParam, lParam);
    return 0;

              ID_SEPARATOR,       //提示行

    case WM_KEYUP:
    //管理键盘上某1按下键被放飞的新闻
    ShowKey (hwnd, 0, "WM_KEYUP", wParam, lParam);
    return 0;

              ID_INDICATOR_CAPS,  //Caps Lock键的事态提醒器

    case WM_CHAR:
    //管理击键进程中发出的非系统键的可知字符消息
    howKey (hwnd, 1, "WM_CHAR", wParam, lParam);
    return 0;

              ID_INDICATOR_NUM,   //Num Lock键的场馆提示器

    case WM_DEADCHAR:
    //管理击键进度中爆发的非系统键"死字符"新闻
    ShowKey (hwnd, 1, "WM_DEADCHAR", wParam, lParam);
    return 0;

              ID_INDICATOR_SC科雷傲L,  //Scroll Lock键的景况提示器

    case WM_SYSKEYDOWN:
    //管理系统键按下的音信
    ShowKey (hwnd, 0, "WM_SYSKEYDOWN",wParam, lParam);
    break;

        };

    case WM_SYSKEYUP:
    //管理系统键抬起的消息
    ShowKey (hwnd, 0, "WM_SYSKEYUP", wParam, lParam);
    break;

        该数组中的后3个ID都以MFC预先定义好的字符串财富ID,在工程的财富窗口中的String Table的字串表中可知:

    case WM_SYSCHA奥迪Q7://管理系统键可知字符音信
    ShowKey (hwnd, 1, "WM_SYSCHAR", wParam, lParam);
    break;

          澳门新萄京官方网站 4

    case WM_SYSDEADCHAENVISION://管理系统键"死字符"新闻
    ShowKey (hwnd, 1, "WM_SYSDEADCHAR", wParam, lParam);
澳门新萄京官方网站,    break;

      若要修改状态栏的外观,如增加或收缩情状栏上的窗格,只要求在indicators数组中加上或回落相应的字符串资源ID就可以;

    case WM_DESTROY:
    //管理终结应用程序的新闻
    PostQuitMessage (0);
    return 0;
  }
  return DefWindowProc (hwnd, iMsg, wParam, lParam);
}
//函数:MyRegisterClass
//效用:注册窗口类
BOOL MyRegisterClass(HINSTANCE hInstance)
{
  wnd.cbSize= sizeof (wnd);
  wnd.style = CS_HREDRAW | CS_VREDRAW;
  wnd.lpfnWndProc = WndProc;
  wnd.cbClsExtra = 0;
  wnd.cbWndExtra = 0;
  wnd.hInstance = hInstance;
  wnd.hIcon = LoadIcon (NULL, IDI_APPLICATION);?
  wnd.hCursor = LoadCursor (NULL, IDC_ARROW);
  wnd.hbrBackground = (HBRUSH)
  GetStockObject (WHITE_BRUSH);
  wnd.lpszMenuName = NULL;
  wnd.lpszClassName = szAppName;
  wnd.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  return RegisterClassEx (&wnd);
}
//函数:InitInstance
//作用:创造主窗口
BOOL InitInstance(HINSTANCE hInstance,int iCmdShow)
{
  HWND hwnd;
  hwnd = CreateWindow (szAppName,
             "键盘音讯监视程序",
             WS_OVERLAPPEDWINDOW,
             CW_USEDEFAULT,CW_USEDEFAULT,
             CW_USEDEFAULT,CW_USEDEFAULT,
             NULL,NULL,hInstance,NULL
             );
  if(!hwnd)
  {
    return FALSE;
  }

  二.二设置状态栏提醒器(窗格)

  ShowWindow (hwnd, iCmdShow);
  UpdateWindow (hwnd);
  return TRUE;
}

    CStatusBar::SetIndicators

  本实例的职能是通进度序捕获键盘音讯,然后将wParam参数所富含的多寡举行表达,最终将每一样音讯透过窗口体现出来。实例的源文件包涵了 Initlnstance、MyRegisterClass、ShowKey、WinMain和WndProc八个函数。程序的基本思路是以 WinMain函数作为程序入口,再调用 MyRegisterClass函数和 InitInstance函数注册窗口类并创办和保留窗日,然后创设和显示窗口,最后进入消息循环。
  上边注重分析函数WndProc和 ShowKey。
1.WndProc函数
在本实例中WndProc函数管理的音信根本有WM_CREATE、WM_SIZE、WM_PAINT和键盘音讯。
  case WM_CREATE://管理窗口创造的音信
  hdc = GetDC (hwnd);//设定字体
  SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT));//检取当前字体的襟怀数据
  GetTextMetrics (hdc, &tm);
  xChar = tm.tmAveCharWidth;//保存字体平均上升的幅度
  yChar = tm.tmHeight;//保存字体高度
  ReleaseDC (hwnd, hdc);
  rc.top = 3 * yChar / 2;
  return 0;
  那壹程序段的机要职能是将字体对象选入当前窗体的设备描述表中,同时获得字体中度和平均增长幅度,再开端化编辑区的滚屏区域的右上角Y坐标。进入该程序段后,首先通过GetDC函数得到当前窗体的设备描述表,再经过GetStockObject函数得到系统字体,然后用 SelectObject函数将字体对家选入窗体的设备描述表中。在那之中,hdc为设备描述表句柄。在成就有着操作后,程序还必须透过ReleaseDC函数释放设备描述表。在该程序段中选拔了GetTextMetrics函数来获取字体的几何尺寸。GetTextMetrics函效的原型定义如下:
BOOL GetTextMetrics(HDC hdc,// 指向设备描述表的句柄
          LPTEXTMET帕杰罗IC lptm // TEXTMETRAV4IC结构体变量的指针
          // 所获得的所有新闻保存在TEXTMET卡宴IC结构体变量中
          );
  个中lptm是一个对准 TEXTMETPAJEROIC结构体的指针。TEXTMETRubiconIC结构体包括了与字体的几何尺寸相关的为主新闻。该结构体的实际定义如下:
typedef struct tagTEXTMETRIC
{ // tm
  LONG tmHeight;// 字体中度
  LONG tmAscent;//字体高于基准线的莫斯中国科学技术大学学
  LONG tmDescent;// 字体低于基准线的冲天
  LONG tmInternalLeading;// 给大写字母留出的空间
  LONG tmExtenalLeading; // 由字体设计者推荐的附加行距
  LONG tmAveCharWidth;// 字体平均拉长率
  LONG tm马克斯CharWidth;// 字体最大开间
  LONG tmWeight; // 字体黑度
  LONG tmOverhang; // 在合成斜体或石籀文时加在字符上的增大宽度值
  LONG tmDigitizedAspectX;// 字体所符合的高宽比的宽
  LONG tmDigitizedAspectY; // 字体所符合的高宽比的高
  BCHA宝马X三 tmFirstChar; // 字体中定义的率先个字符
  BCHA奥迪Q5 tmLastChar; //字体中定义的末尾3个字符
  BCHA本田UR-V trnDefaultChar; //字体中的私下认可字符
  BCHA君越 trnBreakChar; // windows在调动文本时用于分歧词的字符
  BYTE tmItalic; // 取非零值时表示斜体字体
  BYTE tmUnderLined; // 取非零值时表示下划线字体
  BYTE tmStruckOut;// 取非零值时为除去线字体
  BYTE tmPitchAndFamily; // 低三人为字符间距,高三位为类别值
  BYTE tmCharSet; // 钦赐字符集
} TEXTMETRIC;
  该协会中装有的字体大小都是按逻辑单位交付的,那便是说字体的大小取决于当前显示设备的映射格局。
  在例中,所获得的字体几何尺寸保存在TEXTMET帕杰罗IC结构体变量tm中。滚屏区域的限量是通过RECT结构体变量re保存的,RECT结构体变量可以经过记录矩形区域的右上角和左下角的坐标来规定三个矩形区域。
RECT结构的原型定义如下:
typedef struc RECT{
  LONG left; // 矩形左上角 X坐标
  LONG top; // 左上角 Y坐标
  LONG right; // 右下角 X坐标
  LONG bottom; // 右下角Y坐标
} RECT;
  该组织定义了多个矩形区域的左上角和右下角的坐标。由组织的原型定义我们能够清楚该协会包蕴多少个域,当中left域表示矩形的左上角X坐标,top域表示左上角Y坐标,right域表示右下角X坐标,bottom域表示右下角Y坐标。常常用于二个矩形区域限量的记录和传递。
  举例,通过RECT结构的变量将2个矩形区域限制的八个角的值传递FillRect函数,则调用该函数后,矩形区域除了最下方的壹行和最左边①列外都被填充。在本实例中,早先化编辑区的滚屏区域的左上角Y坐标时,使用了如下程序:
  rc.top= 3 * yChar/2;
  这是因为在窗口中率先要出口两行的题头音讯,壹行为华语,一行为下划线。中文字符的惊人为三个字体中度单位,而下划线的可观为半个字体中度单位。那两行音讯是平昔维系,不参加滚屏的。因而,滚屏区域的左上角Y坐标从三/二个字体高度处伊始。
在WndProc函数中,处理WM_ SIZE
音信的程序段如下:
  case WM_SIZE: //管理窗口大小改动的消息
  //窗体制改良变后保存新的滚屏区域右下角坐标
  rc.right = LOWORD (lParam);
  rc.bottom = HIWORD (lParam);
  UpdateWindow (hwnd);
  return 0;
  该程序段比较轻巧,只是当窗口的尺寸改造时再也设定滚屏区域的右下角坐标,并创新窗口。值得注意的是, WM_SIZE消息的wParam变量保存了窗体新尺寸的左上角坐标,变量的三拾贰个人分为两个部分,低13位保存X坐标,高拾伍个人保存Y坐标。 lParam变量保存了窗体新尺寸的右下角坐标,保存方法与wParam变量同样。在编制程序进程中,日常经过LOWOTucsonD宏定义来取得3九位变量的低十四个人数值,通过HIWOOdysseyD宏定义来获得三1玖位变量的高历位数值。
  该程序段比较轻巧,只是当窗口的尺寸改造时再次设定滚屏区域的右下角坐标,并更新窗口。值得注意的是,WM_SIZE信息的wParam变量保存了窗体新尺寸的左上角坐标,变量的三16人分为四个部分,低17个人保存X坐标,高十五位保存Y坐标。 lParam变量保存了窗体新尺寸的右下角坐标,保存方法与wParam变量同样。在编制程序进程中,经常经过LOWOXC90D宏定义来收获313位变量的低二十位数值,通过HIWO福特ExplorerD宏定义来猎取3十人变量的高历位数值。
WndProc函数中,管理WM_PAINT音信的程序段如下:
  case WM_PAINT: //管理窗口重绘音讯 ?
  InvalidateRect (hwnd, NULL, TRUE); ?
  hdc = BeginPaint (hwnd, &ps); ?
  SelectObject (hdc, GetStockObject (SYSTEM_FIXED_FONT)) ; ?
  SetBkMode (hdc, TRANSPARENT) ; ?
  TextOut (hdc, xChar, yChar / 2, szTop, (sizeof szTop) - 1) ; ?
  TextOut (hdc, xChar, yChar / 2, szUnd, (sizeof szUnd) - 1) ; ?
  EndPaint (hwnd, &ps); ?
  return 0;
  该程序段首先调用InvalidateRect函数使窗口无效,InvalidateRect函数的法力是使窗口的某一部分低效,相当于通报Windows该部分必要被刷新和重画。
  在InvalidateRect函数之后,程序调用函数BeginPaint希图重画窗口。
BeginPaint 函数的原型定义如下:
HDC BeginPaint (HWND hwnd , // 重画窗口的句柄
        LPPAINTSTRUCT lpPaint // 指向3个用以保存全体重
        // 画音讯的 PAINTSTRUCT 结构体变量的指针);
  BeginPaint 函数的成效是到位重画窗体在此以前的妄想,并将重画窗体 的多里胥存在二个 PAINTSTRUCT 结构体变量中。 PAINTSTRUCT 结构体能够用于保存窗口重画时的多寡以有利于以后选拔。
PAINTSTRUCT结构体的定义如下:
typedef struct tagPAINTSTRUCT{ // ps
  HDC hdc; // 重画区域所在窗口的句柄
  BOOL fErase;// 是或不是擦去背景
  RECT rcPaint; // 内定重画窗体的限量
  BOOL fRestore; // 系统一保险留域
  BOOL fIncUpdate;// 系统一保险留域
  BYTE rgbReserved[32];// 系统一保险留
}PA INTSTRU CT;
  BeginPaint函数借使操作成功会回去1个被操作窗口的器材描述表的句柄。假设操作不成事则函数重回NULL值,表明显示设备不可用。该函数在运作进度中,会进展自动调解,使得全部区域都包含在刷新区域的范围内。而原有须要刷新的区域是由InvalidateRect函数或 Invalidate奥迪Q7gn函数钦点的。一般的话,唯有当程序管理WM_PAINT音信时才调用BeginPaint函数,而且,每一回调用BeginPaint函数都急需相应调用一个EndPaint函数来终止重画进程。在BeginPaint函数调用后,会将插入符光标自动隐藏。EndPaint函数原型定义如下:
BOOL EndPaint ( HWND hWnd, // 窗口句柄
        CONST PAINTSTRUCT* lpPaint // 指向 PAINTSTRUCT结构体变量的指针
       );
  EndPaint函数标记着窗口重画进度的终止。该函数试行后总重返1个非零值。假若在BeginPaint函数实行时将插入符号隐藏了,那么EndPaint函数会重新展现插入符号。
新闻管理函数 WndProc管理的键盘音信有:
WM_ KEYDOWN、WM_KEYUP
WM_CHAR、WM_DEADCHAR、
WM_SYSKEYDOWN、WM_SYSKEYUP、
WM_SYSCHAR 和 WM_SYSDEADCHAR。
  依照分歧的音信,程序会用区别的参数调用 ShowKey函数在窗口中体现各键盘信息的相干消息。
2.ShowKey函数
ShowKey函数是用户自定义函数,其意义是从键盘音讯的各域中提取音讯并呈现在窗口中。
ShowKey函数的切切实实定义如下:
// 成效:实今后窗口中显得按钮音信
void ShowKey (HWND hwnd, int iType, char *szMessage,WPARAM wParam, LPARAM lParam)
{
  static char *szFormat[2] = {"%-14s = %c %6u M %5s %5s %6s %6s",
                "%-14s = %c %6u M %5s %5s %6s %6s" } ;
  char szBuffer[80];
  HDC hdc;
  SelectObject( hdc,
         GetStockObject(SYSTEM_FIXED_FONT));
         TextOut (hdc, xChar, rc.bottom - yChar,
         szBuffer,wsprintf (szBuffer, szFormat [iType],
         szMessage, //消息
         wParam, //虚拟键代码
         (BYTE) (iType ? wParam : ' '),//展现字符值
         LOWOOdysseyD (lParam), //重复次数
         HIWOSportageD (lParam) & 0xFF, //OEM键盘扫描码
         //判断是不是为进步键盘的扩展键
         (PSTR) (0x01000000 & lParam ? "是" : "否"),
         //剖断是还是不是同时利用了ALT键
         (PSTR) (0x20000000 & lParam ? "是" : "否"),
         (PSTR) (0x40000000 & lParam ? "按下" : "抬起"),
         //判别前贰反扑键状态
         (PSTR) (0x80000000 & lParam ? "按下" : "抬起"))
         //判别调换状态
         );
}

  二.三设置提示器(窗格)的急剧轻风格

  ShowKey函数首先定义了szFormat字符串,并在其中针对字符新闻和非字符音信定义了三种分化的输出格式。然后调用ScrollWindowEx函数使呈现区域滚屏,为信息输出作筹划。ScrollWindowEx函数的首要职能是使窗口编辑区中的某壹矩形区域发生滚屏效果。
ScrollWindowEx函数的原型定义如下:
int ScrollWindowEx (HWND hwnd, // 爆发滚屏的窗口的句柄
          int dx, // 水平滚屏的数值
          int dy, // 垂直滚屏的数值
          CONST RECT*prcScroll,//记录发生滚屏的矩形区域的RECT结构体的地址
          CONST RECT* prcClip, //记录发生剪切的矩形区域的 RECT结构体的地点
          HEvoqueGN hrgnUpdate,// 须求更新区域的句柄
          LPRECT prcUpdate, // 记录必要更新矩形区域的 RECT结构体的地点
          UINT flags // 滚屏调节标识
          );
  当中,dx参数给出了以设施单位尺寸(对于显示器为像素)为单位的每三次水平滚屏的度量值。dx参数取正值表示向右滚屏,取负值表示向左滚屏。如参数给出了以设备单位尺寸(对于显示器为像素)为单位的每2遍垂直滚屏的衡量值。如参数取正值表示向下滚屏,取负值表示发展滚屏。dx和dy五个参数不可能同时取非零值,相当于说,ScrollWindowEx函数不能够使编辑区同时向水平和垂直方向滚屏。
  prcScroll参数为二个针对记录滚屏的矩形区域的RECT结构体变量的指针,假若取值为NULL,则整个编辑区产生滚屏。
  hrgnUpdate参数为因滚屏而变得不行的矩形区域的句柄,繁多情景下得以取NULL。 prcUpdate参数指向八个记下因为滚屏而变得不行的矩形区域的 RECT结构体变量。多数动静下取NULL。
flags变量能够透过不相同的取值来决定滚屏的现象,其取值和意义如下所示。
  SW_ ERASE当和 SW_INVALIDATE值同时选拔时,会透过向 window发送2个WM_ ERASEBKGND音讯将近年来变得不算的区域抹去;
  SW_INVALIDATE在发生滚屏后使由hrgnUpdate参数内定的区域无效;
  SW_SCROLLCHILDREN使全数的子窗口都发生滚屏;
  SW_ SMOOTHSCROLL在 Windows 玖⑤及以往的本子中使窗口发生平滑滚屏。要是ScrollWindowEx函数实行成功,则再次来到值为以下三者之1:
  SIMPLEREGION代表有3个矩形的无效区域;
  COMPLEXREGION表示一直不失效区域和重叠区域;
  NULLREGION表示未有失效区域。
  假诺ScrollWindowEx函数推行不成事,则赶回E昂科威ROBMWX3。
ScrollWindowEx函数的法力也足以透过ScrollWindow函数来贯彻,ScrollWindow 函数的原型定义如下:
BOOL Scrollwindow(HWND hwnd //窗口句柄
         int XAmount, // 水平滚屏的数值
         int YAmount, // 垂直滚屏的数值
         CONST RECT* lpReCt, //记录爆发滚屏的矩形区域的 RECT结构体的地点
         CONST RECT* lpClipRect, //记录发生剪切的矩形区域的 RECT结构体的地点
         );
  能够看看,ScrollWindow函数与ScrollWindowEx函数11分相似,其参数的含义也基本一样。事实上,ScrollWindow函数是为了维持对非常的低版本的Windows包容而布置的,用户在编制程序时,除非必要考虑程序的向下包容,不然一般都应运用ScrollWindowEx函数。
  在滚屏后,函数发轫调用TextOut函数举办消息输出。TextOut函数的原型定义如下:
BOOL TextOut( HDC hdc,// 设备描述表句柄
       int nXStart, // 文本输出开首点 X坐标
       int nYStart, // 文本输出发轫点 Y坐标
       LPCTST本田CR-V lpString, // 指向输出字符串的指针
       int cbString // 字符串中字符的多寡
       );
  TextOut函数能够用当下设定的字体在窗口的钦赐地点输出1段文本音信。如若操作成功则赶回壹非零值,不然再次回到零值。捕获键盘消息的音讯首要依据表中的叙述,通过行使按位操作规定有些特定位的值,然后再剖断具体的情景。
  在TextOut函数调用进度中,还调用了wsprintf函数,并使其再次回到值作为TextOut函数的二个参数值。wsprintf函数的原型定义如下:
int wsprintf (LPTSTRAV四 lpOut,// 指向供给输出的字符串的指针
       LPCTST纳瓦拉 lpFmt, //指向格式调整字符串的指针
       …… // 其他可选参数
       );
  wsprintf函数能够将一组字符种类按lpFmt参数钦命的格式调换,然后保留在lpOut参数内定的字符缓冲区中等待输出。在那之中,字符体系由可选参数决定,而可选参数的数目和具体内容应该与lpFmt所钦点的格式1致。
  假使wsprintf函数操作成功,则赶回输出字符的数量,但以此字符数目不包涵表示甘休的NULL标记。假诺操作失败,重返的整数值将与出口的字符数目不吻合。
  实例首要表明了什么管理键盘新闻,读者应当主要精晓各类消息在MSG结构体变量中是怎么保存的,怎样技能够对中间的切实音信进行辨别和领取。程序运营后将产生二个背景象为浅原野绿的简约窗口,并在窗口的顶上部分出现标题提醒音讯。那时用户只要张开键盘操作,则窗体中便会显得该操作所发生的键盘新闻,每展现一条音信程序都会滚屏和重绘窗口,滚屏区域的水彩为黄色。

    CStatusBar::SetPaneInfo

键盘新闻实例二:
#include <windows.h>
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int);
LRESULT CALLBACK WndProc( HWND,UINT, WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  WNDCLASSEX wcex;
  wcex.cbSize = sizeof(WNDCLASSEX);
  wcex.style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
  wcex.lpfnWndProc = (WNDPROC)WndProc;
  wcex.cbClsExtra = 0;
  wcex.cbWndExtra = 0;
  wcex.hInstance = hInstance;
  wcex.hIcon= LoadIcon(NULL, (LPCTSTR)IDI_APPLICATION);
  wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
  wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW 1);
  wcex.lpszMenuName = NULL;
  wcex.lpszClassName = "SeeKeyMessage";
  wcex.hIconSm = LoadIcon(NULL,(LPCTSTR)IDI_APPLICATION);

    void SetPaneInfo(

  if(!RegisterClassEx(&wcex)) return FALSE;

      int nIndex,  //钦命要安装其样式的窗格的岗位索引

  int SW_XFS = GetSystemMetrics(SM_CXSCREEN);
  int SW_YFS = GetSystemMetrics(SM_CYSCREEN);
  HWND hWnd;
  hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,
             "SeeKeyMessage",
             "Trace Key Operation",
             WS_OVERLAPPEDWINDOW,
             0, 0, SW_XFS, SW_YFS-25,
             NULL,
             NULL,
             hInstance,
             NULL);
  if(!hWnd) return FALSE;

      UINT nID,    //为内定窗格重置的新ID

  ShowWindow(hWnd, nCmdShow);
  UpdateWindow(hWnd);
  MSG msg;

      UINT nStyle, //窗格的体裁:SBPS_NORMAL/SBPS_STRETCH/SBPS_DISABLED/SBPS_POPOUT/SBPS_NOBORDERS

  while(GetMessage(&msg, NULL, 0, 0))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
  HDC hDC;
  PAINTSTRUCT ps;
  static char Buffer[256];
  switch(message)
  {
    case WM_KEYDOWN:
    hDC = GetDC(hWnd);
    wsprintf(Buffer," ");
    TextOut(hDC,20,40,Buffer,strlen(Buffer));
    wsprintf(Buffer," WM_KEYDOWN = ==", wParam,LOWORD(lParam),HIWORD(lParam));
    TextOut(hDC,20,40,Buffer,strlen(Buffer));
    ReleaseDC(hWnd,hDC);
    break;

      int cxWidth  //内定窗格的宽度

    case WM_KEYUP:
    hDC = GetDC(hWnd);
    wsprintf(Buffer," ");
    TextOut(hDC,20,60,Buffer,strlen(Buffer));
    wsprintf(Buffer," WM_KEYUP = = =",wParam,LOWORD(lParam),HIWORD(lParam));
    TextOut(hDC,20,60,Buffer,strlen(Buffer));
    ReleaseDC(hWnd,hDC);
    break;

    );

    case WM_PAINT:
    hDC = BeginPaint(hWnd,&ps);
    wsprintf(Buffer," ");
    TextOut(hDC,20,20,Buffer,strlen(Buffer));
    wsprintf(Buffer," Message wParam LOWORD(lParam) HIWORD(lParam)");
    TextOut(hDC,20,20,Buffer,strlen(Buffer));
    EndPaint(hWnd,&ps);
    break;

  二.四装置提示器(窗格)的文件内容

    case WM_DESTROY:
    PostQuitMessage(0);
    break;

    CStatusBar::SetPaneText

    default:
    return DefWindowProc(hWnd,message,wParam,lParam);
  }
  return 0;
}

    BOOL SetPaneText(

鼠标音信

      int nIndex,  //当前窗格在提醒器数组(indicators)中的地方索引

  随着 Windows 操作系统的风行,鼠标因为其正确定位和操作方便的独到之处而改为Computer不可缺点和失误的输入设备。
一、鼠标的基础知识
  本节将介绍在先后中用鼠标作为输入设备的点子和技术。 1.鼠标操作和鼠标音讯用户在动用鼠标操作的进度中,平常会利用的主要方法有种种,如表所示。

      LPCTST君越 lpszNewText,  //要在当下窗格中显得的文件

操作名称 描述
单击(Click) 按下并神速释放鼠标开关。
双击(Double Click) 一而再火速产生一遍单击操作。
运动(Move) 鼠标光标移动。
拖动(Drag) 按下鼠标壹键不放,同时推行鼠标移动操作。
与键盘的独特键组合 在按下Ctrl键或Shift键的同时试行鼠标单击操作。

      BOOL bUpdate = TRUE

  在那之中,前二种操作是最为基本的操作,能够生出Windows内部定义的音信,并透过那些新闻来判定用户切实实施了哪一类操作。
  Windows定义的鼠标新闻共有20条,个中国和南美洲编辑区的鼠标新闻一般交由系统管理,程序只管理编辑区内的鼠标新闻。编辑区内的鼠标音讯共有拾条,如表所示。

    );

音讯常量 操作描述
WM_MOUSEMOVE 移动鼠标
WM_LVBUTTONDOWN 按下鼠标左键
WM_LBUTTONUP 释放鼠标左键
WM_LBUTTONDBLCLK 双击鼠标左键
WM_HavalVBUTTONDBLCLK 按下鼠标右键
WM_RBUTTONUP 释放鼠标右键
WM_RBUTTONDBLCLK 双击鼠标右键
WM_MVBUTTONDOWM 按下鼠标中键
WM_MBUTTONUP 释放鼠标中键
WM_MBUTTONDBLCLK 双击鼠标中键

    若不知情当前窗格在提示器数组(indicators)中的地方索引,可采纳CStatusBar::CommandToIndex

  对于前表所列的鼠标操作中的最终两种,不能够一直运用Windows定义的新闻来判定,只可以通过编制程序,将八种消息和数码整合之后判别。比如,剖断用户是不是按下鼠标左键之后举办拖动操作能够由此以下程序段来促成,用case语句来达成:
case WM_MOUSEMOVE:

    int CommandToIndex( UINT nIDFind );  //依照钦命的能源ID得到相应的地点索引

if (wParam&MK_LBUTTON) //只管理鼠标拖动的音讯
{ …… // 管理程序
}

 

  在拍卖鼠标音信的长河中,信息的wParam参数和lParam参数起了重大的职能。wParam参数中保存了在新闻爆发时其余操作实行的意况;用户能够透过位屏蔽操作来判别在该消息发出的还要,其他操作是还是不是正在拓展。那多亏在程序中判定复杂鼠标操作的为主办法。举例,上面判定拖动操作的程序段就用了位操作 wParam& MK_LBUTTON, 剖断在鼠标移动(WM_MOUSEMOVE)的同时鼠标左键是不是同时被接收。要是,鼠标左键同时按下,则位操作的结果为TRUE,表明当前操作为拖动操作,程序能够承接开始展览下一步管理。又如必要判断单击鼠标左键时是否同时按下了Ctrl键或Shift键,能够用来下程序段来管理:
case WM_ LBUTTONDOWN:
if(wParam& MK_CTROL)
{//Ctrl键同时按下
  if (wParam&MK_ SHIFT)
  {// Ctrl 键和Shift键都同时按下
    …… // 管理程序
  }
  else { // Ctrl健同时按下,但 Shift键未有被按下
    ……. // 处理程序
  }
}
else if(wParam&MK_ SHIFT)
{ // Shift键同时按下,但 Ctrl键没有被吸纳
  …… // 管理程序
}
else
{// Shift 键和Ctrl键都未按下
  …… // 处理程序
}
  lParam参数保存了音信发出时鼠标所在点的坐标,当中低16人为X坐标,高13人为Y坐标。
  在管理鼠标新闻的时候,假如必要管理鼠标双击音讯,则在注册窗口类时,窗口的作风必须总结CS_DBCLCKS。不然即便试行了双击操作,窗口也只能接受两条WM_ BUTTONUP和 WM_澳门新萄京官方网站:文章相当短很周到,应用程序中贯彻颜色选用组合框。BUTTONDOWN消息。分裂双击操作和三次单击操作是以三次击键的时光距离为专门的学问的。当两回击键的时光间隔小于 500纳秒时, Windows将其视为双击操作:即使五遍击键的大运距离大于500纳秒,Windows将其身为两遍单击操作。500飞秒为私下认可的岁月距离,用户能够透过调用SetDoubleClick提姆e函数来修改那10二五日子间隔。SetDoubleClickTime函数的原型定义如下:
BOOL SetDoubleClickTime(UINT uInterval // 新的击键时间距离)
二.鼠标捕捉
  在一般状态下,只有当鼠标位于窗体内时,窗体本事吸收接纳到鼠标的新闻。假如急需收取全数的鼠标音讯而不论是鼠标是不是在窗口内,那时能够调用SetCapture函数来落到实处。SetCapture函数的原型定义如下:
HWND SetCapture (
  HWND hwnd // 窗口句柄
);
  调用SetCapture函数后,全部鼠标操作所产生的音讯都直接发送到钦点窗口。因为此时鼠标也许位于窗口之外,所以鼠标的坐标大概为负值。由于调用该函数会使别的窗口无法吸收接纳到键盘和鼠标的新闻,因而在完毕操作后应即时调用ReleaseCapture 函数释放鼠标捕获。ReleaseCapture函数的原型定义如下:
BOOL ReleaseCapture(VOID);
2、鼠标应用实例
上面是2个在程序设计中如何捕获鼠标音信的实例。
#include <windows.h>
//全局变量
WNDCLASSEX wnd;
static char szAppName[] = "mouse";//窗口类名
//函数注明
long WINAPI WndProc (HWND, UINT, WPARAM, LPARAM);
BOOL MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE hInstance, int iCmdShow);
//函数:WinMain
//作用:入口函数
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow) ?
{
  MSG msg;
  if(!MyRegisterClass(hInstance))
  {
    return FALSE;
  }

本例将要情景栏上呈现当前系统的小时和2个进程条控件:

  if(!InitInstance(hInstance,iCmdShow))
  {
    return FALSE;
  }

  一、展现系统时间

  while (GetMessage (&msg, NULL, 0, 0))
  {
    TranslateMessage (&msg);
    DispatchMessage (&msg);
  }
  return msg.wParam;
}
//函数:WndProc
//功能:管理主窗口的音讯
long WINAPI WndProc (HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
  static POINT points[256];//保存点坐标
  static POINT center;//保存中央点坐标
  static int iCount;//点数目累加值
  HDC hdc;
  PAINTSTRUCT ps;
  int i;//循环计数
  RECT rect;
  switch (msg)
  {
    case WM_MBUTTONDOWN:
    //管理鼠标中键按下的新闻
    iCount = 0;//重新先导化点数目
    InvalidateRect (hwnd, NULL, TRUE);
    //通告系统重画窗口
    hdc = BeginPaint (hwnd,&ps);
    GetClientRect(hwnd,&rect);
    if(wParam&MK_CONTROL)//决断Shift键和Ctrl键是或不是被按下
    {
      if(wParam&MK_SHIFT)
      { //遵照分化的动静提交不一样的唤起
        DrawText(hdc,"Ctrland Shift", -1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER?);
      }
      else
      {
        DrawText(hdc,"Ctrl Only" ,-1,&rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
      }
    }
    else if(wParam&MK_SHIFT)
    {
      DrawText(hdc,"Shift Only",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
    }
    else
    {
      DrawText(hdc,
           "Middle Button of mouse only",
           -1,
           &rect,
           DT_SINGLELINE|DT_CENTER|DT_VCENTER);
    }
    EndPaint(hWnd,&ps);
    return 0;

  在程序财富窗口中的字串表中追加八个新的字符串财富:

    case WM_RBUTTONDOWN:
    //管理鼠标右键按下的新闻
    iCount = 0;//重新开始化点数目
    center.x=LOWORD (lParam);
    //保存新的为主点坐标
    center.y=HIWORD (lParam);
    InvalidateRect (hwnd, NULL, TRUE);//文告系统重画窗口
    return 0;

  澳门新萄京官方网站 5

    case WM_MOUSEMOVE://管理鼠标移动的音信
    if (wParam & MK_LBUTTON && iCount < 25陆)//只管理鼠标拖动的新闻
    {
      points[iCount].x = LOWOGL450D (lParam);//保存点的X坐标
      points[iCount ].y = HIWOSportageD (lParam);//保存点的Y坐标
      hdc = GetDC (hwnd);//获得窗口的设备描述表句柄
      SetPixel (hdc, LOWORD (lParam), HIWORD (lParam), 0L);//绘点
      ReleaseDC (hwnd, hdc);//释放设备描述表句柄
    }?return 0;

  将那七个新的字符串财富ID增添到CMainFrame类的源文件中的indicators数组中:  

    case WM_LBUTTONUP:
    //管理鼠标左键抬起的新闻
    InvalidateRect (hwnd, NULL, FALSE);
    //通告系统重画窗口
    return 0;

static UINT indicators[] =
{
    ID_SEPARATOR,           

    IDS_TIMER,
    IDS_PROGRESS,

    ID_INDICATOR_CAPS,
    ID_INDICATOR_NUM,
    ID_INDICATOR_SCRL,
};

    case WM_PAINT://管理窗口重画的新闻
    hdc = BeginPaint (hwnd, &ps);//获得设备描述表句柄
    SetCursor (LoadCursor (NULL, IDC_WAIT));//设置新的鼠标光标
    ShowCursor (TRUE);//显示鼠标光标
    for (i = 0 ; i < iCount ; i )
    {
      MoveToEx(hdc, center.x, center.y,NULL);//绘制直线
      LineTo(hdc, points.x, points.y);
    }
    ShowCursor(FALSE);//隐藏鼠标
    SetCursor(LoadCursor (NULL, IDC_ARROW));
    //复苏原来的鼠标光标 ?
    EndPaint(hwnd, &ps);
    return 0;

  利用CTime类的静态成员函数GetCurrentTime获取系统当下的光阴对象;再调用CTime类的另多少个成员函数Format对得到的年华对象开始展览格式化,获得一个分包格式化时间的字符串;调用SetPaneInfo函数修改窗格的展现上升的幅度以装下将要显示的字符串文本;调用SetPaneText函数将该字符串展现到状态栏的窗格中;  

    case WM_DESTROY://管理销毁窗口的音信
    PostQuitMessage (0);
    return 0;
  }
  return DefWindowProc (hwnd, msg, wParam, lParam);
}
//函数:MyRegisterClass
//作用:注册窗口类
BOOL MyRegisterClass(HINSTANCE hInstance)
{
  wnd.cbSize= sizeof (wnd);
  wnd.style= CS_HREDRAW | CS_VREDRAW;
  wnd.lpfnWndProc = WndProc;
  wnd.cbClsExtra = 0;
  wnd.cbWndExtra = 0;
  wnd.hInstance = hInstance;
  wnd.hIcon = LoadIcon (NULL, IDI_APPLICATION);
  wnd.hCursor = LoadCursor (NULL, IDC_ARROW);
  wnd.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
  wnd.lpszMenuName= NULL;
  wnd.lpszClassName = szAppName;
  wnd.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
  return RegisterClassEx (&wnd);
}
//函数:InitInstance
//作用:创设窗口
BOOL InitInstance(HINSTANCE hInstance, int iCmdShow)
{
  HWND hwnd;
  hwnd = CreateWindow(szAppName,
            "追踪鼠标移动",
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT,
            CW_USEDEFAULT, CW_USEDEFAULT,
            NULL, NULL, hInstance, NULL);
  if(!hwnd) return FALSE;
  ShowWindow (hwnd, iCmdShow);
  UpdateWindow (hwnd);
  return TRUE;
}
  例题的机要功用是在窗口中有个别地方单击鼠标右键时,程序保存捕获的鼠标点处的坐标。紧接着按下鼠标左键在窗口中拖动,程序会记录下鼠标运动的轨道,并以刚才右击鼠标时鲜明的点为骨干绘制壹簇射线。本实例最多能够绘制25陆条射线。程序的另一指标是为了让读者越来越询问怎么着捕获鼠标与Ctrl键或 Shift键组合时的叶影参差鼠标音信。倘若在窗口中单击鼠标中键,程序会在窗口主题展现文本音信表明用户是不是还要按下Ctrl键和Shift键。
  源文件与本书后边所介绍的别的实例同样,都有所焦点的 Windows API 程序的协会。即以WinMain函数作为程序入口,调用MyRegisterClass函数和InitInstance函数注册窗口类和创建窗口,再进来消息循环。并在消息循环中调用WndProc函数管理鼠标音信。上边首要介绍WndProc函数管理鼠标消息的主意和本领。
  在例中WndProc函数能够管理的音信包罗WM_MBUTTONDOWN、WM_RBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP和WM_PAINT。
处理WM_ MBUTTONDOWN新闻的程序段如下:
case WM_MBUTTONDOWN:
//管理鼠标中键按下的音信
iCount = 0;//重新早先化点数目
InvalidateRect (hwnd, NULL, TRUE);//布告系统重画窗口
hdc = BeginPaint (hwnd,&ps);
GetClientRect(hwnd,&rect);
if(wParam&MK_CONTROL)//决断Shift键和Ctrl键是不是被按下
{
  if(wParam&MK_SHIFT)
  { //依照分化的情形提交分歧的提醒
    DrawText(hdc,"Ctrland Shift", -1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
  }
  else
  {
    DrawText(hdc,"Ctrl Only" ,-1,&rect,
    DT_SINGLELINE|DT_CENTER|DT_VCENTER);
  }
}
else
{
  if(wParam&MK_SHIFT)
  {
    DrawText(hdc,"Shift Only",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
  }
  else
  {
    DrawText(hdc,"Middle Button of mouse only",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
  }
}
EndPaint(hWnd,&ps);
return 0;
  这种论断复杂鼠标操作的章程在基础知识部分已经详细介绍过,这里不再赘述。那1段程序的功力是依靠在按下鼠标中键的同时,再按Ctrl键或Shift键的比不上景况而在窗口中输出分裂的音讯。
处理WM_ RBUTTONDOWN音讯的程序段如下:
case WM_RBUTTONDOWN://管理鼠标右键按下的消息
iCount = 0;//重新开头化点数目
center.x=LOWOCRUISERD (lParam);//保存新的骨干点坐标
center.y=HIWORD (lParam);
InvalidateRect (hwnd, NULL, TRUE);//文告系统重画窗口
return 0;
  那一段程序的机要功能是将鼠标右击点的坐标保存在POINT结构体变量center中,再将计数变量iCount归零,为绘制一簇射线作企图。实现上述职业后,程序调用InvalidateRect函数布告系统重画窗口,将窗口中原始的射线族擦去。管理WM_MOUSEMOVE音信的程序段如下:
case WM_MOUSEMOVE://管理鼠标移动的音信
if (wParam & MK_LBUTTON && iCount<25六)//只管理鼠标拖动的新闻
{
  points[iCount].x = LOWO哈弗D (lParam);//保存点的X坐标
  points[iCount ].y = HIWO奥德赛D (lParam);//保存点的Y坐标
  hdc = GetDC (hwnd);//获得窗口的设备描述表句柄
  SetPixel (hdc, LOWORD (lParam), HIWORD (lParam), 0L);
  //绘点
  ReleaseDC (hwnd, hdc);//释放设备描述表句柄
}
  事实上,该程序只是管理鼠标左键拖动操作的消息。在试行拖动操作的长河中,程序不断将鼠标点的坐标识录在points数组中。points数组是 WndProc函数中定义的一个静态的POINT结构体数组。在记录点坐标的还要,程序调用了SetPixel函数在窗口上的绘制点,对被记录的点举行标记。对于WM_ LBUTTONUP音信,程序只调用了IvalidateRect函数公告系统拖动操作已经终止,能够开始绘制射线族了。
处理WM _PAINT新闻的程序段如下:
case WM_PAINT://管理窗口重画的音信
hdc = BeginPaint (hwnd, &ps);//得到设备描述表句柄
SetCursor (LoadCursor (NULL, IDC_WAIT));//设置新的鼠标光标
ShowCursor (TRUE);//展现鼠标光标
for (i = 0 ; i < iCount ; i )
{
  MoveToEx(hdc, center.x, center.y,NULL);//绘制直线
  LineTo(hdc, points.x, points.y);
}
ShowCursor(FALSE);//隐藏鼠标
SetCursor(LoadCursor (NULL, IDC_ARROW));
//恢复生机原先的鼠标光标
EndPaint(hwnd, &ps);
return 0;
  以上程序的效果是贯彻射线族的绘图。程序行使了2个for循环,循环次数为iCoun变量记录的罗列。在循环体中往往调用 MoveToEx函数和 LineTo函数绘制直线。MoveToEx函数使直线的源点回到有center变量记录的大旨,LineTo函数达成由中间向points数组中的各点绘制直线。
  在处理WM_PAINT音讯的先后中还动用了SetCursor函数和ShowCursor函数。SetCursor函数能设定1个鼠标Logo,ShowCursor函数能将设定好的Logo显示出来。在本实例中,调用那七个函数的指标是当程序绘制射线族的时候将鼠标Logo转变到停车计时器图案,表示程序正在施行某次操作。当给制完成后,又再一次设置鼠标图像为箭头图标。
  程序运维后,首先生成三个窗口,等待用户施行鼠标操作。用户右击后,再按下鼠标左键并拖动,则程序会绘制出1簇美丽的射线。运营结果如图所示。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    ......

    CTime t=CTime::GetCurrentTime();
    CString str=t.Format("%Y-%m-%d %H:%M:%S");
    CClientDC dc(this);
    CSize sz=dc.GetTextExtent(str);
    m_wndStatusBar.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,sz.cx);
    m_wndStatusBar.SetPaneText(1,str);
    
    return 0;
}

 

  此时在意况栏窗格中显示的年月是平稳的,利用反应计时器每隔1秒就发送WM_TIME逍客音信,在音讯响应函数OnTimer中再次获得一回系统当下光阴并突显到状态栏窗格中,已落得展现动态时间的效益;

鼠标音信实例二
#include <windows.h>
int WINAPI WinMain(HINSTANCE, HINSTANCE,LPSTR,int);
LRESULT CALLBACK WndProc(HWND,UINT, WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
  WNDCLASSEX wcex;
  wcex.cbSize = sizeof(WNDCLASSEX);
  wcex.style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;
  wcex.lpfnWndProc = (WNDPROC)WndProc;
  wcex.cbClsExtra = 0;
  wcex.cbWndExtra = 0;
  wcex.hInstance = hInstance;
  wcex.hIcon = LoadIcon (NULL,(LPCTSTR)IDI_APPLICATION);
  wcex.hCursor = LoadCursor (NULL,IDC_ARROW);
  wcex.hbrBackground = (HBRUSH) (COLOR_WINDOW 1);
  wcex.lpszMenuName = NULL;
  wcex.lpszClassName = "SeeMouseMessage";
  wcex.hIconSm = LoadIcon(NULL,(LPCTSTR)IDI_APPLICATION);
  if(!RegisterClassEx(&wcex)) return FALSE;
  int SW_XFS = GetSystemMetrics(SM_CXSCREEN);
  int SW_YFS = GetSystemMetrics(SM_CYSCREEN);
  HWND hWnd;
澳门新萄京官方网站:文章相当短很周到,应用程序中贯彻颜色选用组合框。  hWnd = CreateWindowEx(WS_EX_CLIENTEDGE,
             "SeeMouseMessage",
             "Trace Mouse Operation",
             WS_OVERLAPPEDWINDOW,
             0,
             0,
             SW_XFS,
             SW_YFS-25,
             NULL,
             NULL,
             hInstance,
             NULL);
  if(!hWnd) return FALSE;
  ShowWindow(hWnd, nCmdShow);
  UpdateWindow(hWnd);
  MSG msg;

  在CMainFrame类的OnCreate函数中埋下机械漏刻: 

  while(GetMessage(&msg, NULL, 0, 0))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return msg.wParam;
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    ......
    
    SetTimer(1,1000,NULL);
    
    return 0;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
  HDC hDC;
  PAINTSTRUCT ps;
  static char Buffer[256];
  switch(message)
  {
    case WM_MOUSEMOVE:
    hDC = GetDC(hWnd);
    wsprintf(Buffer," ");
    TextOut(hDC,20,40,Buffer,strlen(Buffer));
    wsprintf(Buffer," WM_MOUSEMOVE x = =", wParam,LOWORD(lParam),HIWORD(lParam));
    TextOut(hDC,20,40,Buffer,strlen(Buffer));
    ReleaseDC(hWnd,hDC);
    break;

  为CMainFrame类添加WM_TIME牧马人音讯,生成音讯响应函数OnTimer,在该函数中再一次推行一回系统时间的得到并展示到状态栏窗格中: 

    case WM_LBUTTONDOWN:
    hDC = GetDC(hWnd);
    wsprintf(Buffer," ");
    TextOut(hDC,20,60,Buffer,strlen(Buffer));
    wsprintf(Buffer," WM_LBUTTONDOWN x = =", wParam,LOWORD(lParam),HIWORD(lParam));
    TextOut(hDC,20,60,Buffer,strlen(Buffer));
    ReleaseDC(hWnd,hDC);
    break;

void CMainFrame::OnTimer(UINT nIDEvent) 
{
    // TODO: Add your message handler code here and/or call default

    CTime t=CTime::GetCurrentTime();
    CString str=t.Format("%Y-%m-%d %H:%M:%S");
    CClientDC dc(this);
    CSize sz=dc.GetTextExtent(str);
    m_wndStatusBar.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,sz.cx);
    m_wndStatusBar.SetPaneText(1,str);
    
    CFrameWnd::OnTimer(nIDEvent);
}

    case WM_LBUTTONUP:
    hDC = GetDC(hWnd);
    wsprintf(Buffer," ");
    TextOut(hDC,20,80,Buffer,strlen(Buffer));
    wsprintf(Buffer," WM_LBUTTONUP x = =", wParam,LOWORD(lParam),HIWORD(lParam));
    TextOut(hDC,20,80,Buffer,strlen(Buffer));
    ReleaseDC(hWnd,hDC);
    break;

  2、进度条控件

    case WM_LBUTTONDBLCLK:
    hDC = GetDC(hWnd);
    wsprintf(Buffer," ");
    TextOut(hDC,20,100,Buffer,strlen(Buffer));
    wsprintf(Buffer," WM_LBUTTONDBLCLK x = =", wParam,LOWORD(lParam),HIWORD(lParam));
    TextOut(hDC,20,100,Buffer,strlen(Buffer));
    ReleaseDC(hWnd,hDC);
    break;

  要在先后中接纳进程栏,首先须求协会一个CProgressCtrl对象,然后调用CProgressCtrl类的Create函数创制进程栏控件;

    case WM_RBUTTONDOWN:
    hDC = GetDC(hWnd);
    wsprintf(Buffer," ");
    TextOut(hDC,20,120,Buffer,strlen(Buffer));
    wsprintf(Buffer," WM_RBUTTONDOWN x = =", wParam,LOWORD(lParam),HIWORD(lParam));
    TextOut(hDC,20,120,Buffer,strlen(Buffer));
    ReleaseDC(hWnd,hDC);
    break;

    BOOL Create(

    case WM_RBUTTONUP:
    hDC = GetDC(hWnd);
    wsprintf(Buffer," ");
    TextOut(hDC,20,140,Buffer,strlen(Buffer));
    wsprintf(Buffer," WM_RBUTTONUP x = =", wParam,LOWORD(lParam),HIWORD(lParam));
    TextOut(hDC,20,140,Buffer,strlen(Buffer));
    ReleaseDC(hWnd,hDC);
    break;

      DWO卡宴D dwStyle,  //进程栏控件的类型,窗口全数的类型 PBS_VERTICAL(进程栏垂直)/PBS_SMOOTH(进程栏延续)

    case WM_RBUTTONDBLCLK:
    hDC = GetDC(hWnd);
    wsprintf(Buffer," ");
    TextOut(hDC,20,160,Buffer,strlen(Buffer));
    wsprintf(Buffer,"WM_RBUTTONDBLCLK x = =", wParam,LOWORD(lParam),HIWORD(lParam));
    TextOut(hDC,20,160,Buffer,strlen(Buffer));
    ReleaseDC(hWnd,hDC);
    break;

      const RECT& rect,  //进程栏控件的大大小小、地方

    case WM_PAINT:
    hDC = BeginPaint(hWnd,&ps);
    wsprintf(Buffer," ");
    TextOut(hDC,20,20,Buffer,strlen(Buffer));
    wsprintf(Buffer," Message wParam x y");
    TextOut(hDC,20,20,Buffer,strlen(Buffer));
    EndPaint(hWnd,&ps);
    break;

      CWnd* pParentWnd,  //进程栏的父窗口

    case WM_DESTROY:
    PostQuitMessage(0);
    break;

      UINT nID   //钦赐进度栏控件的ID

    default:
    return DefWindowProc(hWnd,message,wParam,lParam);
  }
  return 0;
}

    );

  在程序的CMainFrame类中增多成员变量:CProgressCtrl m_progress

    澳门新萄京官方网站 6

  要在状态栏的窗格中展现进程栏,首先利用GetItemRect函数获得该窗格的区域大小:

    void GetItemRect(int nIndex, LPRECT lpRect ) const;

    nIndex:内定窗格的地点索引

    lpRect:窗格的矩形区域

  

  当程序窗口第叁遍显示时就能发送WM_PAINT音讯,而且当程序的窗口尺寸发生变化须要重绘时也会发送WM_PAINT消息,故可在WM_PAINT音信的响应函数中推断,若程序还未创设进程栏则创设它,若已开立则将进程栏移动至指标窗格的矩形区域中;

  为CMainFrame类添加WM_PAINT音讯的响应函数:

  澳门新萄京官方网站 7  

void CMainFrame::OnPaint() 
{
    CPaintDC dc(this); // device context for painting
    
    // TODO: Add your message handler code here
    CRect rect;
    m_wndStatusBar.GetItemRect(2,&rect);  //获得状态栏中窗格的矩形区域
    if(!m_progress.m_hWnd){   //判断当m_progress对象的句柄为NULL时,说明该对象还未创建,则创建进度栏
        m_progress.Create(WS_CHILD|WS_VISIBLE,rect,&m_wndStatusBar,123);  //创建进度栏
    }else{
        m_progress.MoveWindow(rect);  //将进度栏移至目标矩形中
    }
    
    m_progress.SetPos(50);  //设置进度栏的当前进度
    
    // Do not call CFrameWnd::OnPaint() for painting messages
}

  若要达成速度栏进度的动态扩张,要求选取电磁照管计时器,在WM_TIME库罗德新闻的响应函数OnTimer函数中落实:  

void CMainFrame::OnTimer(UINT nIDEvent) 
{
    ......

    m_progress.StepIt();
    
    CFrameWnd::OnTimer(nIDEvent);
}

    CProgressCtrl::StepIt:使进度栏控件的进程依照一定的大幅增添

    CProgressCtrl::SetStep:设置进程栏每趟增添的肥瘦

    CProgressCtrl::SetRange:设置进程栏的限量,默认为0~100

  3、在场所栏上展现鼠标当前的职位

    当在先后的客户区窗口移动鼠标时,将鼠标当前的坐标地方展现在状态栏的指示行上;

    首先供给在先后的CStyleView类中加多WM_MOUSEMOVE新闻的响应函数:

      澳门新萄京官方网站 8

    因为GetParent函数再次回到的为CWnd类型的指针,供给强制转变为CMainFrame类型的指针,故须在视图类的源文件中富含框架类的头文件:

      #include "MainFrm.h"

    在WM_MOUSEMOVE音信的响应函数中,达成状态栏对象的得到及在其窗格中的文本展现:      

void CStyleView::OnMouseMove(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    CString str;
    str.Format("x=%d,y=%d",point.x,point.y);  //格式化鼠标坐标位置的信息
    //通过调用GetParent函数获取视图类的父窗口即框架类窗口,将返回值强制转换后,调用框架窗口对象中的状态栏成员变量
    ((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);
    
    CView::OnMouseMove(nFlags, point);
}

    将鼠标当前地方音讯展现到状态栏对象的提示行中的方法:

      方法一:SetWindowText

        框架类CMainFrame类的情况栏成员变量m_wndStatusBar暗中认可在CMainFrame类的头文件中被定义为protected类型,须手动将其修改为public类型手艺被调用;

      方法2:CFrameWnd类的分子函数:SetMessageText

        该函数的意义即为在ID为0的境况栏窗格(即提醒行)设置一个字符串;因先后框架类CMainFrame类派生于CFrameWnd类,故这里能够一贯用框架类对象调用该成员函数来安装情形栏文本;        

void CStyleView::OnMouseMove(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    CString str;
    str.Format("x=%d,y=%d",point.x,point.y);
    //((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);
    ((CMainFrame*)GetParent())->SetMessageText(str);
    
    CView::OnMouseMove(nFlags, point);
}

      方法3:CFrameWnd类的分子函数:GetMessageBar

        该函数重回状态栏对象的指针,故无须像方法1那样修改并调用CMainFrame类的保安成员变量m_wndStatusBar了,可直接调用SetWindowText函数设置状态栏的首先个窗格(提醒行)的文书;       

void CStyleView::OnMouseMove(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    CString str;
    str.Format("x=%d,y=%d",point.x,point.y);
    //((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);
    //((CMainFrame*)GetParent())->SetMessageText(str);
    ((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);
    
    CView::OnMouseMove(nFlags, point);
}

      方法四:CWnd类的分子函数:GetDescendantWindow

        该函数可通过点名的ID来获得当前窗口的有着子孙窗口,因地方栏属于框架类窗口,故先要获得框架类窗口的指针,然后依照状态栏的窗口ID调用该函数到手状态栏对象的指针       

void CStyleView::OnMouseMove(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    CString str;
    str.Format("x=%d,y=%d",point.x,point.y);
    //((CMainFrame*)GetParent())->m_wndStatusBar.SetWindowText(str);
    //((CMainFrame*)GetParent())->SetMessageText(str);
    //((CMainFrame*)GetParent())->GetMessageBar()->SetWindowText(str);
    GetParent()->GetDescendantWindow(AFX_IDW_STATUS_BAR)->SetWindowText(str);
    
    CView::OnMouseMove(nFlags, point);
}

 

本文由澳门新萄京官方网站发布于澳门新萄京官方网站,转载请注明出处:澳门新萄京官方网站:文章相当短很周到,应用

关键词: