使用鼠标【官方澳门新永利下载】

官方澳门新永利下载 1官方澳门新永利下载 2

C语言Windows程序设计 -> 第十一天 -> 使用鼠标

 

鼠标的利用一样是透过猎取Windows鼠标音信来获得顾客近些日子的鼠标状态的。

一、鼠标的介绍
    鼠标是Computer的输入设备之一, 在图形化的操作系统上,
鼠标的运用使某个错落有致的操作变得轻巧, 随着科学和技术的开垦进取,
鼠标的花色也尤为多,
按接口类型可分为串行鼠标、PS/2鼠标、总线鼠标、USB鼠标(多为光电鼠标)二种。按其行事原理及其内部结构的不如足以分成机械式,光机式和光电式。
    
    这里我们不商量鼠标的硬件构造,
越多关于鼠标的硬件知识请自行查阅相关资料。
    
    1>. 鼠标所在的职责
        在Windows系统下, 客商移动鼠标时,
在显示屏上相似会以四个斜式的箭头来表示鼠标当前的地方,
这一个箭头实际上是三个位图格式的小Logo, 称为”鼠标指针”,
鼠标指针具备叁个单像素精度的”火热”(hot spot), 当鼠标准样品式为箭头时,
那么些”销路好”正是鼠标箭头的顶峰, 还应该有局地体裁是”十”字样式,
那样的指针”热门”位于”十”字的为主岗位,
火爆在呈现设备上提示了贰个规范的职位。 当我们去捕获鼠标指针的地方时,
实际上是指鼠标指针的那些”火热”所在的像素单元的岗位。
    
    2>. 鼠标的术语
        ①. 单击 : 按下鼠标开关, 然后松手;
        ②. 双击 : 接二连三快速的按下鼠标同三个开关然后松开;
        ③. 拖动 : 保持按键按下境况, 并移动鼠标。
        
        现在大家广阔的三键鼠标, 四个开关遍布称为左键、中键和右键,
个中左键的标志符简写为LBUTTON, 中键的标记符为MBUTTON,
右键的标记符为RBUTTON。 双键鼠标独有左键和右键, 单键鼠标唯有左键。
        
    3>. 鼠标的体裁
        Windows系统为鼠标提供了二种暗中认可的鼠标准样品式, 如:
箭头、电磁料理计时器、十字瞄准等,
在此前学习的经过中其实我们早就接触了动用暗中同意的鼠标准样品式,
回想那行代码:

        wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ) ;

        那样就是选拔八个暗中同意的斜式箭头作为鼠标的指针样式,
斜式箭头样式的标志符为 IDC_ARROW, 这么些标志符定义在 WINUSER.H
头文件中, 别的还会有以下标志符及其对应的体裁:

官方澳门新永利下载 3

二、使用鼠标的简短示例
    1>. 示例一: 获取鼠标指针地方
        在这里个示例中示范怎么着获得鼠标的岗位,
先说下有关的新闻标记符以至函数。
        新闻标记符: WM_MOUSEMOVE
当鼠标指针在顾客区内运动或鼠标指针经过客商区窗口时会获得这几个信息。
        获取鼠标地方的函数: GetCursorPos 该函数的原型: BOOL
GetCursorPos(LPPOINT lpPoint) ;
        代码片段:

 1     switch(message)   2     {   3     case WM_PAINT:        //处理重绘消息   4         hdc = BeginPaint( hwnd, &ps ) ;   5         wsprintf( szBuffer,  "屏幕坐标:(%i, %i)", pt.x, pt.y );   6         TextOut( hdc, 10, 10, szBuffer, lstrlen(szBuffer) ) ;   7         ScreenToClient( hwnd, &pt ) ;        //将相对于屏幕的坐标转换为相对于窗口客户区的坐标   8         wsprintf( szBuffer,  "客户区坐标:(%i, %i)", pt.x, pt.y );   9         TextOut( hdc, 10, 30, szBuffer, lstrlen(szBuffer) ) ;  10         EndPaint( hwnd, &ps ) ;  11         return 0 ;  12   13     case WM_MOUSEMOVE:        //处理鼠标移动时发来的消息  14         GetCursorPos(&pt) ;  15         InvalidateRect( hwnd, NULL, TRUE ) ;  16         return 0 ;

    完整的自己要作为典范遵循规则代码:

官方澳门新永利下载 4官方澳门新永利下载 5View
Code – GetCursorPosition

 1 #include<windows.h>   2    3 LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) ;   4    5 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow )   6 {   7     static TCHAR szAppName[] = TEXT( "UseMouse_Demo" ) ;   8     HWND hwnd ;   9     MSG msg ;  10     WNDCLASS wndclass ;  11   12     wndclass.hInstance        = hInstance ;  13     wndclass.lpfnWndProc    = WndProc ;  14     wndclass.lpszClassName    = szAppName ;  15     wndclass.style            = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ;  16     wndclass.hbrBackground    = (HBRUSH) GetStockObject( WHITE_BRUSH ) ;  17     wndclass.hCursor        = LoadCursor( NULL, IDC_ARROW ) ;  18     wndclass.hIcon            = LoadIcon( NULL, IDI_APPLICATION ) ;  19     wndclass.cbClsExtra        = 0 ;  20     wndclass.cbWndExtra        = 0 ;  21     wndclass.lpszMenuName    = 0 ;  22   23     if( !RegisterClass(&wndclass) )  24     {  25         MessageBox( NULL, TEXT("错误, 无法注册窗口类."), TEXT("错误"), MB_OK ) ;  26         return 0 ;  27     }  28   29     hwnd = CreateWindow( szAppName, TEXT("获取鼠标指针位置 - Demo"),  30         WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,  31         CW_USEDEFAULT, CW_USEDEFAULT,  32         NULL, NULL, hInstance, NULL ) ;  33   34     ShowWindow( hwnd, iCmdShow ) ;  35     UpdateWindow( hwnd ) ;  36   37     while( GetMessage(&msg, NULL, 0, 0) )  38     {  39         TranslateMessage( &msg ) ;  40         DispatchMessage( &msg ) ;  41     }  42   43     return msg.wParam ;  44 }  45   46 LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )  47 {  48     HDC hdc ;  49     PAINTSTRUCT ps ;  50     static POINT pt ;  51     TCHAR szBuffer[128] ;  52   53     switch(message)  54     {  55     case WM_PAINT:  56         hdc = BeginPaint( hwnd, &ps ) ;  57         wsprintf( szBuffer,  "屏幕坐标:(%i, %i)", pt.x, pt.y );  58         TextOut( hdc, 10, 10, szBuffer, lstrlen(szBuffer) ) ;  59         ScreenToClient( hwnd, &pt ) ;  60         wsprintf( szBuffer,  "客户区坐标:(%i, %i)", pt.x, pt.y );  61         TextOut( hdc, 10, 30, szBuffer, lstrlen(szBuffer) ) ;  62         EndPaint( hwnd, &ps ) ;  63         return 0 ;  64   65     case WM_MOUSEMOVE:  66         GetCursorPos(&pt) ;  67         InvalidateRect( hwnd, NULL, TRUE ) ;  68         return 0 ;  69   70     case WM_DESTROY:  71         PostQuitMessage(0) ;  72         return 0 ;  73     }  74   75     return DefWindowProc( hwnd, message, wParam, lParam ) ;  76 }

        说一下完完全全的笔触, 要即时追踪获取鼠标在荧屏中的坐标,
首先要捕获鼠标的移位消息 WM_MOUSEMOVE,
当Windows向大家发来以此消息时就代码鼠标在扩充活动,
随后我们对那个鼠标移动新闻进行管理, 调用 GetCursorPos(&pt) ;
这么些函数获取鼠标以后的地点,
获取到鼠标地方后为了能够立刻在窗口中显示出来, 再调用 InvalidateRect(
hwnd, NULL, TRUE ) ;
使整个客户区形成无效状态, 进而引发 WM_PAINT
要求重绘顾客区内容的新闻,
在管理重绘消息时输出刚刚获得的鼠标指针坐标地点。
        
        关于 ScreenToClient( hwnd, &pt ) ; :
          
 这几个函数的功力是将显示屏坐标(相对于全部显示器左上角的坐标)调换到相对于窗口客商区的坐标,
显示器坐标与窗口客户区坐标的含义如图所示:

官方澳门新永利下载 6

            GetCursorPos获得的鼠标地方是显示屏坐标,
如若想掌握她在窗口客商区内的周旋地方就必要调用ScreenToClient函数将其转化为顾客区坐标。
          别的还会有叁个WIndows函数是将窗口客商区坐标转成荧屏坐标的,
函数为: ClientToScreen( hwnd, &pt ) ;
          获取鼠标指针的职位还应该有别的的方法, 这里只是此中的一种。
    
    
    2>. 示例二: 管理鼠标左键单击事件
        鼠标左键在客商区被单击时发来的消息: WM_LBUTTONDOWN

 1     switch(message)   2     {   3     case WM_PAINT:   4         hdc = BeginPaint( hwnd, &ps ) ;   5         EndPaint( hwnd, &ps ) ;   6         return 0 ;   7    8     case WM_LBUTTONDOWN:    //处理鼠标左键单击被按下时产生的消息   9         x = LOWORD( lParam ) ;    //获取鼠标位置x坐标信息  10         y = HIWORD( lParam ) ;    //获取鼠标位置y坐标信息  11         wsprintf( szBuffer,  "鼠标左键被单击, 击中位置: (%i, %i)", x, y );  12         MessageBox( hwnd, szBuffer, TEXT("鼠标动作"), MB_OK ) ;  13         return 0 ;  14   15     case WM_DESTROY:  16         PostQuitMessage(0) ;  17         return 0 ;  18     }

    完整的事必躬亲代码:

官方澳门新永利下载 7官方澳门新永利下载 8View
Code – WM_LBUTTONDOWN

 1 #include<windows.h>   2    3 LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) ;   4    5 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow )   6 {   7     static TCHAR szAppName[] = TEXT( "UseMouse_Demo" ) ;   8     HWND hwnd ;   9     MSG msg ;  10     WNDCLASS wndclass ;  11   12     wndclass.hInstance        = hInstance ;  13     wndclass.lpfnWndProc    = WndProc ;  14     wndclass.lpszClassName    = szAppName ;  15     wndclass.style            = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ;  16     wndclass.hbrBackground    = (HBRUSH) GetStockObject( WHITE_BRUSH ) ;  17     wndclass.hCursor        = LoadCursor( NULL, IDC_ARROW ) ;  18     wndclass.hIcon            = LoadIcon( NULL, IDI_APPLICATION ) ;  19     wndclass.cbClsExtra        = 0 ;  20     wndclass.cbWndExtra        = 0 ;  21     wndclass.lpszMenuName    = 0 ;  22   23     if( !RegisterClass(&wndclass) )  24     {  25         MessageBox( NULL, TEXT("错误, 无法注册窗口类."), TEXT("错误"), MB_OK ) ;  26         return 0 ;  27     }  28   29     hwnd = CreateWindow( szAppName, TEXT("处理鼠标单击事件 - Demo"),  30         WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,  31         CW_USEDEFAULT, CW_USEDEFAULT,  32         NULL, NULL, hInstance, NULL ) ;  33   34     ShowWindow( hwnd, iCmdShow ) ;  35     UpdateWindow( hwnd ) ;  36   37     while( GetMessage(&msg, NULL, 0, 0) )  38     {  39         TranslateMessage( &msg ) ;  40         DispatchMessage( &msg ) ;  41     }  42   43     return msg.wParam ;  44 }  45   46 LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )  47 {  48     HDC hdc ;  49     PAINTSTRUCT ps ;  50     static POINT pt ;  51     TCHAR szBuffer[128] ;  52     static int x, y ;  53   54     switch(message)  55     {  56     case WM_PAINT:  57         hdc = BeginPaint( hwnd, &ps ) ;  58         EndPaint( hwnd, &ps ) ;  59         return 0 ;  60   61     case WM_LBUTTONDOWN:  62         x = LOWORD( lParam ) ;  63         y = HIWORD( lParam ) ;  64         wsprintf( szBuffer,  "鼠标左键被单击, 击中位置: (%i, %i)", x, y );  65         MessageBox( hwnd, szBuffer, TEXT("鼠标动作"), MB_OK ) ;  66         return 0 ;  67   68     case WM_DESTROY:  69         PostQuitMessage(0) ;  70         return 0 ;  71     }  72   73     return DefWindowProc( hwnd, message, wParam, lParam ) ;  74 }

    这一个示例演示的是当鼠标在顾客区按下时弹出多个会话框,
对话框的从头到尾的经过是鼠标被按下时鼠标指针的职位音讯, 能够看看, 这里大家从没应用
GetCursorPos 函数来收获鼠标指针的岗位, 而是通过

        x = LOWORD( lParam ) ;    //获取鼠标位置x坐标信息          y = HIWORD( lParam ) ;    //获取鼠标位置y坐标信息

    来获得的, 参数lParam包含了鼠标指针的职分新闻,
在那之中未有字节表示x坐标, 高位字节表示y坐标,
利用LOWORDHIWORD宏能够赢得这一个坐标值,
这里得到的坐标指的是对峙于窗口顾客区的坐标。

 

三、顾客区鼠标新闻
    与键盘音信不一致, 在键盘音信中,
Windows只把键盘音信发送到当前有所输入大旨的窗口,
而鼠标消息无论窗口是或不是得到关节, 只要鼠标经过顾客区,
也许在顾客区内被单击窗口进程都会吸收接纳鼠标音信,
被点击(包括双击/单击/拖动)的窗口将改为活动窗口。与客商区新闻相对应的名叫非客商区消息,
非顾客区音信是指鼠标指针在窗口内并在在顾客区外的活动或单击/双击等,
非客商区富含窗口的标题栏、菜单栏、滚动条、窗口的边框,
那么些就要末端进行座谈, 这里先说顾客区鼠标新闻。
    
    1>. 鼠标单击
        鼠标在顾客区单击时各类鼠标开关所发出的新闻如下:

鼠标按键 按下时产生的消息 释放时产生的消息
左键 WM_LBUTTONDOWN WM_LBUTTONUP
中键 WM_MBUTTONDOWN WM_MBUTTONUP
右键 WM_RBUTTONDOWN WM_RBUTTONUP

        
        

 

 

    示例第22中学曾经演示了多少个拍卖鼠标左键单击的亲自过问,
对于中键和右键管理的措施是均等的,
只要等待Windows发来新闻然后管理那个新闻就行了。
        
    2>. wParam参数中的内容
        参数wParam中的值表示了鼠标按键、Shift键和Ctrl键的气象。
将wParam与”鼠标键”标志符举行按位与(&)运算可以获得鼠标开关与鼠标键的情状,
在此之前缀MK_为开始的标志符称为”鼠标键”, 有如下鼠标键:

            #define MK_LBUTTON          0x0001            //按下左键              #define MK_RBUTTON          0x0002            //按下右键
            #define MK_MBUTTON          0x0010            //按下中键              #define MK_SHIFT            0x0004            //按下Shift键              #define MK_CONTROL          0x0008            //按下Ctrl键  

        比如, 当接收到 WM_LBUTTONDOWN 消息时, 若

            wParam & MK_SHIFT 

        的值为TRUE(非零), 则代表按下左键的同一时候也按下了Shift键。
        例如:

        case WM_LBUTTONDOWN:              if( wParam & MK_CONTROL )              {                  MessageBox( hwnd, TEXT("Ctrl键与鼠标左键同时被按下!"), TEXT("鼠标动作"), MB_OK ) ;                  return 0 ;              }              return 0 ;

       
唯有当鼠标左键与键盘的Ctrl键同时被按下时我们弹出个对话框表达”Ctrl键与鼠标左键同临时间被按下!”,
否则什么也不做。
        
        3>. 鼠标双击
            双击对五遍击中的地点以致时光间隔都有早晚需要,
唯有当一遍急迅的单击在情理地方上靠的相当近并且时间间距比很短的情状下才算双击。
            
            假如想让窗口进度接受鼠标双击新闻,
供给在注册窗口类(RegisterClass)时,
最早化wndclass中的style成员的性质中再加上CS_DBLCLKS标识符:

                wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ;

            借使在窗口类的style成员中尚无富含 CS_DBLCLKS 标记符,
那么尽管当顾客双击时不会发出双击音讯, 而是产生一串如下的音讯:

                WM_LBUTTONDOWN                  WM_LBUTTONUP                  WM_LBUTTONDOWN                  WM_LBUTTONUP

            由于客商在三番五次三次按下鼠标左键时须求自然时间,
尽管这几个时刻异常的短暂, 可是在此个历程中等射程序依然有希望接受任何音讯的,
比如客户在急忙的三回单击中手的微微抖动就可以在里面插入多个WM_MOUSEMOVE的新闻,
这里权且忽略个中插入的音信, 借使消息就是三番五次的那些。
            
            当窗口类的style成员只中包括CS_DBLCLKS标志符后,
客户再一次双击就能够时有产生那样的一串音讯:

                WM_LBUTTONDOWN                  WM_LBUTTONUP                  WM_LBUTTONDBLCLK                  WM_LBUTTONUP

            能够见见, 在投入 CS_DBLCLKS 标志符后, 第多少个音讯
WM_LBUTTONDOWN 只是被略去的替换到了 WM_LBUTTONDBLCLK 消息。
            
            鼠标各种按钮双击时第八个音讯所对应替换的音讯如下:

            #define WM_LBUTTONDBLCLK                0x0203            //左键              #define WM_MBUTTONDBLCLK                0x0209            //中键              #define WM_RBUTTONDBLCLK                0x0206            //右键

 

四、非客商区鼠标新闻
    非顾客区音讯差十分的少与客商区新闻完全对应,
只是在标记符中多了二个”NC“字符(noclient),
当鼠标指针在窗口的非客户区移动时(比如标题栏), 窗口进度就能接受到
WM_NCMOUSEMOVE 信息, 在顾客区外鼠标按下发出的音信如下:

鼠标按键 按下 释放 第二次按下(双击)
左键 WM_NCLBUTTONDWON WM_NCLBUTTONUP WM_NCLBUTTONDBLCLK
中键 WM_NCMBUTTONDOWN WM_NCMBUTTONUP WM_NCMBUTTONDBLCLK
右键 WM_NCRBUTTONDOWN WM_NCRBUTTONUP WM_NCRBUTTONDBLCLK

 

 

 

  别的与客户区音信分裂的是, 这里的 wParam
参数中的值与顾客区中的含义有所不相同, 这里的 wParam
表示非客商区鼠标移动或单击的地方, 他的值被设定成一些以 HT
开始的标志符中, 表示 “命中测量试验“(Hit Test),
关于击中测量检验与以HT起头的标志符就要底下讲到。
    
    参数 lParam 中的值还是是鼠标指针的岗位消息,
但此时的音讯正好与顾客区中的 lParam 的坐标新闻相反, 顾客区中的 lParam
的值是相对于窗口顾客区的坐标, 而这里的(非客商区) lParam
中所包罗的坐标消息是显示屏坐标, 在下面已经涉嫌过,
使用ScreenToClientClientToScreen能够达成荧屏坐标与顾客区坐标之间的转速。
    
    处理非顾客区左键单击示例:

    switch(message)      {      case WM_PAINT:          hdc = BeginPaint( hwnd, &ps ) ;          EndPaint( hwnd, &ps ) ;          return 0 ;        case WM_NCLBUTTONDOWN:        //处理非客户区鼠标左键单击事件          MessageBox( hwnd, TEXT("非客户区鼠标左键被单击"), TEXT("鼠标动作"), MB_OK ) ;          return 0 ;        case WM_DESTROY:          PostQuitMessage(0) ;          return 0 ;      }

 

五、关于”击中测量试验”音信 WM_NCHITTEST
    WM_NCHITTEST代表”非客户区击中测验”,
所谓的命中测量检验正是测验鼠标当前所在的地方,
这一个新闻的预先级高于别的具备的顾客区和非客商区新闻, 参数 lParam
中包涵相对于显示器坐标的x值与y值, wParam 参数另有用途。
    
    日常的话, WM_NCHITTEST 音信是付出 DefWindowProc
暗中同意的音信管理函数进行管理的, 对于客商区中, Windows会利用 WM_NCHITTEST
新闻来发出负有和任何鼠标地方相关的鼠标新闻。对于非客商区音信的话,
DefWindowProc 管理 WM_NCHITTEST 新闻后赶回二个 wParam 值,
那一个值能够是随机二个非客商区鼠标新闻的 wParam 参数的值, 那个 wParam
值用来推断鼠标的处处的职责。
    
    比如来佛讲, 假若 DefWindowProc 函数在拍卖 WM_NCHITTEST 音信后再次回到四个
HTCLIENT , OPPOLIENT 代表鼠标在客户区,
那时Windows会将显示屏坐标转变来客户区坐标,并发出一个有关的顾客区的鼠标新闻;
    当重回值为 HTCAPTION 表示鼠标此时在二个标题栏中,
所以Windows会将那儿鼠标的坐标地方转成显示器坐标并发送有关的非客户区新闻。
    
    这一个再次回到的标志符定义在WINUSER.H头文件中, 相关的概念如下:

#define HTERROR             (-2)                    //在屏幕的后面或在窗体之间的线上(使函数DefWindowProc产生一个警示音)  #define HTTRANSPARENT       (-1)                    //在一个被其它窗口覆盖的窗口中  #define HTNOWHERE           0                        //在屏幕背景或窗口之间的分界线  #define HTCLIENT            1                        //在客户区中  #define HTCAPTION           2                        //在标题栏中  #define HTSYSMENU           3                        //在一个窗口菜单栏或子窗口的关闭按钮上  #define HTGROWBOX           4                        //在尺寸框中  #define HTSIZE              HTGROWBOX                //同HTGROWBOX  #define HTMENU              5                        //在菜单区域  #define HTHSCROLL           6                        //在水平滚动条上  #define HTVSCROLL           7                        //在垂直滚动条上  #define HTMINBUTTON         8                        //在最小化按钮上  #define HTMAXBUTTON         9                        //在最大化按钮上  #define HTLEFT              10                        //在窗口的左边框上  #define HTRIGHT             11                        //在窗口的右边框上  #define HTTOP               12                        //在窗口水平边框的上方  #define HTTOPLEFT           13                        //在窗口边框的左上角  #define HTTOPRIGHT          14                        //在窗口边框的右上角  #define HTBOTTOM            15                        //在窗口的水平边框的底部  #define HTBOTTOMLEFT        16                        //在窗口边框的左下角  #define HTBOTTOMRIGHT       17                        //在窗口边框的右下角  #define HTBORDER            18                        //在不具有可变大小边框的窗口的边框上  #define HTREDUCE            HTMINBUTTON                //同HTMINBUTTON  #define HTZOOM              HTMAXBUTTON                //同HTMAXBUTTON  #define HTSIZEFIRST         HTLEFT                    //同HTLEFT  #define HTSIZELAST          HTBOTTOMRIGHT             //同HTBOTTOMRIGHT  #define HTOBJECT            19                        //忽略该标识符, 已废弃  #define HTCLOSE             20                        //在关闭按钮上  #define HTHELP              21                        //在帮助按钮上

    那样在获得非客商区消息时大家就足以依附 wParam
中的值推断鼠标在窗口的岗位了, 像那样:

    case WM_NCLBUTTONDOWN:        //处理非客户区的鼠标左键单击事件          x = LOWORD( lParam ) ;    //通过lParam获取鼠标位置          y = HIWORD( lParam ) ;          switch(wParam)            //通过wParam判断鼠标在窗口的位置          {          case HTCAPTION:        //在标题上              wsprintf( szBuffer,  "鼠标左键在标题栏中被单击, 击中位置: (%i, %i)", x, y ) ;              MessageBox( hwnd, szBuffer, TEXT("鼠标动作"), MB_OK ) ;              break ;          case HTMINBUTTON:    //在最小化按钮上              wsprintf( szBuffer,  "鼠标左键在最小化按钮上被单击, 击中位置: (%i, %i)", x, y ) ;              MessageBox( hwnd, szBuffer, TEXT("鼠标动作"), MB_OK ) ;              break ;          case HTMAXBUTTON:    //在最大化按钮上              wsprintf( szBuffer,  "鼠标左键在最大化按钮上被单击, 击中位置: (%i, %i)", x, y ) ;              MessageBox( hwnd, szBuffer, TEXT("鼠标动作"), MB_OK ) ;              break ;          }          return 0 ;

    首先捕获 鼠标左键在非顾客区的单击事件, 然后再经过 wParam
剖断鼠标在窗口的职位, 这里获得鼠标地点是经过 LOWOOdysseyD 和 HIWOEnclaveD 宏完成的,
还恐怕有四个成效雷同的宏也能够用来收获lParam中的鼠标音讯, 他们是
GET_X_LPARAM 宏和 GET_Y_LPARAM, 不过这多个宏是定义在
WINDOWSX.H 头文件中的, 假如要利用那五个宏供给将 WINDOWSX.H
包涵进来。
    举例:

    xPos = GET_X_LPARAM(lParam) ;      yPos = GET_Y_LPARAM(lParam) ;

 

 


wid, 2012.11.30

 

上一篇: C语言Windows程序设计 -> 第十天 -> 响应键盘事件

 


在CHECKER2程序中,处理WM_KEYDOWN时采取GetCursorPos判定指针的地点,并动用ScreenToClient将显示器坐标转变来顾客区坐标,然后将坐标值除以矩形块的宽和高,获得x和y。那个x和y的值表示了矩形在5*5数组中的地点。当按下某些键时,鼠标指针或然在顾客区也说不定不在客商区内,因此x和y必得富含在min和max的宏管理中,保证它们的限量处于0和4之内。

CHECKER2.C

发表评论

电子邮件地址不会被公开。 必填项已用*标注