簡體   English   中英

c#使用MouseMove事件水平移動面板

[英]c# move panel horizontally with MouseMove event

我有一個winforms應用程序。 在里面,我有一個面板(panel1),在這個面板內,另一個面板(面板2)里面有按鈕。 當我在某個按鈕中mousedown時,我想在panel1中水平移動panel2。 我已經在panel2里面的每個按鈕中做了這個。

this.button4.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btMouseDown);
        this.button4.MouseMove += new System.Windows.Forms.MouseEventHandler(this.btMouseMove);
        this.button4.MouseUp += new System.Windows.Forms.MouseEventHandler(this.btMouseUp);

void btMouseMove(object sender, MouseEventArgs e)
    {
        if (_mouseDown)
            panel2.Location = PointToClient(this.panel2.PointToScreen(new Point(e.X - _mousePos.X, e.Y - _mousePos.Y)));            
    }
    void btMouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            _mouseDown = true;
            _mousePos = new Point(e.X, e.Y);
        }
    }
    void btMouseUp(object sender, MouseEventArgs e)
    {
        if (_mouseDown)
        {
            _mouseDown = false;
        }
    }

此代碼在panel1內正確移動panel2,但我只想水平移動面板,此代碼移動到鼠標位置。 我試着把

Point(e.X - _mousePos.X, 3)

代替

Point(e.X - _mousePos.X, e.Y - _mousePos.Y)

但是panel2消失了。 我想知道如何僅在水平方向上移動panel1內的panel2。

非常感謝。

    void btMouseMove(object sender, MouseEventArgs e) {
        if (_mouseDown) {
            int deltaX = e.X - _mousePos.X;
            int deltaY = e.Y - _mousePos.Y;
            panel2.Location = new Point(panel2.Left + deltaX, panel2.Top /* + deltaY */);
        }
    }

這不是最干凈的實現,但如果我理解你正在嘗試做什么,它的工作原理:

        int _x = 0;

    private void button1_MouseMove(object sender, MouseEventArgs e)
    {
        if(_x == 0)
        {
            _x = e.X;
        }

        int move = 0;
        Point p;

        if (e.X <= _x)
        {
            move = _x - e.X;
            p = new Point(panel2.Location.X - move, panel2.Location.Y);
        }
        else
        {
            move = e.X - _x;
            p = new Point(panel2.Location.X + move, panel2.Location.Y);
        }

        panel2.Location = p;
    }

您需要在移動時考慮panel2的當前位置。 而且您不需要在客戶端和屏幕協調之間轉換鼠標位置,因為您只需要增量。

此外,如果您讓用戶拖動東西,我強烈建議您不要移動面板,除非拖動超過一個小閾值。 單擊屏幕時,很容易意外地將鼠標移動幾個像素。

例如:

if (delta > 3)  { // only drag if the user moves the mouse over 3 pixels
    panel2.Location = ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM