美高梅游戏官网娱乐_美高梅手机登录网站

美高梅游戏官网娱乐是公司推出的企业级即时在线娱乐平台,美高梅手机登录网站业界专业、信誉最好的博彩网站,美高梅游戏官网娱乐拥有最高优惠活动和返水,拥有丰富的管理经验和专业的技术队.。

来自 操作系统 2019-12-22 09:58 的文章
当前位置: 美高梅游戏官网娱乐 > 操作系统 > 正文

利用←、→、↑、↓四个方向键可以在25个矩形之

CHECKE奥迪Q52程序包蕴四个键盘接口,内容与CHECKE锐界1完全相符。利用←、→、↑、↓多少个方向键能够在贰十二个矩形之间活动鼠标指针。Home键把鼠标指针移动到左上角的矩形;End键使鼠标指针落到右下角的矩形。空格键和回车键都能够切换X形标识。

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 头文件中, 别的还会有以下标志符及其相应的样式:

图片 1

二、使用鼠标的简易示例
    1>. 示例豆蔻梢头: 获取鼠标指针地方
        在这里个示例中示范如何得到鼠标的岗位, 先说下相关的音讯标志符以致函数。
        新闻标记符: WM_MOUSEMOVE 当鼠标指针在顾客区内活动或鼠标指针经过客商区窗口时会获得这几个信息。
        获取鼠标地点的函数: GetCursorPos 该函数的原型: BOOL GetCursorPos(LPPOINT lpPoint卡塔尔(英语:State of Qatar) ;
        代码片段:

图片 2

 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 ;

图片 3

    完整的亲自过问代码:

图片 4View Code - GetCursorPosition

图片 5

 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 }

图片 6

        说一下风姿浪漫体化的思绪, 要即时追踪获取鼠标在显示屏中的坐标, 首先要捕获鼠标的运动音信 WM_MOUSEMOVE, 当Windows向大家发来以此音信时就代码鼠标在进展运动, 随后我们对这几个鼠标移动新闻举行管理, 调用 GetCursorPos(&pt) ; 这些函数获取鼠标以后之处, 获取到鼠标地方后为了能够马上在窗口中展现出来, 再调用 InvalidateRect( hwnd, NULL, TRUE ) ; 使一切客商区形成无效状态, 从而引发 WM_PAINT 须要重绘客商区内容的新闻, 在拍卖重绘新闻时输出刚刚拿到的鼠标指针坐标地点。
        
        关于 ScreenToClient( hwnd, &pt ) ; :
            那么些函数的功力是将荧屏坐标(相对于全数显示屏左上角的坐标卡塔尔调换到相对于窗口客商区的坐标, 显示屏坐标与窗口客商区坐标的含义如图所示:

图片 7

            GetCursorPos获得的鼠标地方是显示屏坐标, 即便想清楚他在窗口客商区内的相持地点就需要调用ScreenToClient函数将其转变为客商区坐标。
          别的还应该有贰个WIndows函数是将窗口顾客区坐标转成显示屏坐标的, 函数为: ClientToScreen( hwnd, &pt ) ;

          获取鼠标指针的地点还应该有其余的法门, 这里只是当中的生机勃勃种。
    
    
    2>. 示例二: 管理鼠标左键单击事件
        鼠标左键在客商区被单击时发来的音讯: WM_LBUTTONDOWN

图片 8

 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     }

图片 9

    完整的演示代码:

图片 10View Code - WM_LBUTTONDOWN

图片 11

 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 }

图片 12

    这些示例演示的是当鼠标在客商区按下时弹出贰个会话框, 对话框的源委是鼠标被按下时鼠标指针的地点消息, 可以见到, 这里大家从不利用 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(非零卡塔尔(英语:State of Qatar), 则表示按下左键的还要也按下了Shift键。
        例如:

图片 13

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

图片 14

        只有当鼠标左键与键盘的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卡塔尔(英语:State of Qatar), 当鼠标指针在窗口的非客商区移动时(举例标题栏卡塔尔, 窗口进程就能够收到到 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 的值是周旋于窗口顾客区的坐标, 而这里的(非顾客区卡塔尔(英语:State of Qatar) lParam 中所富含的坐标音信是荧屏坐标, 在上面已经涉及过, 使用ScreenToClientClientToScreen能够完结显示器坐标与顾客区坐标之间的倒车。
    
    管理非客商区左键单击示例:

图片 15

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

图片 16

 

五、关于"击中测试"音信WM_NCHITTEST
    WM_NCHITTEST表示"非客户区击中测量试验", 所谓的命中测验便是测量试验鼠标当前所在的任务, 那些新闻的先行级高于别的具备的客商区和非顾客区音讯, 参数 lParam 中包蕴相对于荧屏坐标的x值与y值, wParam 参数另有用场。
    
    平时的话, WM_NCHITTEST 音信是提交 DefWindowProc 私下认可的新闻管理函数实行处理的, 对于客商区中, Windows会利用 WM_NCHITTEST 音讯来发出负有和其他鼠标地点相关的鼠标新闻。对于非顾客区音讯的话, DefWindowProc 管理 WM_NCHITTEST 信息后赶回八个 wParam 值, 那几个值能够是专断贰个非客商区鼠标音讯的 wParam 参数的值, 那个 wParam 值用来剖断鼠标的随地的任务。
    
    比方来说, 假使 DefWindowProc 函数在管理 WM_NCHITTEST 新闻后归来三个 HTCLIENT , NokiaLIENT 表示鼠标在顾客区, 那时Windows会将显示屏坐标调换来顾客区坐标,并发出三个连锁的顾客区的鼠标音信;
    当重回值为 HTCAPTION 表示鼠标那时候在一个标题栏中, 所以Windows会将那时鼠标的坐标地方转成显示屏坐标并发送有关的非顾客区音讯。
    
    那些再次回到的标志符定义在WINUSER.H头文件中, 相关的概念如下:

图片 17

#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                        //在帮助按钮上

图片 18

    这样在获取非客商区音讯时大家就足以依赖 wParam 中的值推断鼠标在窗口的职位了, 像那样:

图片 19

    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 ;

图片 20

    首先捕获 鼠标左键在非客商区的单击事件, 然后再经过 wParam 推断鼠标在窗口的岗位, 这里获得鼠标地点是因此 LOWOHighlanderD 和 HIWOEnclaveD 宏完结的, 还应该有七个效用相近的宏也能够用来获取lParam中的鼠标新闻, 他们是 GET_X_LPARAM 宏和 GET_Y_LPARAM, 不过这四个宏是定义在 WINDOWSX.H 头文件中的, 假若要动用那四个宏要求将 WINDOWSX.H 包括进来。
    举例:

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

 

 


 

转自:

图片 21图片 22

  1 /*---------------------------------------------
  2 CHECKER2.C -- Mouse Hit-Test Demo Program No.2
  3               (c) Charles Petzold, 1998
  4 ---------------------------------------------*/
  5 
  6 #include <Windows.h>
  7 
  8 #define DIVISIONS 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("Checker2");
 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("Checker2 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[DIVISIONS][DIVISIONS];
 61     static int cxBlock, cyBlock;
 62     HDC hdc;
 63     int x, y;
 64     PAINTSTRUCT ps;
 65     POINT point;
 66     RECT rect;
 67 
 68     switch (message)
 69     {
 70     case WM_SIZE:
 71         cxBlock = LOWORD(lParam) / DIVISIONS;
 72         cyBlock = HIWORD(lParam) / DIVISIONS;
 73         return 0;
 74 
 75     case WM_SETFOCUS:
 76         ShowCursor(TRUE);
 77         return 0;
 78 
 79     case WM_KILLFOCUS:
 80         ShowCursor(FALSE);
 81         return 0;
 82 
 83     case WM_KEYDOWN:
 84         GetCursorPos(&point);
 85         ScreenToClient(hwnd, &point);
 86 
 87         x = max(0, min(DIVISIONS - 1, point.x / cxBlock));
 88         y = max(0, min(DIVISIONS - 1, point.y / cyBlock));
 89 
 90         switch (wParam)
 91         {
 92         case VK_UP:
 93             --y;
 94             break;
 95 
 96         case VK_DOWN:
 97             ++y;
 98             break;
 99 
100         case VK_LEFT:
101             --x;
102             break;
103 
104         case VK_RIGHT:
105             ++x;
106             break;
107 
108         case VK_HOME:
109             x = y = 0;
110             break;
111 
112         case VK_END:
113             x = y = DIVISIONS - 1;
114             break;
115 
116         case VK_RETURN:
117         case VK_SPACE:
118             SendMessage(hwnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELONG(x * cxBlock, y * cyBlock));
119             break;
120         }
121 
122         x = (x + DIVISIONS) % DIVISIONS;
123         y = (y + DIVISIONS) % DIVISIONS;
124 
125         point.x = x * cxBlock + cxBlock / 2;
126         point.y = y * cyBlock + cyBlock / 2;
127 
128         ClientToScreen(hwnd, &point);
129         SetCursorPos(point.x, point.y);
130         return 0;
131 
132     case WM_LBUTTONDOWN:
133         x = LOWORD(lParam) / cxBlock;
134         y = HIWORD(lParam) / cyBlock;
135 
136         if (x < DIVISIONS && y < DIVISIONS)
137         {
138             fState[x][y] ^= 1;
139 
140             rect.left = x * cxBlock;
141             rect.top = y * cyBlock;
142             rect.right = (x + 1) * cxBlock;
143             rect.bottom = (y + 1) * cyBlock;
144 
145             InvalidateRect(hwnd, &rect, FALSE);
146         }
147         else
148             MessageBeep(0);
149         return 0;
150 
151     case WM_PAINT:
152         hdc = BeginPaint(hwnd, &ps);
153 
154         for (x = 0; x < DIVISIONS; ++x)
155             for (y = 0; y < DIVISIONS; ++y)
156             {
157                 Rectangle(hdc, x * cxBlock, y * cyBlock
158                     , (x + 1) * cxBlock, (y + 1) * cyBlock);
159                 
160                 if (fState[x][y])
161                 {
162                     MoveToEx(hdc, x * cxBlock, y * cyBlock, NULL);
163                     LineTo(hdc, (x + 1) * cxBlock, (y + 1) * cyBlock);
164                     MoveToEx(hdc, x * cxBlock, (y + 1) * cyBlock, NULL);
165                     LineTo(hdc, (x + 1) * cxBlock, y * cyBlock);
166                 }
167             }
168 
169         EndPaint(hwnd, &ps);
170         return 0;
171 
172     case WM_DESTROY:
173         PostQuitMessage(0);
174         return 0;
175     }
176 
177     return DefWindowProc(hwnd, message, wParam, lParam);
178 }

CHECKER2.C

在CHECKER2程序中,处理WM_KEYDOWN时接收GetCursorPos剖断指针的职位,并行使ScreenToClient将显示屏坐标调换来顾客区坐标,然后将坐标值除以矩形块的宽和高,获得x和y。这么些x和y的值表示了矩形在5*5数组中的地方。当按下有些键时,鼠标指针只怕在顾客区也是有可能不在客商区内,因此x和y必得含有在min和max的宏管理中,保险它们的界定处于0和4之内。

对此方向键,CHECKE讴歌RDX2程序相应的充实或裁减x和y的值。若按下回车键或空格键,CHECKEENCORE2程序调用SendMessage给本人发送一个WM_LBUTTONDOWN消息。最后,WM_KEYDOWN管理逻辑总括得到针对性矩形主旨的客户区坐标,并调用ClientToScreen将其转变到荧屏坐标,最终调用SetCursorPos设置指针的职分。

本文由美高梅游戏官网娱乐发布于操作系统,转载请注明出处:利用←、→、↑、↓四个方向键可以在25个矩形之

关键词: