我正在创建一个简单的应用程序,它在鼠标后面绘制水平线和垂直线。
使用TransparencyKey表单是透明的,并使用Paint事件绘制线条:
private void Form1_Paint(object sender, PaintEventArgs e)
{
Pen pen = new Pen(Color.Lime);
e.Graphics.DrawLine(pen, 0, py, this.Size.Width, py);
e.Graphics.DrawLine(pen, px, 0, px, this.Size.Height);
}
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
px = e.X; // get cursor X pos
py = e.Y; // get cursor Y pos
Invalidate(); // fire Paint event
}
但只有在鼠标悬停在绘制的线上时才会触发MouseMove事件。如何使表单在透明时捕获鼠标事件? (只有鼠标移动,我希望表单仍然点击)
答案 0 :(得分:0)
正如您可以在这里阅读的那样:http://msdn.microsoft.com/en-us/library/system.windows.forms.form.transparencykey%28v=vs.110%29.aspx - “在窗体的透明区域上执行的任何鼠标操作(例如鼠标点击)都将被传输到透明区域下方的窗口”。实现目标的一种方法是编写自己的方法,它将在循环中检查光标与表单的相对位置,这就是我的意思(它对TransparencyKey有用,调整大小并移动表单):
private void MouseMovedWithTransparency()
{
Point lastCursorPos = new Point(-1, -1); // Starting point.
while (this.Visible)
{
Point currentCursorPos = Cursor.Position;
if (this.ContainsFocus && currentCursorPos.X > this.Left && currentCursorPos.X < this.Left + this.Width &&
currentCursorPos.Y > this.Top && currentCursorPos.Y < this.Top + this.Height)
{
if ((currentCursorPos.X != lastCursorPos.X) || (currentCursorPos.Y != lastCursorPos.Y))
{
// Do actions as in MouseMoved event.
// Save the new position, so it won't be triggered, when user doesn't move the cursor.
lastCursorPos = currentCursorPos;
}
}
Application.DoEvents(); // UI must be kept responsive.
Thread.Sleep(1);
}
}
现在你要做的就是从Shown事件中调用这个方法 - this.Visible必须是true,所以这是让它工作的最简单方法。