这一节中我们讨论EasyX中的消息。
EasyX中的消息是用户对窗体进行操作而产生的事件的载体。简单地来说,用户在窗体上进行操作,将会产生消息。例如:用户在窗体上操作鼠标、按下键盘、调整窗体大小都将产生消息。
消息产生后,会按照消息产生的先后顺序,放置到窗体的消息队列当中。等待程序从消息队列中获取消息进行处理。
1. 获取消息
通过getmessage
函数可以从消息队列中获取到一个消息,并将这个消息从消息队列中移除。然后,程序可以对这个消息进行处理,并作出对应的响应。
让我们来看看getmessage
这个函数该如何使用吧。
ExMessage getmessage(BYTE filter = -1);
void getmessage(ExMessage *msg, BYTE filter = -1);
getmessage
函数有两个重载版本,除了参数类型不同,函数的作用是相同的。ExMessage
结构体表示一个消息,我们稍后将会详细讨论它。它可以由getmessage
函数的返回值返回,也可以将它的指针传入getmessage
函数,由getmessage
函数填充。
getmessage
函数的参数及意义如下:
参数 | 类型 | 意义 |
---|---|---|
msg | ExMessage * | 指向消息结构体 ExMessage 的指针,用来保存获取到的消息 |
filter | BYTE | 指定要获取的消息类别,默认-1获取所有类别的消息。 |
EasyX中的消息包括鼠标消息、按键消息、字符消息和窗口消息,四种类型。参数filter
可以筛选我们需要的消息类型,丢弃不需要的消息类型。参数filter
可以取下列值,也可以用位或运算符组合下列值。
标志 | 描述 |
---|---|
EX_MOUSE | 鼠标消息 |
EX_KEY | 按键消息 |
EX_CHAR | 字符消息 |
EX_WINDOW | 窗口消息 |
例如,只需要鼠标消息:
将实参EX_MOUSE
传入getmessage
函数。由于getmessage
函数有两个重载版本。获取ExMessage
消息结构,有两种方式。
可以让getmessage
函数返回ExMessage
消息结构。
ExMessage msg;
msg = getmessage(EX_MOUSE);
或者,可以将ExMessage
结构的指针传入getmessage
函数,让getmessage
函数来填充它。
ExMessage msg;
getmessage(&msg, EX_MOUSE);
若键盘和鼠标消息都要,可以有以下两种写法:
ExMessage msg;
msg = getmessage(EX_MOUSE | EX_KEY);
ExMessage msg;
getmessage(&msg, EX_MOUSE | EX_KEY);
2. 消息结构体
下面我们将详细讨论EasyX中的消息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
成员指示该消息是一个什么样的消息。
如果getmessage
时筛选了鼠标消息EX_MOUSE
,那么获得的ExMessage
结构体中,message
成员可能是以下取值。
鼠标消息 EX_MOUSE
消息标识 | 描述 |
---|---|
WM_MOUSEMOVE | 鼠标移动消息 |
WM_MOUSEWHEEL | 鼠标滚轮拨动消息 |
WM_LBUTTONDOWN | 左键按下消息 |
WM_LBUTTONUP | 左键弹起消息 |
WM_LBUTTONDBLCLK | 左键双击消息 |
WM_MBUTTONDOWN | 中键按下消息 |
WM_MBUTTONUP | 中键弹起消息 |
WM_MBUTTONDBLCLK | 中键双击消息 |
WM_RBUTTONDOWN | 右键按下消息 |
WM_RBUTTONUP | 右键弹起消息 |
WM_RBUTTONDBLCLK | 右键双击消息 |