• Easyx进阶(二)


    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;
    		};
    	};
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    成员

    • 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 
    #include 
    
    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;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

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

    3. 详细函数介绍

    传送门

  • 相关阅读:
    JVM的故事——虚拟机字节码执行引擎
    ​力扣解法汇总1624-两个相同字符之间的最长子字符串
    初阶数据结构 堆(二)
    openHarmony UI开发
    电脑硬盘分区该怎么进行?这几种方法简单有效!
    苹果 Vision Pro 头显新专利:增加重量减轻颈部压力
    3.2 AOP之代理模式
    基于Matlab求解2023华为杯研究生数学建模竞赛E题——出血性脑卒中临床智能诊疗建模实现步骤(附上源码+数据)
    【vscode 怎么实现ctrl+鼠标左键点击模组,能够进入PYTHONPATH(第三方)的模组里面】
    基于flask的网上商城
  • 原文地址:https://blog.csdn.net/my_20021004/article/details/127136831