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

来源:互联网 发布:海康威监控无网络视频 编辑:程序博客网 时间:2024/05/30 05:42
       上次讲的是键盘事件,这次我们介绍鼠标事件。下面先介绍下鼠标事件的结构体以及相关信息。
typedef struct _MOUSE_EVENT_RECORD      //鼠标事件结构体{    COORD dwMousePosition;      //当前鼠标在控制台窗口缓冲区的位置    DWORD dwButtonState;        //鼠标按键的状态    DWORD dwControlKeyState;    //控制键状态    DWORD dwEventFlags;         //鼠标事件类型} MOUSE_EVENT_RECORD;/*其中鼠标按键状态dwButtonState可能的值有~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~FROM_LEFT_1ST_BUTTON_PRESSED        最左边的鼠标键被按下      一般来说就是鼠标左键FROM_LEFT_2ND_BUTTON_PRESSED        左起第二个鼠标键被按下    一般来说是鼠标中键,就是滚轮键FROM_LEFT_3RD_BUTTON_PRESSED        左起第三个鼠标键被按下FROM_LEFT_4TH_BUTTON_PRESSED        左起第四个鼠标键被按下RIGHTMOST_BUTTON_PRESSED            最右边的鼠标键被按下      一般来说是鼠标右键~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~控制键状态dwControlKeyState与键盘事件的一样~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ENHANCED_KEY        扩展键被按下 LEFT_ALT_PRESSED    左Alt键被按下 LEFT_CTRL_PRESSED   左Ctrl键被按下 RIGHT_ALT_PRESSED   右Alt键被按下 RIGHT_CTRL_PRESSED  右Ctrl键被按下 NUMLOCK_ON          数字锁定被打开 SCROLLLOCK_ON       滚动锁定被打开 CAPSLOCK_ON         大写锁定被打开 SHIFT_PRESSED       Shift键被按下~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~鼠标事件类型dwEventFlags有以下几种~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~DOUBLE_CLICK            双击,第一击只作为普通按键事件,第二击才作为双击事件MOUSE_HWHEELED          水平鼠标滚轮移动MOUSE_MOVED             鼠标移动MOUSE_WHEELED           垂直鼠标滚轮移动0                       当鼠标有键被按下或者释放*/


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

#include <stdio.h>#include <windows.h>#include <conio.h>HANDLE handle_in;HANDLE handle_out;CONSOLE_SCREEN_BUFFER_INFO csbi;        //定义窗口缓冲区信息结构体void DisplayMousePosition(COORD pos);   //显示鼠标所在位置void gotoxy(int x, int y);  //将光标移到坐标为(x,y)的位置int main(){    handle_in = GetStdHandle(STD_INPUT_HANDLE);      //获得标准输入设备句柄    handle_out = GetStdHandle(STD_OUTPUT_HANDLE);    //获得标准输出设备句柄    INPUT_RECORD mouserec;      //定义输入事件结构体    DWORD res;      //用于存储读取记录    COORD pos;      //用于存储鼠标当前位置    COORD size = {80, 25};  //窗口缓冲区大小    GetConsoleScreenBufferInfo(handle_out, &csbi);  //获得窗口缓冲区信息    SetConsoleScreenBufferSize(handle_out, size);   //设置窗口缓冲区大小    for (;;)    {        ReadConsoleInput(handle_in, &mouserec, 1, &res);      //读取输入事件        pos = mouserec.Event.MouseEvent.dwMousePosition;    //获得当前鼠标位置        gotoxy(0, 24);  //在第25行显示鼠标位置        DisplayMousePosition(pos);      //显示鼠标位置        if (mouserec.EventType == MOUSE_EVENT)    //如果当前为鼠标事件        {            gotoxy(pos.X, pos.Y);            //单击鼠标左键,输出字符A            if (mouserec.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)            {                putchar('A');            }            //单击鼠标右键,输出字符B            if (mouserec.Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED)            {                putchar('B');            }            //双击退出            if (mouserec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)            {                break;            }        }    }    CloseHandle(handle_out);    CloseHandle(handle_in);    return 0;}void DisplayMousePosition(COORD pos){    COORD dis = {0, 24};        //在第24行显示鼠标位置    WORD att = FOREGROUND_GREEN | FOREGROUND_INTENSITY; //文本属性    GetConsoleScreenBufferInfo(handle_out, &csbi);  //获得窗口缓冲区信息    printf("X = %3d, Y = %3d", (int)pos.X, (int)pos.Y);    FillConsoleOutputAttribute(handle_out, att, 16, dis, NULL);  //填充文本属性    return;}void gotoxy(int x, int y){COORD pos = {x, y};SetConsoleCursorPosition(handle_out, pos);}


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


       注意:当使用system函数后鼠标事件无法正常发生。

2 0