mousemsg在C语言中如何使用?

99ANYc3cd6
预计阅读时长 17 分钟
位置: 首页 C语言 正文

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

C语言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 结构体中返回。

函数原型:

C语言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;
}

代码解释:

  1. initgraph(800, 600): 创建一个 800x600 像素的窗口。
  2. while (true): 创建一个无限循环,持续监听鼠标事件。
  3. msg = GetMouseMsg(): 在循环中调用此函数,等待并获取鼠标事件。
  4. switch (msg.uMsg): 根据 uMsg 的值,判断鼠标执行了什么操作。
    • 当鼠标移动时,在 (10, 40) 位置打印出当前坐标。
    • 当左键按下时,在鼠标点击位置画一个红点。
    • 当右键按下时,在鼠标点击位置画一个绿点。
    • 当滚轮滚动时,判断滚动方向并打印提示。
  5. 辅助键检测: 通过 msg.mkCtrlmsg.mkShift 判断 CtrlShift 键的状态。
  6. 退出条件: 按下 ESC 键,break 跳出循环,程序结束。

mousemsg 与 Windows API 的关系

如果你了解 Windows 原生编程,会发现 mousemsguMsg 成员值(如 WM_MOUSEMOVE)和 Windows 消息机制中的消息码是完全一致的,EasyX 实际上是对复杂的 Windows 消息机制进行了封装和简化

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

相关文章

取消
微信二维码
支付宝二维码

目录[+]