24.消息处理

  • 学习人数 15K+
  • 适合有C语言基础人群学习
avatar
林耿亮

你好编程主讲老师

这一节中我们讨论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 右键双击消息