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                       当鼠标有键被按下或者释放
*/以下给一个例子程序,实如今控制台窗体缓冲区的最以下一行显示当前鼠标在缓冲区的坐标,单击左键在当前鼠标位置输出字母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函数后鼠标事件无法正常发生。
C语言控制台窗体图形界面编程(八):鼠标事件的更多相关文章
- C语言控制台窗体图形界面编程(总结)
		本系列文章是笔者通过学习<C语言控制台窗体界面编程(修正版)>而写(关于此文档的很多其它信息请看本系列文章第一篇),旨在让大家更加清晰简洁easy地学习C语言控制台窗体界面的编程. 通过本 ... 
- 【C语言】控制台窗口图形界面编程(七):鼠标事件
		目录 00. 目录 01. INPUT_RECORD结构 02. MOUSE_EVENT_RECORD结构 03. ReadConsoleInput函数 04. 示例程序 00. 目录 01. INP ... 
- 【C语言】控制台窗口图形界面编程(八):键盘事件
		目录 00. 目录 01. INPUT_RECORD结构 02. KEY_EVENT_RECORD结构 03. ReadConsoleInput函数 04. 示例程序 00. 目录 01. INPUT ... 
- 【C语言】控制台窗口图形界面编程(一)句柄和文本属性
		目录 00. 目录 01. 句柄 02. GetStdHandle函数 03. CloseHandle函数 04. SetConsoleTextAttribute函数 05. 十进制颜色对照表 06. ... 
- 【C语言】控制台窗口图形界面编程(六):光标设置
		目录 00. 目录 01. CONSOLE_CURSOR_INFO结构 02. GetConsoleCursorInfo函数 03. SetConsoleCursorInfo函数 04. SetCon ... 
- 【C语言】控制台窗口图形界面编程(五):文本移动
		目录 00. 目录 01. CHAR_INFO结构 02. ScrollConsoleScreenBuffer函数 03. 程序示例 04. 官方参考程序 00. 目录 01. CHAR_INFO结构 ... 
- 【C语言】控制台窗口图形界面编程(四):文本输出
		目录 00. 目录 01. FillConsoleOutputAttribute函数 02. FillConsoleOutputCharacter函数 03. WriteConsoleOutputCh ... 
- 【C语言】控制台窗口图形界面编程(二)窗口信息和填充缓冲区
		目录 00. 目录 01. COORD结构体 02. SMALL_RECT结构 03. CONSOLE_SCREEN_BUFFER_INFO结构体 04. GetConsoleScreenBuffer ... 
- Linux C 程序 GTK+图形界面编程(22)
		GTK+图形界面编程 Linux大多是在字符界面,但也可以开发图形界面 目前已经存在多种Linux下开发图形界面的程序开发包:最常用的是Qt和GTK+ Qt是一个跨平台的图形界面开发库,不仅仅支持Li ... 
随机推荐
- JavaScript深拷贝—我遇到的应用场景
			简述 深拷贝即拷贝实例,其作用是为了不影响拷贝后的数组对起原数组造成影响.这时我们就需要进行深拷贝.(JavaScript的继承) 我遇到的应用场景 我是在用vue的element-ui做项目的时候遇 ... 
- Android------第一次启动出现白屏或者黑屏
			APP开发中,第一次运行启动app时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示. 当打开一个Activity时,如果这个Activity所属Application还没有在运行, 系统 ... 
- ActiveMQ消息队列使用和配置
			安装ActiveMQ 使用brew安装https://blog.csdn.net/u010046908/article/details/54728375 直接下载安装https://blog.csdn ... 
- tensorflow入门(二)
			import numpy as np import tensorflow as tf import matplotlib.pyplot as plt #使用numpy生成200个随机点 x_data ... 
- day38 爬虫之Scrapy + Flask框架
			s1617day3 内容回顾: Scrapy - 创建project - 创建爬虫 - 编写 - 类 - start_urls = ['http://www.xxx.com'] - def parse ... 
- 面向对象:三大特性、类成员、property
			一.类的基础知识 python 一切皆为对象. 我们以前的str,list,int 都是对象. 1.1 类的定义 与 调用 class 关键字用来定义类,注意类名首字母大写. 类的调用,先实例化一个类 ... 
- python 语法错误记录
			1 Missing parameter end_time in docstring less... (Ctrl+F1) 参数位置错误 注意:只有在形参表末尾的那些参数可以有默认参数值,即你不能在声明 ... 
- java中容器的学习与理解
			以前一直对于java中容器的概念不理解,虽然学习过,但始终没有认真理解过,这几天老师提出了这样一个问题,你怎么理解java中的容器.瞬间就蒙了.于是各种搜资料学习了一下,下面是我学习后整理出来的的一些 ... 
- poj2195
			题解: 简单KM 把每一个男的和房子分离 代码: #include<cstdio> #include<cmath> #include<algorithm> #inc ... 
- C++开发人脸性别识别教程(6)——通过SVM实现性别识别
			http://blog.csdn.net/u013088062/article/details/50480518 
