zoukankan      html  css  js  c++  java
  • 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!的图:

  • 相关阅读:
    测试开发进阶——Spring cloud——理解——微服务中微服务网关理解(转载)
    测试开发进阶——Spring cloud——理解——微服务中断路器模式理解(转载)
    测试开发进阶——Spring cloud——理解——微服务中负载均衡理解(转载)
    ORM 多表作业
    python-Matplotlib库
    beego Dockerfile
    java单例模式-饿汉式
    Java字符串连接:Java8字符串连接收集器Collectors.joining
    Odoo14学习笔记(11) 实例-简单的按年份月份查询报表
    002. git 分支管理
  • 原文地址:https://www.cnblogs.com/JZQT/p/3802433.html
Copyright © 2011-2022 走看看