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;
}