mousemsg 并不是C语言标准库的一部分,而是 EasyX图形库 中用于表示鼠标事件消息的一个结构体,如果你正在使用EasyX进行图形界面编程,mousemsg 就是你处理鼠标交互的核心。

(图片来源网络,侵删)
mousemsg 是什么?
mousemsg 是一个结构体,它封装了鼠标的一次事件信息,当用户在窗口中进行鼠标操作(如移动、点击、滚轮滚动)时,EasyX会生成一个 mousemsg 结构体,告诉你这次操作的具体细节。
它的定义通常如下:
struct mousemsg
{
UINT uMsg; // 消息类型,表示鼠标发生了什么
bool mkCtrl; // Ctrl键是否被按下
bool mkShift; // Shift键是否被按下
bool mkLButton; // 左键是否被按下
bool mkRButton; // 右键是否被按下
bool mkMButton; // 中键(滚轮)是否被按下
int x; // 鼠标事件的X坐标
int y; // 鼠标事件的Y坐标
int wheel; // 鼠标滚轮的滚动值
};
mousemsg 结构体成员详解
| 成员 | 类型 | 描述 |
|---|---|---|
uMsg |
UINT |
消息类型,这是一个最重要的成员,它告诉你鼠标事件的性质,常用值有: - WM_MOUSEMOVE (0x0200): 鼠标移动。- WM_LBUTTONDOWN (0x0201): 左键按下。- WM_LBUTTONUP (0x0202): 左键弹起。- WM_RBUTTONDOWN (0x0204): 右键按下。- WM_RBUTTONUP (0x0205): 右键弹起。- WM_MBUTTONDOWN (0x0207): 中键按下。- WM_MBUTTONUP (0x0208): 中键弹起。- WM_MOUSEWHEEL (0x020A): 鼠标滚轮滚动。 |
mkCtrl |
bool |
事件发生时,Ctrl 键是否被按下。true 表示按下,false 表示未按下。 |
mkShift |
bool |
事件发生时,Shift 键是否被按下。true 表示按下,false 表示未按下。 |
mkLButton |
bool |
事件发生时,鼠标左键是否被按下。 |
mkRButton |
bool |
事件发生时,鼠标右键是否被按下。 |
mkMButton |
bool |
事件发生时,鼠标中键(滚轮)是否被按下。 |
x |
int |
鼠标事件的窗口坐标,相对于窗口左上角 (0, 0) 的位置。 |
y |
int |
鼠标事件的窗口坐标。 |
wheel |
int |
鼠标滚轮的滚动值。 - 向前滚动(远离用户)时,值为 120。- 向后滚动(朝向用户)时,值为 -120。 |
如何获取 mousemsg?
EasyX 提供了一个核心函数 GetMouseMsg(),它会从消息队列中获取一个鼠标事件,并将其封装在 mousemsg 结构体中返回。
函数原型:

(图片来源网络,侵删)
mousemsg GetMouseMsg();
工作方式:
- 当窗口中有鼠标事件发生时,
GetMouseMsg()会返回一个包含该事件信息的mousemsg结构体。 - 如果当前没有鼠标事件,
GetMouseMsg()会阻塞(程序暂停执行),直到有鼠标事件发生。 - 在一个循环中持续调用
GetMouseMsg(),是处理鼠标事件的标准模式。
完整代码示例
下面是一个完整的示例,它创建一个窗口,并实时显示鼠标的位置和按键状态。
#include <graphics.h> // EasyX 图形库头文件
#include <stdio.h> // 标准输入输出
int main()
{
// 1. 创建一个 800x600 的绘图窗口
initgraph(800, 600);
// 设置文字输出样式
setbkmode(TRANSPARENT); // 透明文字背景
settextstyle(20, 0, _T("微软雅黑"));
// 2. 主循环
mousemsg msg; // 定义一个 mousemsg 结构体变量
while (true)
{
// 获取一个鼠标消息
msg = GetMouseMsg();
// 根据不同的消息类型进行处理
switch (msg.uMsg)
{
case WM_MOUSEMOVE:
// 鼠标移动事件
// 在窗口左上角显示坐标
outtextxy(10, 10, _T("鼠标移动:"));
TCHAR szPos[100];
_stprintf(szPos, _T("X: %d, Y: %d"), msg.x, msg.y);
outtextxy(10, 40, szPos);
break;
case WM_LBUTTONDOWN:
// 左键按下事件
outtextxy(10, 10, _T("左键按下!"));
// 在点击位置画一个红色小圆点
putpixel(msg.x, msg.y, RED);
break;
case WM_RBUTTONDOWN:
// 右键按下事件
outtextxy(10, 10, _T("右键按下!"));
// 在点击位置画一个绿色小圆点
putpixel(msg.x, msg.y, GREEN);
break;
case WM_MOUSEWHEEL:
// 滚轮滚动事件
if (msg.wheel > 0) {
outtextxy(10, 10, _T("滚轮向前滚动!"));
} else {
outtextxy(10, 10, _T("滚轮向后滚动!"));
}
break;
// 添加其他消息类型的处理...
case WM_LBUTTONUP:
// 左键弹起事件
// 可以在这里做一些弹起后的逻辑
break;
}
// 检查辅助键状态
outtextxy(10, 70, _T("按键状态:"));
if (msg.mkCtrl) outtextxy(10, 100, _T("Ctrl "));
if (msg.mkShift) outtextxy(70, 100, _T("Shift "));
// 按 ESC 键退出程序
if (GetAsyncKeyState(VK_ESCAPE)) {
break;
}
}
// 3. 关闭图形窗口
closegraph();
return 0;
}
代码解释:
initgraph(800, 600): 创建一个 800x600 像素的窗口。while (true): 创建一个无限循环,持续监听鼠标事件。msg = GetMouseMsg(): 在循环中调用此函数,等待并获取鼠标事件。switch (msg.uMsg): 根据uMsg的值,判断鼠标执行了什么操作。- 当鼠标移动时,在 (10, 40) 位置打印出当前坐标。
- 当左键按下时,在鼠标点击位置画一个红点。
- 当右键按下时,在鼠标点击位置画一个绿点。
- 当滚轮滚动时,判断滚动方向并打印提示。
- 辅助键检测: 通过
msg.mkCtrl和msg.mkShift判断Ctrl和Shift键的状态。 - 退出条件: 按下
ESC键,break跳出循环,程序结束。
mousemsg 与 Windows API 的关系
如果你了解 Windows 原生编程,会发现 mousemsg 的 uMsg 成员值(如 WM_MOUSEMOVE)和 Windows 消息机制中的消息码是完全一致的,EasyX 实际上是对复杂的 Windows 消息机制进行了封装和简化。

(图片来源网络,侵删)
- Windows 原生: 程序有一个消息循环,通过
GetMessage/PeekMessage获取MSG结构体,然后在窗口过程(WndProc)中用switch-case处理各种消息。 - EasyX 封装: 你只需要在一个简单的
while循环里调用GetMouseMsg(),它已经帮你完成了底层消息的获取和筛选,直接返回给你一个干净的、只包含鼠标信息的mousemsg结构体,这使得图形编程变得非常简单直观。
mousemsg是 EasyX 库中的鼠标事件结构体。- 它包含了鼠标事件的类型、位置、按键状态和滚轮信息。
- 通过
GetMouseMsg()函数在循环中获取鼠标事件,是实现交互式图形程序的基础。 - 它是 Windows 原生鼠标消息的简化封装,让C语言图形编程更简单。
