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

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

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                       当鼠标有键被按下或者释放
*/

本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/C/

下面给一个样例程序,实现在控制台窗口缓冲区的最下面一行显示当前鼠标在缓冲区的坐标,单击左键在当前鼠标位置输出字母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!的图:

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索鼠标
, 事件
, 位置
, 缓冲区
, 窗口
, pos
, gotoxy函数
鼠标滚轮编程
c语言控制台界面编程、c语言控制台编程、c语言图形界面编程、c语言图形编程、c语言图形化编程,以便于您获取更多的相关知识。

时间: 2024-12-18 08:27:12

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

C语言控制台窗口图形界面编程之七 键盘事件

输入事件中的键盘事件通常有字符事件和按键事件,这些事件的附带信息构成了键盘输入的信息,而想要读取这些信息,是要通过API函数ReadConsoleInput来获取的,函数原型如下: BOOL ReadConsoleInput( //读取输入信息 HANDLE hConsoleInput, //句柄 PINPUT_RECORD lpBuffer, //输入事件结构体的指针 DWORD nLength, //要读取的记录数 LPDWORD lpNumberOfEventsRead //用来接受成功读

C语言控制台窗口图形界面编程之六 光标操作

控制台窗口的光标的位置反映的是当前文本输入的插入位置,通过Windows API函数我们可以随意更改光标的位置,下面介绍这个控制光标位置的API函 BOOL SetConsoleCursorPosition( //设置光标位置 HANDLE hConsoleOutput, //句柄 COORD dwCursorPosition //坐标 ); //若函数调用成功则返回非0值 不仅仅是光标的位置,光标的信息我们也可以通过一些API函数来设置,下面介绍光标信息结构体已经获得和设置光标信息的API函数

C语言控制台窗口图形界面编程之五 控制文本移动的函数

控制文本的移动是控制台窗口界面编程的一个很重要的功能,有了这个功能我们可以实现界面的滚动.下面我们介绍一个控制文本移动的函数,如下: BOOL ScrollConsoleScreenBuffer( //文本移动函数 HANDLE hConsoleOutput, //句柄 const SMALL_RECT *lpScrollRectangle, //移动区域 const SMALL_RECT *lpClipRectangle, //裁剪区域,如果为NULL,那么将代表整个屏幕缓冲区 COORD d

C语言控制台窗口图形界面编程之三 设置文本属性的函数

在这里介绍一个设置文本属性的函数,原型如下 BOOL SetConsoleTextAttribute( // 设置WriteConsole等函数的字符属性 HANDLE hConsoleOutput, // 句柄 WORD wAttributes // 文本属性 ); 本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/C/ 顺便提一下文本属性,其实就是颜色属性,有背景色和前景色(就是字符的颜色)两类,每一类只提供

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

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

C语言控制台窗口图形界面编程之四 常用的文本输出函数

文本颜色属性已经学会了,那么下面就学习几个比较常用的文本输出函数,如下: BOOL FillConsoleOutputAttribute( // 填充字符属性 HANDLE hConsoleOutput, // 句柄 WORD wAttribute, // 文本属性 DWORD nLength, // 个数 COORD dwWriteCoord, // 开始位置 LPDWORD lpNumberOfAttrsWritten // 返回填充的个数 ); BOOL FillConsoleOutput

C语言控制台窗口图形界面编程之二 用于控制台窗口操作的API函数

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

请问java图形界面编程中怎样改变消息提示框中确定按钮的文本内容啊?

问题描述 请问java图形界面编程中怎样改变消息提示框中确定按钮的文本内容啊? 问题补充:恩恩,swing的!请问怎么改啊?xiaolv 写道 解决方案 JOptionPane.setDefaultLocale(Locale.CHINA);JOptionPane.showMessageDialog(null, "11", "22",JOptionPane.INFORMATION_MESSAGE);这个按钮自动集成多语言.只能通来Locale来改.想要OK就用Loca

java-Java图形界面编程怎样动态绘制矩形?

问题描述 Java图形界面编程怎样动态绘制矩形? 就是类似Windows自带画图程序的那种,从一个点拖动到另一个点, 动态地绘制一个任意大小的矩形,大概的思路是怎样的 如果有其它语言实现的,可以讲一下大概的思路啊,不一定要代码 解决方案 '先确定要画的是矩形,在获取鼠标按下点的坐标,在获取移动到的点的坐标,实现移动一次图形更新一次,最后确定下鼠标抬起点的坐标,用以确定最后矩形的的大小 解决方案二: 这里有个完整的例子:http://developer.51cto.com/art/201201/3