• C语言控制台窗口图形界面编程(八):鼠标事件


    <知识分享>

    上次讲的是键盘事件,这次我们介绍鼠标事件。下面先介绍下鼠标事件的结构体以及相关信息。


    1. typedef struct _MOUSE_EVENT_RECORD      //鼠标事件结构体  
    2. {  
    3.     COORD dwMousePosition;      //当前鼠标在控制台窗口缓冲区的位置  
    4.     DWORD dwButtonState;        //鼠标按键的状态  
    5.     DWORD dwControlKeyState;    //控制键状态  
    6.     DWORD dwEventFlags;         //鼠标事件类型  
    7. } MOUSE_EVENT_RECORD;  
    8. /* 
    9. 其中鼠标按键状态dwButtonState可能的值有 
    10. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    11. FROM_LEFT_1ST_BUTTON_PRESSED        最左边的鼠标键被按下      一般来说就是鼠标左键 
    12. FROM_LEFT_2ND_BUTTON_PRESSED        左起第二个鼠标键被按下    一般来说是鼠标中键,就是滚轮键 
    13. FROM_LEFT_3RD_BUTTON_PRESSED        左起第三个鼠标键被按下 
    14. FROM_LEFT_4TH_BUTTON_PRESSED        左起第四个鼠标键被按下 
    15. RIGHTMOST_BUTTON_PRESSED            最右边的鼠标键被按下      一般来说是鼠标右键 
    16. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    17. 控制键状态dwControlKeyState与键盘事件的一样 
    18. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    19. ENHANCED_KEY        扩展键被按下  
    20. LEFT_ALT_PRESSED    左Alt键被按下  
    21. LEFT_CTRL_PRESSED   左Ctrl键被按下  
    22. RIGHT_ALT_PRESSED   右Alt键被按下  
    23. RIGHT_CTRL_PRESSED  右Ctrl键被按下  
    24. NUMLOCK_ON          数字锁定被打开  
    25. SCROLLLOCK_ON       滚动锁定被打开  
    26. CAPSLOCK_ON         大写锁定被打开  
    27. SHIFT_PRESSED       Shift键被按下 
    28. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    29. 鼠标事件类型dwEventFlags有以下几种 
    30. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    31. DOUBLE_CLICK            双击,第一击只作为普通按键事件,第二击才作为双击事件 
    32. MOUSE_HWHEELED          水平鼠标滚轮移动 
    33. MOUSE_MOVED             鼠标移动 
    34. MOUSE_WHEELED           垂直鼠标滚轮移动 
    35. 0                       当鼠标有键被按下或者释放 
    36. */  

           下面给一个样例程序,实现在控制台窗口缓冲区的最下面一行显示当前鼠标在缓冲区的坐标,单击左键在当前鼠标位置输出字母A,单击右键则输出字母B,双击任何鼠标键退出的功能。程序如下:

    1. #include <stdio.h>  
    2. #include <windows.h>  
    3. #include <conio.h>  
    4.   
    5. HANDLE handle_in;  
    6. HANDLE handle_out;  
    7. CONSOLE_SCREEN_BUFFER_INFO csbi;        //定义窗口缓冲区信息结构体  
    8.   
    9. void DisplayMousePosition(COORD pos);   //显示鼠标所在位置  
    10.   
    11. void gotoxy(int x, int y);  //将光标移到坐标为(x,y)的位置  
    12.   
    13. int main()  
    14. {  
    15.     handle_in = GetStdHandle(STD_INPUT_HANDLE);      //获得标准输入设备句柄  
    16.     handle_out = GetStdHandle(STD_OUTPUT_HANDLE);    //获得标准输出设备句柄  
    17.     INPUT_RECORD mouserec;      //定义输入事件结构体  
    18.     DWORD res;      //用于存储读取记录  
    19.     COORD pos;      //用于存储鼠标当前位置  
    20.     COORD size = {80, 25};  //窗口缓冲区大小  
    21.     GetConsoleScreenBufferInfo(handle_out, &csbi);  //获得窗口缓冲区信息  
    22.     SetConsoleScreenBufferSize(handle_out, size);   //设置窗口缓冲区大小  
    23.     for (;;)  
    24.     {  
    25.         ReadConsoleInput(handle_in, &mouserec, 1, &res);      //读取输入事件  
    26.         pos = mouserec.Event.MouseEvent.dwMousePosition;    //获得当前鼠标位置  
    27.         gotoxy(0, 24);  //在第25行显示鼠标位置  
    28.         DisplayMousePosition(pos);      //显示鼠标位置  
    29.         if (mouserec.EventType == MOUSE_EVENT)    //如果当前为鼠标事件  
    30.         {  
    31.             gotoxy(pos.X, pos.Y);  
    32.             //单击鼠标左键,输出字符A  
    33.             if (mouserec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)  
    34.             {  
    35.                 putchar('A');  
    36.             }  
    37.             //单击鼠标右键,输出字符B  
    38.             if (mouserec.Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED)  
    39.             {  
    40.                 putchar('B');  
    41.             }  
    42.             //双击退出  
    43.             if (mouserec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)  
    44.             {  
    45.                 break;  
    46.             }  
    47.         }  
    48.     }  
    49.     CloseHandle(handle_out);  
    50.     CloseHandle(handle_in);  
    51.     return 0;  
    52. }  
    53.   
    54. void DisplayMousePosition(COORD pos)  
    55. {  
    56.     COORD dis = {0, 24};        //在第24行显示鼠标位置  
    57.     WORD att = FOREGROUND_GREEN | FOREGROUND_INTENSITY; //文本属性  
    58.     GetConsoleScreenBufferInfo(handle_out, &csbi);  //获得窗口缓冲区信息  
    59.     printf("X = %3d, Y = %3d", (int)pos.X, (int)pos.Y);  
    60.     FillConsoleOutputAttribute(handle_out, att, 16, dis, NULL);  //填充文本属性  
    61.     return;  
    62. }  
    63.   
    64. void gotoxy(int x, int y)  
    65. {  
    66.     COORD pos = {x, y};  
    67.     SetConsoleCursorPosition(handle_out, pos);  
    68. }  

           附上用本程序写的Hello world!的图:

  • 相关阅读:
    JAVA关键字Volatile的特性
    深入理解JAVA虚拟机之JVM性能篇---垃圾回收
    深入理解JAVA虚拟机之JVM性能篇---基础知识点(运行时数据区域)
    Oracle Rac创建表空间及用户
    数据库的事务隔离(转)
    数据库的三大范式和五大约束(转)
    一些常用的操作命令及知识点
    基于tomcat+springMVC搭建基本的前后台交互系统
    MYSQL注入天书之开天辟地
    MYSQL注入天书之前言
  • 原文地址:https://www.cnblogs.com/lxl0928/p/3807262.html
Copyright © 2020-2023  润新知