easyX库消息处理相关函数(注释版)

这里是limou3434的一篇个人博文,感兴趣可以看看我的其他内容。本次我给您带来的是easyX有关消息的函数与结构体解读。

0.消息处理相关函数和结构体概览

函数或数据类型描述
ExMessage消息结构体。
getmessage获取一个消息。如果当前消息缓冲区中没有,就一直等待。
peekmessage获取一个消息,并立即返回。
flushmessage清空消息缓冲区。

这里先提前说明一下消息的作用,平日我们使用电脑的时候,经常会使用鼠标,键盘等向电脑输入信息,而本节处理的消息就包含这些鼠标消息和键盘消息,通过消息,我们可以更好做出能与用户交互的程序。

1.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
//message:消息标识,后面有专门的表格解读
//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时有效。

//参数解读2
//vkcode:按键的虚拟键码。仅当消息所属类别为EX_KEY时有效。
//在微软网站上列出有所有的虚拟键码:https://docs.microsoft.com/windows/win32/inputdev/virtual-key-codes
//scancode:按键的扫描码(依赖于OEM)。仅当消息所属类别为EX_KEY时有效。
//extended:按键是否为扩展按键,例如功能键和数字键盘。仅当消息所属类别为 EX_KEY 时有效。
//prevdown:按键的前一个状态是否为按下。仅当消息所属类别为EX_KEY时有效。

//参数解读3
//ch:收到的字符。仅当消息所属类别为EX_CHAR时有效。

//参数解读4
//wParam:消息对应的wParam参数。仅当消息所属类别为EX_WINDOW时有效。
//lParam:消息对应的lParam参数。仅当消息所属类别为EX_WINDOW时有效。

对于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窗口大小改变消息。

2.getmessage:一直等到获取消息

如果当前消息缓冲区中没有,就一直等待。

ExMessage getmessage(BYTE filter = -1);
void getmessage(ExMessage *msg, BYTE filter = -1);
//参数
//msg:指向消息结构体 ExMessage 的指针,用来保存获取到的消息。
//filter:指定要获取的消息范围,默认 -1 获取所有类别的消息。可以用以下值或值的组合获取指定类别的消息:
//标志    	  描述
//EX_MOUSE     鼠标消息。
//EX_KEY	   按键消息。
//EX_CHAR	   字符消息。
//EX_WINDOW	   窗口消息。

//返回值
//重载1返回保存有消息ExMessage的结构体。
//重载2没有返回值。

下面是easyX库文档里留有的演示例子,主要演示了getmessage()以及结构体ExMessage的使用:

#include <graphics.h>

int main()
{
	//1.初始化图形窗口
	initgraph(640, 480, EX_SHOWCONSOLE);

	//2.定义消息变量
	ExMessage m;		

	while (true)
	{
		//3.获取一条鼠标或按键消息
		m = getmessage(EX_MOUSE | EX_KEY);

		switch (m.message)
		{
		case WM_MOUSEMOVE:
			//3.1.鼠标移动的时候画红色的小点
			putpixel(m.x, m.y, WHITE);
			break;

		case WM_LBUTTONDOWN:
			//3.2.如果点左键的同时按下了Ctrl键
			if (m.ctrl)
				//3.2.1画一个大方块
				rectangle(m.x - 10, m.y - 10, m.x + 10, m.y + 10);
			else
				//3.2.2.画一个小方块
				rectangle(m.x - 5, m.y - 5, m.x + 5, m.y + 5);
			break;

		case WM_KEYDOWN:
			//4.按下ESC键退出程序
			if (m.vkcode == VK_ESCAPE)
				return 0;	
		}
	}

	//5.关闭图形窗口
	closegraph();
	return 0;
}

3.peekmessage:立刻返回获取的消息

这个函数用于获取一个消息,并立即返回(没有获取到消息也会立刻返回,只不过返回false罢了)。

bool peekmessage(ExMessage *msg, BYTE filter = -1, bool removemsg = true);
//参数
//msg:指向消息结构体ExMessage的指针,用来保存获取到的消息。
//filter:指定要获取的消息范围,默认-1获取所有类别的消息。其他取值见上方表格。
//removemsg:在 peekmessage 处理完消息后,是否将其从消息队列中移除

//返回值
//如果获取到了消息,返回true。
//如果当前没有消息,返回false。

peekmessage()和getmessage()最大的差别就在于:有些场景下,如果使用getmessage()会使得程序处于“停滞状态”,例如:在某些游戏里,我们可能需要释放技能,但是程序不可能使用getmessage()后一直等着用户选择技能(这个时候游戏的逻辑被终止了),而应该是在用户思考选择某些技能的同时,游戏依旧在运。因此使用peekmessage()要更为合理一些。

4.flushmessage:清空消息缓冲区

这个函数可以清空目前的消息缓冲区。

void flushmessage(BYTE filter = -1);
//参数
//filter:指定要清空的消息范围,默认-1清空所有类别的消息,其他取值见上方表格。

//返回值
//无
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
以下是基于EasyX实现冒泡排序可视化的C++程序,注释在代码中: ```c++ #include <graphics.h> #include <conio.h> #include <iostream> #include <cstdlib> #include <ctime> using namespace std; const int NUM = 50; // 数组元素个数 const int INTERVAL = 20; // 每个矩形之间的间距 const int WIDTH = 10; // 矩形宽度 const int HEIGHT = 500; // 矩形高度 int nums[NUM]; // 存储随机数的数组 void initNums() { srand((unsigned)time(NULL)); // 设置随机数种子 for (int i = 0; i < NUM; i++) { nums[i] = rand() % (HEIGHT / 10) + 1; // 随机生成一个 1~50 的整数 } } void drawNums() { cleardevice(); // 清空画布 for (int i = 0; i < NUM; i++) { int x = i * (WIDTH + INTERVAL) + INTERVAL; // 计算矩形的左上角横坐标 int y = HEIGHT - nums[i] * 10 + INTERVAL; // 计算矩形的左上角纵坐标 setfillcolor(BLUE); // 设置填充颜色 solidrectangle(x, y, x + WIDTH, HEIGHT + INTERVAL); // 绘制矩形 } } void bubbleSort() { for (int i = 0; i < NUM - 1; i++) { for (int j = 0; j < NUM - 1 - i; j++) { if (nums[j] > nums[j + 1]) { swap(nums[j], nums[j + 1]); // 交换相邻两个数 drawNums(); // 重新绘制矩形 delay_ms(50); // 延时 50ms } } } } int main() { initgraph(900, 600); // 创建绘图窗口 initNums(); // 初始化随机数数组 drawNums(); // 绘制矩形 bubbleSort(); // 执行冒泡排序 getch(); // 等待用户按下任意键 closegraph(); // 关闭绘图窗口 return 0; } ``` 在代码中,我们使用了EasyX提供的`initgraph`函数创建了一个900x600的绘图窗口,并定义了一些常量,如矩形宽度、高度、间距等。我们通过`initNums`函数生成了50个随机数,并使用`drawNums`函数将这些随机数绘制成蓝色的矩形。 在`bubbleSort`函数中,我们使用了两层for循环来实现冒泡排序。每次比较相邻的两个数,如果前一个数大于后一个数,则交换它们。在交换两个数后,我们调用`drawNums`函数重新绘制矩形,然后使用`delay_ms`函数延迟50ms,以便让用户看清楚这个过程。 最后,我们在`main`函数中按照如下顺序执行了几个函数:创建绘图窗口、初始化随机数、绘制矩形、执行冒泡排序、等待用户按下任意键、关闭绘图窗口。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

limou3434

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值