您的位置:新葡亰496net > 电脑系统 > 新葡亰496net文章非常短很周到,应用程序中实现

新葡亰496net文章非常短很周到,应用程序中实现

发布时间:2019-06-16 11:22编辑:电脑系统浏览(105)

    CHECKE奥迪Q71程序将客户细分分为二十二个矩形,构成贰个5*5的数组。假若在内部三个矩形内单击鼠标,就用X形填充该矩形。再度单击,则X形消失。

         前面的一篇文章里面,作者模仿那本优异的书写了贰个windows程序, 对windows的顺序设计有了一丝丝的神志认知, 但是对于程序的计划还是管窥之见,由此须求延续自学, 接着看那本优秀的书......

    相信读者对象们对OFFICE2000毫无疑问特别熟谙吧,它在那之中的东东可真十分多,不管是活泼可爱的"大眼夹",依然种种平面造型的Windows控件都非常受左近用户喜好。那么此番就让大家来效仿它做个要命常用的控件:"颜色组合框"。即便你以往正值做关于字处理类的软件时这几个"东东"一定对您有用。程序编写翻译运维后的分界面效果如图一所示:

    1、相关类

    在Microsoft Windows 中,键盘和鼠标是七个正规的用户输入源,在某个交叠的操作中一般互相补充使用。当然,鼠标在明天的应用程序中比10年前使用得愈加普遍。以致在部分应用程序中,我们更习惯于选用鼠标,比如在玩乐、画图程序、音乐程序,以及Web创览器等次第中就是这样。但是,大家得以不使用鼠标,但相对无法从一般的PC中拆掉键盘。
      相对于个人Computer的别的零件,键盘有不行持久的历史,它源点于1874年的第一台Remington打字机。早先时代的计算机程序猿用键盘在 霍勒ith卡牌上打孔,现在在哑终端上用键盘直接与大型主机通信。PC上的键盘在好几方面拓展了增加,包罗了功用键、光标定位键和(日常都包含的)单独的机械键盘,但它们的输入原理基本一样。

    新葡亰496net 1新葡亰496net 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程序得到键盘输入的艺术:键盘输入以音讯的款型传递给程序的窗口进度。实际上,第二次学习音讯时,键盘正是贰个显明的例子:新闻应该传递给应用程序的消息连串。
      Windows用8种不相同的音讯来传递不相同的键盘事件。那看似太多了,可是(就像大家所见到的一致)程序能够忽略当中至少八分之四的消息而不会有其余难点。并且,在大多数状态下,那一个音信中富含的键盘新闻会多于程序所急需的。管理键盘的有个别职业正是甄别出怎么着音讯是重视的,哪些是不根本的。
    一、键盘基础知识
      纵然应用程序在无数意况下得以因此鼠标完成新闻的输入,但到现行反革命告竣键盘依然是PC机中不得代替的重要输入设备。
      用键盘当作输入设备,每当用户按下或释放某三个键时,会发出多少个搁浅,该中断激活键盘驱动程序KEYBOAPRADOD.D本田CR-VV来对键盘中断进行管理。 KEYBOA卡宴D.D卡宴V程序会基于用户的两样操作举办编码,然后调用Windows用户模块USEWrangler.EXE生成键盘新闻,并将该新闻发送到音信队列中等候管理。
    1.扫描码和虚拟码
      扫描码对应着键盘上的区别键,每五个键被按下或自由时,都会生出贰个唯一的扫描码作为作者的标志。扫描码依赖于实际的硬件装置,即当一样的键被按下或自由时,在差异的机器上恐怕发生差异的扫描码。在程序中一般使用由Windows系统定义的与实际设备无关的虚拟码。在击键发生扫描码的还要,键盘驱动程序KEYBOARD.D奥迪Q5V截取键的扫描码,然后将其翻译成对应的虚拟码,再将扫描码和虚拟码一同编码产生键盘新闻。所以,最终发送到信息队列的键盘新闻中,既涵盖了扫描码又带有了虚拟码。
      常常选用的虚拟码在WINDOWS.H文件中定义,常用虚拟码的数值、常量符号和含义如表所示。

    CHECKER1.C

    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消息

      首先让大家先来明白一下画控件的基本原理和经过,可能这几个才是本文的本意。我们都驾驭Windows中兼有可视的东西都是画出来的,那么那么些画画的中间进度又是如何的吧?一般画Windows控件的历程分成三超越四分之二:一是在WM_MEASUREITEM新闻影射函数中设置当前要画的Item的高低尺寸;二是在WM_DRAWITEM音讯影射函数中依照Item的轻重尺寸来画该Item(Logo/位图/字符串等);三是在WM_PAINT音讯映射函数中连连的绘图当前的控件内容。

      2.1创制状态栏 CStatusBar::CreateEx / CStatusBar::Create

    取值(16进制) 常量符号 含义
    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-19 -- 汉字系统一保险留
    1A -- 未定义
    1B VK_ESCAPE Esc键
    1C-1F -- 汉字系统一保险留
    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_NUMPAD9 小键盘数字键0-9
    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本田CR-V1程序展现结果如图所示:

     或者产生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函数获取器具内容的属性值
    新葡亰496net文章非常短很周到,应用程序中实现颜色采纳组合框。       3、能够呼叫GDI函数改造设备内容的属性值
           4、利用此外GDI函数在突显区域绘图
           5、当程序在展现区域绘图达成后,必须自由设备内容句柄, 被放走的句柄无法再被采用
           6、程序必须在管理单个新闻管理时期获得和假释设备内容句柄。
           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;
              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会将该组织的一10%员填充好,应用程序只行使前四个字段,其余由windows内部使用。
               呼叫BeginPaint函数时填充ps.f伊拉斯e字段来代表是不是已经擦除无效区域的背景:
                      ps.f伊拉斯e = FALSE (0) 则意味着曾经擦除无效区域背景;同有的时候候windows会利用wndclass.hbrBcakground钦定的画刷来擦除背景。

        BOOL CreateEx(

    2.输入主旨
      同一时刻,Windows中或者有两个例外的主次在运行,也等于说有四个窗口相同的时候设有。那时,键盘由八个窗口共享,但唯有一个窗口能够吸收接纳到键盘音讯,那个能够收到键盘音信的窗口被称作全部输入大旨的窗口。
      具备输入主题的窗口应当是当下的位移窗口,也许是移动窗口的子窗口,其标题和边框会以高亮度展现,以界别于其余窗口。富有输入核心的也能够是Logo而不是窗口,此时,Windows也将新闻发送给Logo,只是音讯的格式略有差异。
      窗口进度可以通过发送WM_SETFOCUS和 WM_KILLFOCUS新闻使窗体得到或失去输入大旨。程序也得以经过捕获WM_SETFOCUS和WM_KILLFOCUS新闻来判定窗体何时获得或失去输入核心。个中WM_SETFOCUS音讯表示窗口正获得输入主题,WM_ KILLFOCUS新闻表示窗口正失去输入核心。
    3.键盘新闻
      键盘新闻分为系统键音讯和非系统键消息。系统键新闻是指由Aft键和别的键组合而发出的按钮新闻。当系统键被按下时发生WM_ SYSKEYDOWN消息,当系统键被放飞时产生WM_SYSKEYUP消息。 Aft键与其余键形成的组合键常常用于对程序菜单和体系菜单实行抉择,或用于在不一样的顺序之间进行切换。由此,系统键信息应该交由Windows实行管理,用户所编纂的程序一般不管理系统键音讯,而是将那一个新闻交由DefWindowProc函数举办管理。借使用户想对系统键新闻进行处理,应该在管理完那个音讯后,再将其发送给DefWindowProc函数,使得Windows系统能够寻常办事。
      或多或少击键信息能够被调换到字符新闻,举例字母键、数字键等。有个别键只可以发出开关新闻而尚未字符新闻,比方Shift键、Insert键等。新闻循环中的 TranslateMessage函数能够兑现从击键音信向字符新闻的转向。当GetMessage函数捕获一个WM_SYSKEYDOWN消息或 WM_KEYDOWN音讯后,TranslateMessage函数决断爆发该新闻的键是不是能够被转变来字符音信,假使能,就将该新闻调换到字符音讯,再通过DispatchMessape函数将更动后的字符音讯发送到音讯队列中去。字符信息共有以下各种,如表所示。

    新葡亰496net 3

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

    上面大家针对CBSColorCombo博克斯类的那多少个经过来做个大约的介绍:

          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的高度就可以。这里的莫斯中国科学技术大学学大家设置为2倍的体系小Logo(SMALL ICON)的可观,其尺寸用::GetSystemMetrics(SM_CXSMICON)取得。

          DWOMuranoD dwCtrlStyle = 0 ,  //设置内嵌在状态栏上的CStatusBarCtrl对象成立时的扩张风格

      个中死字符是由少数特殊键盘上的按钮所变成的,Windows一般忽略死字符所发出的音讯。
      Windows的音讯一般是通过一个MSG结构体变量传送给新闻管理函数的。对于键盘消息, MSG结构体变量的各种域中较首要的是lParam域和 wParam域。wParam域用于保存开关的虚拟键代码或字符的ASCII码。对于非字符音讯,wParam域保存按钮的虚拟健代码;对于字符音讯, wParam域不保留字符的ASCII码。lParam域则用于保存击键时发生的叠合消息,实际上四个三拾一位的lParam变量被分为六片段,记录了以下相关音信:重复次数、OEM扫描码、扩张键标识、关联键标识、前一击键意况和转变状态。lParam域各位的含义如表所示。

    假使客户区的上涨的幅度和中度不能够被5整除,客户区的左边手或尾巴部分就能够冒出贰个小长条区域,不被实行覆盖。在那片区域开始展览鼠标单击时,CHECKETucson1程序会调用MessageBeep函数举行响应。

        上边的一对函数的原型未有指明再次回到值类型, 大家能够通过编写翻译情形协侦查看, 因为小编有一点点懒,所以就没查看了。

      Visual C 的主次开发人士能够在Item的矩形区域内画丰富多彩的音信,比方:Logo/位图/字符串等等。那么有人会疑窦:"我们用哪些来画?大家在哪儿画?又怎么来画吗?"。答案其实都在这么些LPDRAWITEMSTRUCT结构中。hDC成员为设备上下文景况(HDC),获得了该设备句柄也就象征大家有着了画别的位图/Logo/文本的力量;那么接下去的难点就是:我们在何地来画吗?答案也很简短:获得LPDRAWITEMSTRUCT结构中Item的矩形区域(rcItem),那么那就是您施展才华的半空中了,要充裕利用它哦!

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

    位数 含义
    0-15 击键重复次数累加
    16-23 OEM扫描码
    24 是或不是为扩充键
    25-28 未定义
    29 是或不是便用关联键,及Alt键是还是不是同时按下。
    30 前二反扑键状态,0象征该键前三次状态为抬起,1意味着前一遍状态为按下
    31 转变状态

    当CHECKEKuga1程序收到WM_PAINT音信时,它会重新绘制整个客户区,利用GDI中的Rectangle函数画出全数的矩形。若fState值为真,则CHECKE奥迪Q51程序调用函数MoveToEx和函数LineTo函数画出两条直线。

        哈哈哈哈................原本windows下的先后设计有C的基本功,加上学习一大堆windows定义各种API函数, 加上一些运转搭飞机制的知情,固然是菜鸟级的不入门的顺序编制程序职员(就好像自家一般)也能落到实处四个轻便易行的应用....................

      最终一步正是怎么来画的问题了,说白了正是何等分配每种元素的半空中,怎么着在它们分其余空间上画出您想要的事物。依据正规一般分别计算出ICON所占的矩形区域/文本所占的矩形区域/位图的矩形区域,假设您还会有任何因素那么也相应总括出该因素所占的矩形区域/位图所占的矩形区域。接下来的总体都一点也不细略了,不外乎CDC类的多少个常用函数:画Logo用DrawIcon()、画位图用BitBlt()、画文字用DrawText()等函数。固然你认为视觉上还非常不够COOL,你还是可以来安装种种Item的公文颜色,背景颜色,以及Logo的勃兴和凹陷的视觉效果。

          UINT nID = AFX_IDW_STATUS_BA揽胜   //钦命状态栏这几个子窗口的ID,暗中认可为AFX_IDW_STATUS_BAR

      开关的顺序差别,发生的音信也不平等。举例,按下并释放1键,读进度依次发生如表所示三条音信。按下1键所发出的音讯和wParam的取值

        作者发觉用LiveWrite那么些东西比较好.......

      可是在上述进度中供给注意多个难题,一是为了免去不断绘制所拉动的闪亮现象,必要在WM_ERASEBKGND音信响应中作些特殊处理;在WM_PAINT新闻中一向把组合框的客户区当成一幅位图来不断更新,而不是对ICON区域和文书区域分别重绘。二是每当用户改换了组合框的脚下内容后,在画新的Item之前一定要记得清除前次组合框内的内容。三是只要想选用越多的水彩,那么只要选用组合框中的末了二个Item(More Colors)就能够,那几个Item是为用户自定义颜色而特地设置的。

        );

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

      二、编制程序步骤

        BOOL Create(

      假如按下Shift键后再按下1键并释放,则相继爆发如表所示的新闻。按下 Shift键后按 1健所发生的新闻和 wParam的取值

      1、运行Visual C 6.0,生成一个依据对话框的体系,将该类型命名称叫"WW";

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

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

      2、使用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控件,使用CLASSWIZA途胜D增加对应的CComboBox类成员变量,然后将该成员变量的花色修改为CBSColorComboBox;

          UINT nID = AFX_IDW_STATUS_BA奥德赛  //钦点状态栏这些子窗口的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
    新葡亰496net文章非常短很周到,应用程序中实现颜色采纳组合框。//功能:达成在窗口中展现按键消息
    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 :‘ ’),//展现字符值
           LOWOCR-VD (lParam), // 重复次数
           HIWO智跑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 前一景况 转变状态";
      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为三个静态数组,其定义在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,       //提示行

    新葡亰496net,    case WM_KEYUP:
        //管理键盘上某一按下键被假释的音信
        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_SCKugaL,  //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卡宴://管理系统键可知字符新闻
        ShowKey (hwnd, 1, "WM_SYSCHAR", wParam, lParam);
        break;

              新葡亰496net 4

        case WM_SYSDEADCHAHighlander://管理系统键"死字符"音讯
        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;
      }

      2.2装置状态栏提醒器(窗格)

      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,// 指向设备描述表的句柄
              LPTEXTMETOdysseyIC lptm // TEXTMET普拉多IC结构体变量的指针
              // 所获得的具备音讯保存在TEXTMETKoleosIC结构体变量中
              );
      当中lptm是三个针对性 TEXTMETEnclaveIC结构体的指针。TEXTMET牧马人IC结构体包罗了与字体的几何尺寸相关的主导新闻。该结构体的切实定义如下:
    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汉兰达 tmFirstChar; // 字体中定义的率先个字符
      BCHA宝马X3 tmLastChar; //字体中定义的结尾三个字符
      BCHAOdyssey trnDefaultChar; //字体中的私下认可字符
      BCHA中华V trnBreakChar; // windows在调动文本时用来差别词的字符
      BYTE tmItalic; // 取非零值时表示斜体字体
      BYTE tmUnderLined; // 取非零值时表示下划线字体
      BYTE tmStruckOut;// 取非零值时为除去线字体
      BYTE tmPitchAndFamily; // 低三人为字符间距,高二个人为体系值
      BYTE tmCharSet; // 钦命字符集
    } TEXTMETRIC;
      该协会中负有的字体大小都以按逻辑单位提交的,那便是说字体的尺寸取决于当前展现设备的投射情势。
      在例中,所获取的字体几何尺寸保存在TEXTMETLANDIC结构体变量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结构的变量将一个矩形区域限制的多个角的值传递FillRect函数,则调用该函数后,矩形区域除了最下方的一条龙和最右侧一列外都被填充。在本实例中,初步化编辑区的滚屏区域的左上角Y坐标时,使用了之类程序:
      rc.top= 3 * yChar/2;
      那是因为在窗口中率先要出口两行的题头信息,一行为华语,一行为下划线。粤语字符的莫斯中国科学技术大学学为1个字体中度单位,而下划线的可观为半个字体中度单位。这两行音信是一向维系,不加入滚屏的。因而,滚屏区域的左上角Y坐标从3/2个字体高度处开首。
    在WndProc函数中,处理WM_ SIZE
    新闻的程序段如下:
      case WM_SIZE: //管理窗口大小改造的音信
      //窗体制改良变后保存新的滚屏区域右下角坐标
      rc.right = LOWORD (lParam);
      rc.bottom = HIWORD (lParam);
      UpdateWindow (hwnd);
      return 0;
      该程序段相比较轻松,只是当窗口的尺码退换时再也设定滚屏区域的右下角坐标,并更新窗口。值得注意的是, WM_SIZE新闻的wParam变量保存了窗体新尺寸的左上角坐标,变量的三十一个人分为七个部分,低16人保存X坐标,高15位保存Y坐标。 lParam变量保存了窗体新尺寸的右下角坐标,保存方法与wParam变量一样。在编制程序进度中,平日经过LOWO宝马X5D宏定义来收获叁九位变量的低16位数值,通过HIWO福睿斯D宏定义来获得31位变量的高历位数值。
      该程序段相比简单,只是当窗口的尺码退换时再一次设定滚屏区域的右下角坐标,并更新窗口。值得注意的是,WM_SIZE新闻的wParam变量保存了窗体新尺寸的左上角坐标,变量的三十位分为四个部分,低十七个人保存X坐标,高十五人保存Y坐标。 lParam变量保存了窗体新尺寸的右下角坐标,保存方法与wParam变量一样。在编程进程中,平日通过LOWOEnclaveD宏定义来博取31人变量的低15位数值,通过HIWOSportageD宏定义来获得34位变量的高历位数值。
    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 // 指向八个用以保存全数重
            // 画音信的 PAINTSTRUCT 结构体变量的指针);
      BeginPaint 函数的功能是做到重画窗体在此以前的筹算,并将重画窗体 的数额保存在二个 PAINTSTRUCT 结构体变量中。 PAINTSTRUCT 结构体能够用来保存窗口重画时的数量以有益未来采纳。
    PAINTSTRUCT结构体的概念如下:
    typedef struct tagPAINTSTRUCT{ // ps
      HDC hdc; // 重画区域所在窗口的句柄
      BOOL f伊拉斯e;// 是还是不是擦去背景
      RECT rcPaint; // 钦命重画窗体的范围
      BOOL fRestore; // 系统一保险留域
      BOOL fIncUpdate;// 系统一保险留域
      BYTE rgbReserved[32];// 系统一保险留
    }PA INTSTRU CT;
      BeginPaint函数假使操作成功会重临一个被操作窗口的设备描述表的句柄。假使操作不成事则函数再次回到NULL值,表分明示设备不可用。该函数在运作进程中,会开始展览自动调解,使得全数区域都富含在刷新区域的范围内。而原本须求刷新的区域是由InvalidateRect函数或 Invalidate奇骏gn函数钦点的。一般的话,只有当程序处理WM_PAINT音讯时才调用BeginPaint函数,而且,每一遍调用BeginPaint函数都急需相应调用三个EndPaint函数来终结重画进程。在BeginPaint函数调用后,会将插入符光标自动隐藏。EndPaint函数原型定义如下:
    BOOL EndPaint ( HWND hWnd, // 窗口句柄
            CONST PAINTSTRUCT* lpPaint // 指向 PAINTSTRUCT结构体变量的指针
           );
      EndPaint函数标志着窗口重画进度的扫尾。该函数施行后总再次来到三个非零值。假如在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 : ' '),//展现字符值
             LOWOLX570D (lParam), //重复次数
             HIWO途乐D (lParam) & 0xFF, //OEM键盘扫描码
             //推断是不是为增加键盘的增添键
             (PSTR) (0x01000000 & lParam ? "是" : "否"),
             //推断是不是同期选用了ALT键
             (PSTR) (0x20000000 & lParam ? "是" : "否"),
             (PSTR) (0x40000000 & lParam ? "按下" : "抬起"),
             //判别前一遍击键状态
             (PSTR) (0x80000000 & lParam ? "按下" : "抬起"))
             //判定转变状态
             );
    }

      2.3设置提示器(窗格)的大幅清劲风骨

      ShowKey函数首先定义了szFormat字符串,并在在那之中针对字符音信和非字符消息定义了三种不一样的出口格式。然后调用ScrollWindowEx函数使突显区域滚屏,为消息输出作准备。ScrollWindowEx函数的根本意义是使窗口编辑区中的某一矩形区域爆发滚屏效果。
    ScrollWindowEx函数的原型定义如下:
    int ScrollWindowEx (HWND hwnd, // 产生滚屏的窗口的句柄
              int dx, // 水平滚屏的数值
              int dy, // 垂直滚屏的数值
              CONST RECT*prcScroll,//记录发生滚屏的矩形区域的RECT结构体的地址
              CONST RECT* prcClip, //记录产生剪切的矩形区域的 RECT结构体的地址
              H兰德PRADOGN hrgnUpdate,// 须求立异区域的句柄
              LPRECT prcUpdate, // 记录须要立异矩形区域的 RECT结构体的地址
              UINT flags // 滚屏调节标记
              );
      当中,dx参数给出了以设备单位尺寸(对于荧屏为像素)为单位的每一遍水平滚屏的衡量值。dx参数取正值表示向右滚屏,取负值表示向左滚屏。如参数给出了以设备单位尺寸(对于显示屏为像素)为单位的每三遍垂直滚屏的度量值。如参数取正值表示向下滚屏,取负值表示发展滚屏。dx和dy八个参数无法而且取非零值,也正是说,ScrollWindowEx函数不能使编辑区同期向水平和垂直方向滚屏。
      prcScroll参数为一个针对记录滚屏的矩形区域的RECT结构体变量的指针,假若取值为NULL,则整个编辑区产生滚屏。
      hrgnUpdate参数为因滚屏而变得不行的矩形区域的句柄,多数情景下可以取NULL。 prcUpdate参数指向一个记录因为滚屏而变得不行的矩形区域的 RECT结构体变量。多数情形下取NULL。
    flags变量能够因而分歧的取值来支配滚屏的场合,其取值和意义如下所示。
      SW_ ERASE当和 SW_INVALIDATE值同一时间接选举用时,会透过向 window发送三个WM_ ERASEBKGND新闻将前段时间变得不行的区域抹去;
      SW_INVALIDATE在发出滚屏后使由hrgnUpdate参数内定的区域无效;
      SW_SCROLLCHILDREN使具有的子窗口都发出滚屏;
      SW_ SMOOTHSCROLL在 Windows 95及然后的版本中使窗口发平生滑滚屏。假诺ScrollWindowEx函数实施成功,则再次来到值为以下三者之一:
      SIMPLEREGION代表有叁个矩形的无用区域;
      COMPLEXREGION表示未有失效区域和重叠区域;
      NULLREGION代表尚无失效区域。
      即便ScrollWindowEx函数实践不成功,则赶回E奥迪Q3ROTiggo。
    ScrollWindowEx函数的功力也得以因此ScrollWindow函数来达成,ScrollWindow 函数的原型定义如下:
    BOOL Scrollwindow(HWND hwnd //窗口句柄
             int XAmount, // 水平滚屏的数值
             int YAmount, // 垂直滚屏的数值
             CONST RECT* lpReCt, //记录产生滚屏的矩形区域的 RECT结构体的地方
             CONST RECT* lpClipRect, //记录爆发剪切的矩形区域的 RECT结构体的地点
             );
      可以看到,ScrollWindow函数与ScrollWindowEx函数十三分相似,其参数的意思也基本一样。事实上,ScrollWindow函数是为着保全对非常低版本的Windows包容而规划的,用户在编制程序时,除非须要思虑程序的向下包容,不然一般都应运用ScrollWindowEx函数。
      在滚屏后,函数初叶调用TextOut函数进行音讯输出。TextOut函数的原型定义如下:
    BOOL TextOut( HDC hdc,// 设备描述表句柄
           int nXStart, // 文本输出起先点 X坐标
           int nYStart, // 文本输出早先点 Y坐标
           LPCTST凯雷德 lpString, // 指向输出字符串的指针
           int cbString // 字符串中字符的多寡
           );
      TextOut函数能够用当下设定的书体在窗口的钦点地点输出一段文本消息。假诺操作成功则赶回一非零值,不然再次回到零值。捕获键盘音讯的音信根本基于表中的讲述,通过利用按位操作规定有些特定位的值,然后再决断具体的情况。
      在TextOut函数调用进度中,还调用了wsprintf函数,并使其再次回到值作为TextOut函数的多少个参数值。wsprintf函数的原型定义如下:
    int wsprintf (LPTST中华V lpOut,// 指向须求输出的字符串的指针
           LPCTST牧马人 lpFmt, //指向格式调节字符串的指针
           …… // 其余可选参数
           );
      wsprintf函数能够将一组字符体系按lpFmt参数钦点的格式转变,然后保留在lpOut参数钦赐的字符缓冲区中等待输出。在这之中,字符种类由可选参数决定,而可选参数的数额和具体内容应该与lpFmt所钦命的格式一致。
      借使wsprintf函数操作成功,则赶回输出字符的数据,但那个字符数目不包罗表示甘休的NULL标记。如若操作失败,重临的整数值将与出口的字符数目不符合。
      实例首要表明了怎么管理键盘新闻,读者应当珍视精晓各个音信在MSG结构体变量中是怎么着保存的,怎么样才具够对中间的切实可行消息进行辨别和提取。程序运营后将发生贰个背景象为鲜绿的简要窗口,并在窗口的最上部现身标题提醒新闻。那时用户只要张开键盘操作,则窗体中便会突显该操作所产生的键盘新闻,每显示一条音信程序都会滚屏和重绘窗口,滚屏区域的颜色为黑色。

        CStatusBar::SetPaneInfo

    键盘音讯实例2:
    #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;

      2.4安装提示器(窗格)的文本内容

        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 .鼠标操作和鼠标音信用户在利用鼠标操作的进程中,平时会选择的重大形式有三种,如表所示。

          LPCTSTQX56 lpszNewText,  //要在当下窗格中显得的文件

    操作名称 描述
    单击(Click) 按下并飞快释放鼠标开关。
    双击(Double Click) 延续快捷产生四回单击操作。
    活动(Move) 鼠标光标移动。
    拖动(Drag) 按下鼠标一键不放,同有时间施行鼠标移动操作。
    与键盘的极其键组合 在按下Ctrl键或Shift键的还要推行鼠标单击操作。

          BOOL bUpdate = TRUE

      个中,前二种操作是可是主题的操作,可以生出Windows内部定义的音讯,并由此那个消息来判定用户实际实行了哪个种类操作。
      Windows定义的鼠标音讯共有20条,在那之中国和亚洲编辑区的鼠标音信一般交由系统管理,程序只管理编辑区内的鼠标信息。编辑区内的鼠标新闻共有10条,如表所示。

        );

    新闻常量 操作描述
    WM_MOUSEMOVE 移动鼠标
    WM_LVBUTTONDOWN 按下鼠标左键
    WM_LBUTTONUP 释放鼠标左键
    WM_LBUTTONDBLCLK 双击鼠标左键
    WM_LacrosseVBUTTONDBLCLK 按下鼠标右键
    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参数保存了音信爆发时鼠标所在点的坐标,个中低十五个人为X坐标,高15位为Y坐标。
      在拍卖鼠标音信的时候,如若急需管理鼠标双击新闻,则在登记窗口类时,窗口的风骨必须归纳CS_DBCLCKS。不然固然举办了双击操作,窗口也不得不接受两条WM_ BUTTONUP和 WM_BUTTONDOWN消息。差异双击操作和五回单击操作是以一回击键的时光间隔为行业内部的。当五遍击键的年华距离小于 500微秒时, Windows将其视为双击操作:假诺一回击键的岁月距离大于500飞秒,Windows将其视为三回单击操作。500皮秒为暗中认可的时刻间隔,用户能够通过调用SetDoubleClickTime函数来修改那年华间隔。SetDoubleClickTime函数的原型定义如下:
    BOOL SetDoubleClickTime(UINT uInterval // 新的击键时间间隔)
    2.鼠标捕捉
      在常常状态下,唯有当鼠标位于窗体内时,窗体才具选取到鼠标的音讯。假如须要接受全数的鼠标消息而随意鼠标是不是在窗口内,那时能够调用SetCapture函数来落到实处。SetCapture函数的原型定义如下:
    HWND SetCapture (
      HWND hwnd // 窗口句柄
    );
      调用SetCapture函数后,全部鼠标操作所发出的音信都一贯发送到内定窗口。因为那时候鼠标恐怕位于窗口之外,所以鼠标的坐标也许为负值。由于调用该函数会使别的窗口不能够接受到键盘和鼠标的音讯,因而在成功操作后应立时调用ReleaseCapture 函数释放鼠标捕获。ReleaseCapture函数的原型定义如下:
    BOOL ReleaseCapture(VOID);
    二、鼠标应用实例
    上面是二个在程序设计中哪些捕获鼠标新闻的实例。
    #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;
      }

    本例就要情景栏上显示当前系统的小运和贰个进程条控件:

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

      1、展现系统时间

      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;

      新葡亰496net 5

        case WM_MOUSEMOVE://管理鼠标移动的音讯
        if (wParam & MK_LBUTTON && iCount < 256)//只管理鼠标拖动的音信
        {
          points[iCount].x = LOWOWranglerD (lParam);//保存点的X坐标
          points[iCount ].y = HIWO卡宴D (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获取系统当下的日子对象;再调用C提姆e类的另三个成员函数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;
    }
      例题的主要成效是在窗口中有些地点单击鼠标右键时,程序保存捕获的鼠标点处的坐标。紧接着按下鼠标左键在窗口中拖动,程序会记录下鼠标运动的轨道,并以刚才右击鼠标时分明的点为骨干绘制一簇射线。本实例最多可以绘制256条射线。程序的另一目标是为了让读者越发询问如何捕获鼠标与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;
      这种论断复杂鼠标操作的方法在基础知识部分已经详尽介绍过,这里不再赘言。这一段程序的机能是基于在按下鼠标中键的相同的时间,再按Ctrl键或Shift键的不及情况而在窗口中输出不一样的音信。
    处理WM_ RBUTTONDOWN音信的程序段如下:
    case WM_RBUTTONDOWN://处理鼠标右键按下的音信
    iCount = 0;//重新开端化点数目
    center.x=LOWOSportageD (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<256)//只管理鼠标拖动的新闻
    {
      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;
      以上程序的功力是贯彻射线族的绘图。程序行使了多少个for循环,循环次数为iCoun变量记录的罗列。在循环体中屡屡调用 MoveToEx函数和 LineTo函数绘制直线。MoveToEx函数使直线的起源回到有center变量记录的中部,LineTo函数完结由宗旨向points数组中的各点绘制直线。
      在处理WM_PAINT新闻的程序中还接纳了SetCursor函数和ShowCursor函数。SetCursor函数能设定二个鼠标Logo,ShowCursor函数能将设定好的Logo显示出来。在本实例中,调用那八个函数的指标是当程序绘制射线族的时候将鼠标Logo调换到都电子通讯工程大学火花电火花计时器图案,表示程序正在实践某次操作。当给制完结后,又再度安装鼠标图像为箭头Logo。
      程序运维后,首先生成三个窗口,等待用户实践鼠标操作。用户右击后,再按下鼠标左键并拖动,则程序会绘制出一簇美貌的射线。运维结果如图所示。

    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;
    }
    

     

      此时在状态栏窗格中展现的小运是画虎类犬的,利用放大计时器每隔一秒就发送WM_TIMEOdyssey新闻,在音讯响应函数OnTimer中再度得到贰回系统当下时间并显示到状态栏窗格中,已达到规定的标准呈现动态时间的效用;

    鼠标音讯实例2
    #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_TIMECRUISER消息,生成音信响应函数On提姆er,在该函数中重复实施二次系统时间的获得并体现到状态栏窗格中: 

        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

        新葡亰496net 6

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

        void GetItemRect(int nIndex, LPRECT lpRect ) const;

        nIndex:内定窗格的岗位索引

        lpRect:窗格的矩形区域

      

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

      为CMainFrame类添加WM_PAINT消息的响应函数:

      新葡亰496net 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中华V新闻的响应函数OnTimer函数中落实:  

    void CMainFrame::OnTimer(UINT nIDEvent) 
    {
        ......
    
        m_progress.StepIt();
        
        CFrameWnd::OnTimer(nIDEvent);
    }
    

        CProgressCtrl::StepIt:使进程栏控件的进程遵照一定的大幅扩大

        CProgressCtrl::SetStep:设置进度栏每一次增添的增幅

        CProgressCtrl::SetRange:设置进度栏的限制,默以为0~100

      3、在气象栏上展现鼠标当前的地点

        当在先后的客户区窗口移动鼠标时,将鼠标当前的坐标地点显得在状态栏的提醒行上;

        首先必要在先后的CStyleView类中增加WM_MOUSEMOVE音信的响应函数:

          新葡亰496net 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类型工夫被调用;

          方法二: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);
    }
    

          方法三:CFrameWnd类的积极分子函数:GetMessageBar

            该函数重返状态栏对象的指针,故无须像方法一那么修改并调用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);
    }
    

     

    本文由新葡亰496net发布于电脑系统,转载请注明出处:新葡亰496net文章非常短很周到,应用程序中实现

    关键词:

上一篇:没有了

下一篇:没有了