匯東網


MouseDrag 类,快速处理拖动消息

[編輯] [转简体]
|
作者:huidong | 分類:【編程】EasyX
[ 23 瀏覽 0 評論 4 贊 6 踩 ]

概要

正文

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

[ 4] [ 6]


 評論區  0 條評論

+ 添加評論