【问题标题】:Modify mouse crosshairs code to be on top of form?将鼠标十字准线代码修改为位于表单顶部?
【发布时间】:2010-08-24 23:38:53
【问题描述】:

可以在空白的winform 上添加code 以显示在鼠标指针处相交的线(十字准线)。问题是表单上的控件(即listview、splitcontainer、按钮)没有显示(或部分隐藏)这些行。

如何修改下面的代码以显示表单上所有控件的顶部(带到前面...)?

int lastX = 0;
int lastY = 0;
private void Form1_MouseMove(object sender, MouseEventArgs e)
{
Region r = new Region();
r.Union(new Rectangle(0, lastY, this.Width, 1));
r.Union(new Rectangle(lastX, 0, 1, this.Height));
this.Invalidate(r);
this.Update();
Graphics g = Graphics.FromHwnd(this.Handle);

g.DrawLine(Pens.Chocolate, 0, e.Y, this.Width, e.Y);
g.DrawLine(Pens.Chocolate, e.X, 0, e.X, this.Height);
lastX = e.X;
lastY = e.Y;
}

private void Form1_MouseLeave(object sender, EventArgs e)
{
this.Invalidate();
}

【问题讨论】:

    标签: c# winforms graphics mouse


    【解决方案1】:

    您需要一个位于所有其他控件之上的透明窗口。获得一个的唯一方法是将表单与另一个表单重叠,并通过其 TranparencyKey 属性使其透明。您可以在我的回答中找到示例代码 this thread

    【讨论】:

      【解决方案2】:

      请先尝试将表单上的控件(即列表视图、拆分容器、按钮)发送回(Control.SendToBack())。把它放在 FormLoad 事件中。我用 Windows MDI 应用程序试验了同样的噩梦。 希望对你有帮助,

      【讨论】:

        【解决方案3】:

        枚举所需控件并对其调用.BringToFront(); 函数。

        listBox1.BringToFront();
        

        【讨论】:

          【解决方案4】:

          根据文档,区域对象应该在世界坐标中,您传递的是客户端坐标。使用Control.PointToScreen 将矩形的左上角坐标映射到世界空间。

          我也很想将绘图推迟到 OnPaint 方法。

          【讨论】:

            猜你喜欢
            • 2014-07-24
            • 2022-12-23
            • 2013-07-20
            • 2012-05-10
            • 2011-03-03
            • 2021-09-18
            • 1970-01-01
            • 1970-01-01
            • 2023-02-02
            相关资源
            最近更新 更多