我有一个带ListView
控件的应用程序,其中包含许多用户可以在Panel
内“拖放”的对象。最初,我使用DoDragDrop
但决定不这样做,以便我可以实现一个半透明的自定义控件,我称之为ShadowBox
。 ShadowBox
继承自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)仅仅为了我的理解,假设我不仅仅在我的MouseDown
或MouseMove
事件中做错了什么,为什么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);
}