MouseDrag 类,快速处理拖动消息
[編輯] [转简体] (简体译文)
|
作者:huidong
| 分類:【編程】EasyX
[
11 瀏覽
0 評論
0 贊
1 踩
]
概要
正文
2022.07.16 更新:
现在这个类改名为 MouseDrag,集成到 EasyWin32 里面了。
下面是类定义:
// 鼠标拖动消息 // 调用方法: // 需要在鼠标消息循环中每次都调用 UpdateMessage 更新鼠标消息 // 调用 isLeftDrag,isMiddleDrag,isRightDrag 函数判断正在拖动的鼠标按键 // 调用 GetDragX,GetDragY 获取鼠标拖动时鼠标坐标的变化量 class MouseDrag { private: ExMessage old, msg; int dx, dy; bool lbtn = false, mbtn = false, rbtn = false; bool newmsg = false; bool UpdateDragInfo(bool& btn, int msgid_down, int msgid_up) { if (newmsg) { if (btn) { dx = msg.x - old.x; dy = msg.y - old.y; old = msg; if (msg.message == msgid_up) btn = false; if (dx != 0 || dy != 0) return true; else return false; } else { if (msg.message == msgid_down) { btn = true; old = msg; } return false; } newmsg = false; } else { return false; } } public: void UpdateMessage(ExMessage m) { msg = m; newmsg = true; } bool isLeftDrag() { return UpdateDragInfo(lbtn, WM_LBUTTONDOWN, WM_LBUTTONUP); } bool isMiddleDrag() { return UpdateDragInfo(mbtn, WM_MBUTTONDOWN, WM_MBUTTONUP); } bool isRightDrag() { return UpdateDragInfo(rbtn, WM_RBUTTONDOWN, WM_RBUTTONUP); } int GetDragX() { return dx; } int GetDragY() { return dy; } };
新增内容结束
----
#include <graphics.h> class Drag { private: ExMessage old, msg; int dx, dy; bool lbtn = false, mbtn = false, rbtn = false; bool newmsg = false; bool UpdateDragInfo(bool& btn, int msgid_down, int msgid_up) { if (newmsg) { if (btn) { if (msg.message == msgid_up) { btn = false; } dx = msg.x - old.x; dy = msg.y - old.y; old = msg; return true; } else { if (msg.message == msgid_down) { btn = true; old = msg; } return false; } newmsg = false; } else { return false; } } public: void UpdateMessage(ExMessage m) { msg = m; newmsg = true; } bool isLeftDrag() { return UpdateDragInfo(lbtn, WM_LBUTTONDOWN, WM_LBUTTONUP); } bool isMiddleDrag() { return UpdateDragInfo(mbtn, WM_MBUTTONDOWN, WM_MBUTTONUP); } bool isRightDrag() { return UpdateDragInfo(rbtn, WM_RBUTTONDOWN, WM_RBUTTONUP); } int GetDragX() { return dx; }; int GetDragY() { return dy; }; }; int x = 0, y = 0; Drag drag; void process() { x += drag.GetDragX(); y += drag.GetDragY(); lineto(x, y); } int main() { initgraph(640, 480); setlinestyle(PS_SOLID, 3); outtext(L"请分别尝试按下鼠标左中右键绘图"); ExMessage msg; while (true) { if (peekmessage(&msg, EM_MOUSE)) { switch (msg.message) { case WM_LBUTTONDOWN: case WM_MBUTTONDOWN: case WM_RBUTTONDOWN: x = msg.x; y = msg.y; break; } drag.UpdateMessage(msg); if (drag.isLeftDrag()) { setlinecolor(LIGHTBLUE); process(); } if (drag.isMiddleDrag()) { setlinecolor(RED); process(); } if (drag.isRightDrag()) { setlinecolor(GREEN); process(); } } } closegraph(); return 0; }