【问题标题】:Mouse Capture and Selection鼠标捕捉和选择
【发布时间】:2010-04-09 23:57:46
【问题描述】:

我有一个控件,它以网格的形式在其中移动许多不同的控件。所以基本上,任何时候都没有显示任何容器控件。但我确实捕获了内部控件的所有 mousedown 和 mousemove 事件。 id 喜欢做的是创建一个类似于 windows 计算机桌面的效果,您可以在其中拖动,鼠标拖动中的每个控件都将被扔到一个列表中,当鼠标松开时,我可以执行对所有选定项目的操作。这可能吗?

【问题讨论】:

  • 您在“我有一个可以移动控件的控件”中迷失了我。链接:social.msdn.microsoft.com/Forums/en-US/winforms/thread/…
  • 抱歉,@nobugz:我有一个继承自 Winforms 类 UserControl 的类,它内部有控件,可以重新排列和移动
  • 你能展示一些你已经尝试过的代码吗?

标签: c# winforms mouse


【解决方案1】:

注册 OnMouseDown、OnMouseMove、OnMouseUp 事件。

  1. OnMouseDown 获取鼠标下方控件的位置和焦点。
  2. OnMouseMove,用鼠标位置设置控件的位置。
  3. OnMouseUp释放控制焦点。

查看example

【讨论】:

  • @Tommy:对不起,如果它没有帮助。我的问题是`这可能吗?`,只是为了帮助您入门。
【解决方案2】:

经过反复试验,我解决了自己的问题。 在我孩子的每个控件中,我都这样做了:

    protected override void OnMouseDown(MouseEventArgs e)
    {
        Point pnt = this.PointToScreen(e.Location);
        base.OnMouseDown(new MouseEventArgs(e.Button, e.Clicks, pnt.X, pnt.Y, e.Delta));
    }
    protected override void OnMouseMove(MouseEventArgs e)
    {
        Point pnt = this.PointToScreen(e.Location);
        base.OnMouseMove(new MouseEventArgs(e.Button, e.Clicks, pnt.X, pnt.Y, e.Delta));
    }

为了使光标位置可以从容器控件中使用,并且在容器中我这样做了:

        #region Lambda
        item.MouseDown += new MouseEventHandler((a, b) =>
        {
            MessageBase hovering = this.GetChildAtPoint(tr_MouseCurrentPoint) as MessageBase;
            if (b.Button == MouseButtons.Left)
            {
                tr_MouseDown = true;
                tr_MouseDownPoint = this.PointToClient(b.Location);
                mouseupdate();
                foreach (var t in tr_CurrentlySelected)
                {
                    t.Key.Selected = false;
                }
                tr_CurrentlySelected.Clear();
                if (hovering != null && tr_CurrentlySelected.ContainsKey(hovering) == false)
                {
                    tr_CurrentlySelected.Add(hovering, new MouseCoordinateStore(tr_MouseDown, tr_MouseDownPoint, tr_MouseCurrentPoint, tr_MouseDifference));
                    hovering.Selected = true;
                    tr_LastHoveredOver = hovering;
                }
            }
            else if (b.Button == MouseButtons.Right)
            {
                if (hovering.Selected == true)
                {
                    MessageBox.Show("Show Right Click Logic Here");
                }
                else
                {
                    foreach (var t in tr_CurrentlySelected)
                    {
                        t.Key.Selected = false;
                    }
                    tr_CurrentlySelected.Clear();
                    if (hovering != null && tr_CurrentlySelected.ContainsKey(hovering) == false)
                    {
                        tr_CurrentlySelected.Add(hovering, new MouseCoordinateStore(tr_MouseDown, tr_MouseDownPoint, tr_MouseCurrentPoint, tr_MouseDifference));
                        hovering.Selected = true;
                        tr_LastHoveredOver = hovering;
                    }
                    MessageBox.Show("Show Right Click Logic Here");
                }
            }
        });
        item.MouseUp += new MouseEventHandler((a, b) => { tr_MouseDown = false; mouseupdate(); });
        item.MouseMove += new MouseEventHandler((a, b) => { 
            tr_MouseCurrentPoint = this.PointToClient(b.Location); 
            mouseupdate();
            if (tr_MouseDown)
            {
                MessageBase hovering = this.GetChildAtPoint(tr_MouseCurrentPoint) as MessageBase;
                if (hovering != null)
                {
                    if (tr_CurrentlySelected.ContainsKey(hovering) == false)
                    {
                        tr_CurrentlySelected.Add(hovering, new MouseCoordinateStore(tr_MouseDown, tr_MouseDownPoint, tr_MouseCurrentPoint, tr_MouseDifference));
                        tr_LastHoveredOver = hovering;
                        hovering.Selected = true;
                    }
                    else
                    {
                        int ind = hovering.Index;
                        List<MessageBase> ItemsToRemove = new List<MessageBase>();
                        if (tr_MouseDifference.Y < 0) // Y is negative
                        {
                            foreach (var dic in tr_CurrentlySelected)
                            {
                                if (dic.Key.Index < ind)
                                {
                                    ItemsToRemove.Add(dic.Key);
                                }
                            }
                        }
                        else //Y is positive
                        {
                            foreach (var dic in tr_CurrentlySelected)
                            {
                                if (dic.Key.Index > ind)
                                {
                                    ItemsToRemove.Add(dic.Key);
                                }
                            }
                        }
                        foreach (var dic in ItemsToRemove)
                        {
                            tr_CurrentlySelected.Remove(dic);
                            dic.Selected = false;
                        }
                    }
                }
            }
        });
        item.KeyDown += new KeyEventHandler((a, b) =>
        {
            try
            {
                if (b.KeyData == Keys.Down)
                {
                    MessageBase hovering = ControlCollection[tr_LastHoveredOver.Index + 1];
                    foreach (var t in tr_CurrentlySelected)
                    {
                        t.Key.Selected = false;
                    }
                    tr_CurrentlySelected.Clear();
                    if (hovering != null && tr_CurrentlySelected.ContainsKey(hovering) == false)
                    {
                        tr_CurrentlySelected.Add(hovering, null);
                        hovering.Selected = true;
                        tr_LastHoveredOver = hovering;
                    }
                }
                else if (b.KeyData == Keys.Up)
                {
                    MessageBase hovering = ControlCollection[tr_LastHoveredOver.Index - 1];
                    foreach (var t in tr_CurrentlySelected)
                    {
                        t.Key.Selected = false;
                    }
                    tr_CurrentlySelected.Clear();
                    if (hovering != null && tr_CurrentlySelected.ContainsKey(hovering) == false)
                    {
                        tr_CurrentlySelected.Add(hovering, null);
                        hovering.Selected = true;
                        tr_LastHoveredOver = hovering;
                    }
                }
            }
            catch { }
        });
        #endregion

很明显,其他地方还发生了一些其他事情,但这就是它的基本原理。感谢我得到的一个答案,尽管我已经知道我得到了所有答案:) 谢谢大家!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多