Easyx进阶(二)

14 篇文章 0 订阅
6 篇文章 5 订阅

Easyx进阶(二)

——消息处理

消息缓冲区可以缓冲 63 个未处理的消息。每次获取消息时,将从消息缓冲区取出一个最早发生的消息。消息缓冲区满了之后,不再接收任何消息。

1. 消息以及分类

1.1 分类

  • 键盘消息
  • 鼠标消息
  • 其他

1.2 消息结构体(ExMessage)

struct ExMessage
{
	USHORT message;					// 消息标识
	union
	{
		// 鼠标消息的数据
		struct
		{
			bool ctrl		:1;		// Ctrl 键是否按下
			bool shift		:1;		// Shift 键是否按下
			bool lbutton	:1;		// 鼠标左键是否按下
			bool mbutton	:1;		// 鼠标中键是否按下
			bool rbutton	:1;		// 鼠标右键
			short x;				// 鼠标的 x 坐标
			short y;				// 鼠标的 y 坐标
			short wheel;			// 鼠标滚轮滚动值,为 120 的倍数
		};

		// 按键消息的数据
		struct
		{
			BYTE vkcode;			// 按键的虚拟键码
			BYTE scancode;			// 按键的扫描码(依赖于 OEM)
			bool extended	:1;		// 按键是否是扩展键
			bool prevdown	:1;		// 按键的前一个状态是否按下
		};

		// 字符消息的数据
		TCHAR ch;

		// 窗口消息的数据
		struct
		{
			WPARAM wParam;
			LPARAM lParam;
		};
	};
};

成员

  • message:消息标识
消息标识消息类别描述
WM_MOUSEMOVEEX_MOUSE鼠标移动消息。
WM_MOUSEWHEEL鼠标滚轮拨动消息。
WM_LBUTTONDOWN左键按下消息。
WM_LBUTTONUP左键弹起消息。
WM_LBUTTONDBLCLK左键双击消息。
WM_MBUTTONDOWN中键按下消息。
WM_MBUTTONUP中键弹起消息。
WM_MBUTTONDBLCLK中键双击消息。
WM_RBUTTONDOWN右键按下消息。
WM_RBUTTONUP右键弹起消息。
WM_RBUTTONDBLCLK右键双击消息。
WM_KEYDOWNEX_KEY按键按下消息
WM_KEYUP按键弹起消息。
WM_CHAREX_CHAR字符消息。
WM_ACTIVATEEX_WINDOW窗口激活状态改变消息。
WM_MOVE窗口移动消息。
WM_SIZE窗口大小改变消息。
  • ctrl:Ctrl 键是否按下。仅当消息所属类别为 EX_MOUSE 时有效。
  • shift:Shift 键是否按下。仅当消息所属类别为 EX_MOUSE 时有效。
  • lbutton:鼠标左键是否按下。仅当消息所属类别为 EX_MOUSE 时有效。
  • mbutton:鼠标中键是否按下。仅当消息所属类别为 EX_MOUSE 时有效。
  • rbutton:鼠标右键是否按下。仅当消息所属类别为 EX_MOUSE 时有效。
  • x:当前鼠标 x 坐标(物理坐标)。仅当消息所属类别为 EX_MOUSE 时有效。
  • y:当前鼠标 y 坐标(物理坐标)。仅当消息所属类别为 EX_MOUSE 时有效。
  • wheel:鼠标滚轮滚动值,为 120 的倍数。仅当消息所属类别为 EX_MOUSE 时有效。
  • vkcode:按键的虚拟键码。仅当消息所属类别为 EX_KEY 时有效。在微软网站上列出有所有的虚拟键码:https://docs.microsoft.com/windows/win32/inputdev/virtual-key-codes
返回的常量Value说明
VK_LBUTTON0x01鼠标左键
VK_RBUTTON0x02鼠标右键
VK_CANCEL0x03控制中断处理
VK_MBUTTON0x04中间鼠标按钮 (三键鼠标)
VK_XBUTTON10x05X1 鼠标按钮
VK_XBUTTON20x06X2 鼠标按钮
-0x07Undefined
VK_BACK0x08BACKSPACE 密钥
VK_TAB0x09Tab 键
-0x0A-0B预留
VK_CLEAR0x0CCLEAR 键
VK_RETURN0x0DEnter 键
-0x0E-0FUndefined
VK_SHIFT0x10SHIFT 键
VK_CONTROL0x11Ctrl 键
VK_MENU0x12Alt 键
VK_PAUSE0x13PAUSE 键
VK_CAPITAL0x14CAPS LOCK 键
VK_KANA0x15IME Kana 模式
VK_HANGUEL0x15IME 朝鲜文库埃尔模式 (保持兼容性;使用 VK_HANGUL)
VK_HANGUL0x15IME Hanguel 模式
VK_IME_ON0x16IME On
VK_JUNJA0x17IME Junja 模式
VK_FINAL0x18IME 最终模式
VK_HANJA0x19IME Hanja 模式
VK_KANJI0x19IME Kanji 模式
VK_IME_OFF0x1AIME 关闭
VK_ESCAPE0x1BESC 键
VK_CONVERT0x1CIME 转换
VK_NONCONVERT0x1DIME 不转换
VK_ACCEPT0x1EIME 接受
VK_MODECHANGE0x1FIME 模式更改请求
VK_SPACE0x20空格键
VK_PRIOR0x21PAGE UP 键
VK_NEXT0x22PAGE DOWN 键
VK_END0x23END 键
VK_HOME0x24HOME 键
VK_LEFT0x25向左键
VK_UP0x26向上键
VK_RIGHT0x27向右键
VK_DOWN0x28向下键
VK_SELECT0x29SELECT 键
VK_PRINT0x2APRINT 键
VK_EXECUTE0x2BEXECUTE 键
VK_SNAPSHOT0x2C打印屏幕键
VK_INSERT0x2DINS 密钥
VK_DELETE0x2EDEL 键
VK_HELP0x2F帮助密钥
0x300 键
0x311 个键
0x322 键
0x333 键
0x344 键
0x355 键
0x366 个键
0x377 键
0x388 键
0x399 键
-0x3A-40Undefined
0x41密钥
0x42B 键
0x43C 键
0x44D 键
0x45E 键
0x46F 键
0x47G 键
0x48H 键
0x49I 键
0x4AJ 键
0x4BK 键
0x4CL 键
0x4DM 键
0x4EN 键
0x4FO 键
0x50P 键
0x51Q 键
0x52R 键
0x53S 键
0x54T 键
0x55U 键
0x56V 键
0x57W 键
0x58X 键
0x59Y 键
0x5AZ 键
VK_LWIN0x5B左Windows键 (自然键盘)
VK_RWIN0x5C右Windows键 (自然键盘)
VK_APPS0x5D应用程序键 (自然键盘)
-0x5E保留
VK_SLEEP0x5F计算机休眠键
VK_NUMPAD00x60数字键盘 0 键
VK_NUMPAD10x61数字键盘 1 键
VK_NUMPAD20x62数字键盘 2 键
VK_NUMPAD30x63数字键盘 3 键
VK_NUMPAD40x64数字键盘 4 键
VK_NUMPAD50x65数字键盘 5 键
VK_NUMPAD60x66数字键盘 6 键
VK_NUMPAD70x67数字键盘 7 键
VK_NUMPAD80x68数字键盘 8 键
VK_NUMPAD90x69数字键盘 9 键
VK_MULTIPLY0x6A乘键
VK_ADD0x6B添加密钥
VK_SEPARATOR0x6C分隔符键
VK_SUBTRACT0x6D减去键
VK_DECIMAL0x6E十进制键
VK_DIVIDE0x6F除键
VK_F10x70F1 键
VK_F20x71F2 键
VK_F30x72F3 键
VK_F40x73F4 键
VK_F50x74F5 键
VK_F60x75F6 键
VK_F70x76F7 键
VK_F80x77F8 键
VK_F90x78F9 键
VK_F100x79F10 键
VK_F110x7AF11 键
VK_F120x7BF12 键
VK_F130x7CF13 键
VK_F140x7DF14 键
VK_F150x7EF15 键
VK_F160x7FF16 键
VK_F170x80F17 键
VK_F180x81F18 键
VK_F190x82F19 键
VK_F200x83F20 键
VK_F210x84F21 键
VK_F220x85F22 键
VK_F230x86F23 键
VK_F240x87F24 键
-0x88-8F未分配
VK_NUMLOCK0x90NUM LOCK 密钥
VK_SCROLL0x91SCROLL LOCK 键
0x92-96OEM 特定
-0x97-9F未分配
VK_LSHIFT0xA0左 SHIFT 键
VK_RSHIFT0xA1右 SHIFT 键
VK_LCONTROL0xA2左 Ctrl 键
VK_RCONTROL0xA3右 Ctrl 键
VK_LMENU0xA4左 Alt 键
VK_RMENU0xA5右 ALT 键
VK_BROWSER_BACK0xA6浏览器后退键
VK_BROWSER_FORWARD0xA7浏览器前进键
VK_BROWSER_REFRESH0xA8浏览器刷新键
VK_BROWSER_STOP0xA9浏览器停止键
VK_BROWSER_SEARCH0xAA浏览器搜索键
VK_BROWSER_FAVORITES0xAB浏览器收藏键
VK_BROWSER_HOME0xAC浏览器“开始”和“主页”键
VK_VOLUME_MUTE0xAD静音键
VK_VOLUME_DOWN0xAE音量减小键
VK_VOLUME_UP0xAF音量增加键
VK_MEDIA_NEXT_TRACK0xB0下一曲目键
VK_MEDIA_PREV_TRACK0xB1上一曲目键
VK_MEDIA_STOP0xB2停止媒体键
VK_MEDIA_PLAY_PAUSE0xB3播放/暂停媒体键
VK_LAUNCH_MAIL0xB4启动邮件键
VK_LAUNCH_MEDIA_SELECT0xB5选择媒体键
VK_LAUNCH_APP10xB6启动应用程序 1 键
VK_LAUNCH_APP20xB7启动应用程序 2 键
-0xB8-B9预留
VK_OEM_10xBA用于其他字符;它可能因键盘而异。 对于美国标准键盘,“;:”键
VK_OEM_PLUS0xBB对于任何国家/地区,“+”键
VK_OEM_COMMA0xBC对于任何国家/地区,“,键
VK_OEM_MINUS0xBD对于任何国家/地区,“-”键
VK_OEM_PERIOD0xBE对于任何国家/地区,“.”键
VK_OEM_20xBF用于其他字符;它可能因键盘而异。 对于美国标准键盘,“/?” key
VK_OEM_30xC0用于其他字符;它可能因键盘而异。 对于美国标准键盘,“~”键
-0xC1-D7预留
-0xD8-DA未分配
VK_OEM_40xDB用于其他字符;它可能因键盘而异。 对于美国标准键盘,“[{”键
VK_OEM_50xDC用于其他字符;它可能因键盘而异。 对于美国标准键盘,“|”键
VK_OEM_60xDD用于其他字符;它可能因键盘而异。 对于美国标准键盘,“]}”键
VK_OEM_70xDE用于其他字符;它可能因键盘而异。 对于美国标准键盘,“单引号/双引号”键
VK_OEM_80xDF用于其他字符;它可能因键盘而异。
-0xE0保留
0xE1OEM 特定
VK_OEM_1020xE2<>美国标准键盘上的键,或\|非美国 102 键键盘上的键
0xE3-E4OEM 特定
VK_PROCESSKEY0xE5IME PROCESS 密钥
0xE6OEM 特定
VK_PACKET0xE7用于将 Unicode 字符当作键击传递。 该 VK_PACKET 键是用于非键盘输入方法的 32 位虚拟键值的低字。 有关详细信息,请参阅“备注”,以及KEYBDINPUTSendInputWM_KEYDOWNWM_KEYUP
-0xE8未分配
0xE9-F5OEM 特定
VK_ATTN0xF6Attn 键
VK_CRSEL0xF7CrSel 键
VK_EXSEL0xF8ExSel 密钥
VK_EREOF0xF9擦除 EOF 密钥
VK_PLAY0xFA播放键
VK_ZOOM0xFB缩放键
VK_NONAME0xFC预留
VK_PA10xFDPA1 键
VK_OEM_CLEAR0xFE清除键
  • scancode:按键的扫描码(依赖于 OEM)。仅当消息所属类别为 EX_KEY 时有效。
  • extended:按键是否为扩展按键,例如功能键和数字键盘。仅当消息所属类别为 EX_KEY 时有效。
  • prevdown:按键的前一个状态是否为按下。仅当消息所属类别为 EX_KEY 时有效。
  • ch:收到的字符。仅当消息所属类别为 EX_CHAR 时有效。
  • wParam:消息对应的 wParam 参数。仅当消息所属类别为 EX_WINDOW 时有效。
  • lParam:消息对应的 lParam 参数。仅当消息所属类别为 EX_WINDOW 时有效。

2. 键盘&鼠标消息处理

1. 流程

  1. 获取消息(getmessage)
  2. 对消息类型进行判断
  3. 处理对应的消息

2. 实例

#include <easyx.h>
#include <conio.h>

int main(void) {
	// 1. 初始化图形设备
	initgraph(400, 400);
	ExMessage msg;	// 存储消息
	while (true) {
		getmessage(&msg);	// 从消息队列中获取一条消息
		if (msg.message == WM_KEYDOWN || msg.message == WM_KEYUP) {
			// 如果为按键按下或弹起消息
			TCHAR m[120] = { 0 };
			RECT r = { 0, 0, 400, 400 };
			_tcscpy_s(m, _T("按键消息"));
			drawtext(m, &r, DT_CENTER | DT_VCENTER);
		}
		else if (msg.message == WM_MOUSEMOVE) {
			TCHAR m[120] = { 0 };
			RECT r = { 0, 0, 400, 400 };
			_tcscpy_s(m, _T("鼠标移动"));
			drawtext(m, &r, DT_CENTER | DT_VCENTER);
		}
	}
	// 3. 关闭图形化设备,并释放资源
	closegraph();
	return 0;
}

在这里插入图片描述
在这里插入图片描述

3. 详细函数介绍

传送门

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值