离开ListView后触发MouseMove / MouseUp

时间:2016-02-29 17:11:40

标签: c# listview events mousemove

我有一个带ListView控件的应用程序,其中包含许多用户可以在Panel内“拖放”的对象。最初,我使用DoDragDrop但决定不这样做,以便我可以实现一个半透明的自定义控件,我称之为ShadowBoxShadowBox继承自Form,并在放置项目时以鼠标光标为中心。该项目放在Panel作为自定义控件,该控件继承自Label我们可以调用Item

MouseMove上使用Item事件时,我可以在屏幕上的任意位置自由拖动ShadowBox,一旦我放开鼠标,它就会消失,无论在哪里屏幕我。这意味着即使光标在技术上离开MouseMove的边界,Item仍在继续激活。

我的问题有两个要素:

1)当我在ListView上执行相同的操作时,除非鼠标直接位于MouseMove上,否则ListView不会被触发。这意味着ShadowBox会阻止MouseMove触发,我无法在进入面板时继续MouseMove。有没有办法解决这个问题(见下面的代码)。我想这就是:

How do I capture the mouse move event

可能是我的答案,但我无法让它发挥作用。

2)仅仅为了我的理解,假设我不仅仅在我的MouseDownMouseMove事件中做错了什么,为什么MouseMove行为与Item行为不同{ {1}}而不是ListView? (即,即使鼠标不在MouseMove之上,Item为什么似乎仍继续发射,但ListView的情况却不一样?)

ShadowBox sb;   
Point startMousePosition;

private void Toolbox_MouseDown(object sender, MouseEventArgs e)
{
    ListViewItem lvi;
    Point p;

    lvi = lvToolbox.GetItemAt(e.X, e.Y);
    if (lvi != null)
    {
        if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
        {
            sb = new ShadowBox();

            p = lvToolbox.PointToScreen(e.Location);
            sb.Show();
            sb.Size = new Size(144, 108); //Note: I simplified this code, the size will depend on the ListViewItem selected.
            sb.Opacity = 0.8;
            sb.Location = new Point(p.X - sb.Width / 2, p.Y - sb.Height / 2);
            sb.Show();
            startMouseDown = new Point(sb.Width / 2, sb.Height / 2); //e.Location;

            lvToolbox.MouseMove += new MouseEventHandler(Toolbox_MouseMove);
        }
    }
}

private void Toolbox_MouseMove(object sender, MouseEventArgs e)
{
   if ((e.Button & MouseButtons.Left) == MouseButtons.Left)
   {
       sb.Location = PointToScreen(new Point(e.X - startMouseDown.X, e.Y - startMouseDown.Y));
   }
}

private void Toolbox_MouseUp(object sender, MouseEventArgs e)
{
    if (sb != null)
    {
        sb.Dispose();
    }

    lvToolbox.MouseMove -= new MouseEventHandler(Toolbox_MouseMove);
}

0 个答案:

没有答案