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

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

C语言控制台窗口图形界面编程(八):鼠标事件,布布扣,bubuko.com

时间: 2024-10-09 11:05:56

C语言控制台窗口图形界面编程(八):鼠标事件的相关文章

C语言控制台窗口图形界面编程(一)

本系列文章改编自<C语言控制台窗口界面编程(修正版)>.本系列文章会抛弃一些原文中难懂难理解且不常用的部分,并修改了部分样例程序.只为了更加清晰地学习C语言的控制台窗口界面编程.而想要更加深入的了解本系列文章,请阅读<C语言控制台窗口界面编程(修正版)>. <C语言控制台窗口界面编程(修正版)>下载地址:http://download.csdn.net/detail/jzqt_t/7471013 在Windows操作系统下用C语言编写控制台的窗口界面首先要获取当前标准输

C语言控制台窗口图形界面编程(二)

下面介绍几个用于控制台窗口操作的API函数,如下: [cpp] view plaincopy //获取控制台窗口信息 GetConsoleScreenBufferInfo(); //获取控制台窗口标题 GetConsoleTitle(); //更改指定缓冲区大小 SetConsoleScreenBufferSize(); //设置控制台窗口标题 SetConsoleTitle(); //设置控制台窗口信息 SetConsoleWindowInfo(); 下面的示例程序用于说明此类函数的使用: [

C语言控制台窗口图形界面编程(三)

<知识分享> 在这里介绍一个设置文本属性的函数,原型如下 [cpp] view plaincopy BOOL SetConsoleTextAttribute(   // 设置WriteConsole等函数的字符属性 HANDLE hConsoleOutput,          // 句柄 WORD wAttributes                // 文本属性 ); 顺便提一下文本属性,其实就是颜色属性,有背景色和前景色(就是字符的颜色)两类,每一类只提供三原色(红,绿,蓝)和加强色(

C语言控制台窗口图形界面编程(五).

控制文本的移动是控制台窗口界面编程的一个很重要的功能,有了这个功能我们可以实现界面的滚动.下面我们介绍一个控制文本移动的函数,如下: BOOL ScrollConsoleScreenBuffer(             //文本移动函数 HANDLE hConsoleOutput,                  //句柄 const SMALL_RECT *lpScrollRectangle,    //移动区域 const SMALL_RECT *lpClipRectangle,    

C语言控制台窗口图形界面编程(总结)

<知识分享(来自我的CSDN)>   :http://blog.csdn.net/jzqt_t/article/details/32225195 本系列文章是笔者通过学习<C语言控制台窗口界面编程(修正版)>而写(关于此文档的更多信息请看本系列文章第一篇),旨在让大家更加清晰简洁容易地学习C语言控制台窗口界面的编程. 通过本系列文章我们可以在控制台窗口中制作好看的图形界面,方便了在非TC开发环境中的控制台窗口中进行文本界面和图形界面的设计,有利于向Windows应用程序开发过渡.也

C语言控制台窗体图形界面编程(总结)

本系列文章是笔者通过学习<C语言控制台窗体界面编程(修正版)>而写(关于此文档的很多其它信息请看本系列文章第一篇),旨在让大家更加清晰简洁easy地学习C语言控制台窗体界面的编程. 通过本系列文章我们能够在控制台窗体中制作好看的图形界面,方便了在非TC开发环境中的控制台窗体中进行文本界面和图形界面的设计,有利于向Windows应用程序开发过渡.也能够通过学习这些东西写些好玩的经典游戏比方贪吃蛇,扫雷和俄罗斯方块等. 事实上这些编程技巧并不算是C语言的.事实上,它仅仅只是是通过调用Windows

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

目录 00. 目录 01. INPUT_RECORD结构 02. MOUSE_EVENT_RECORD结构 03. ReadConsoleInput函数 04. 示例程序 00. 目录 01. INPUT_RECORD结构 描述控制台输入缓冲区中的输入事件.可以使用ReadConsoleInput或PeekConsoleInput函数从输入缓冲区读取这些记录,也可以使用WriteConsoleInput函数将这些记录写入输入缓冲区. 类型声明: typedef struct _INPUT_REC

【C语言】控制台窗口图形界面编程(八):键盘事件

目录 00. 目录 01. INPUT_RECORD结构 02. KEY_EVENT_RECORD结构 03. ReadConsoleInput函数 04. 示例程序 00. 目录 01. INPUT_RECORD结构 描述控制台输入缓冲区中的输入事件.可以使用ReadConsoleInput或PeekConsoleInput函数从输入缓冲区读取这些记录,也可以使用WriteConsoleInput函数将这些记录写入输入缓冲区. 类型声明: typedef struct _INPUT_RECOR

【C语言】控制台窗口图形界面编程(五):文本移动

目录 00. 目录 01. CHAR_INFO结构 02. ScrollConsoleScreenBuffer函数 03. 程序示例 04. 官方参考程序 00. 目录 01. CHAR_INFO结构 指定Unicode或ANSI字符及其属性.控制台功能使用此结构来读取和写入控制台屏幕缓冲区. 类型声明 typedef struct _CHAR_INFO { union { WCHAR UnicodeChar; CHAR AsciiChar; } Char; WORD Attributes; }