gpt4 book ai didi

c# - Winforms:如何在透明窗体上获取鼠标事件以进行透明控制

转载 作者:行者123 更新时间:2023-11-30 21:55:17 26 4
gpt4 key购买 nike

我有一个透明的窗体,它在c#.NET winforms应用程序中覆盖了桌面。通过将BackColor设置为亮橙色,然后将TransparencyKey设置为相同的亮橙色,可以实现透明度。

到目前为止,这很好用,并且创建了透明的表单。然后,我想在透明窗体上创建一个控件,该控件在桌面上的项目周围绘制一个矩形。因此,从本质上讲,您可以想到带有矩形边框的透明按钮。为了做到这一点,我目前扩展了Control并在透明的父窗体内部设置了这样的控件:

public class CustomControl : Control 
{
public CustomControl(Size size, Point point)
{
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
this.BackColor = Color.Transparent;
this.Size = size;
this.Location = point;
}

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Pen pen = new Pen(Color.Red, 2f);
e.Graphics.DrawRectangle(pen, this.ClientRectangle);
}
}


这将产生我一直在寻找的确切效果,因为在透明窗体内有一个带有实心不透明矩形边框的控件,您可以通过该控件和窗体看到桌面(请参见下面的左图)。

enter image description here

问题是控件的透明区域没有收到任何鼠标事件。实际上,它基本上不存在。例如,当鼠标悬停在控件的红色矩形边框上时,该边框会触发“鼠标悬停”,“鼠标进入”和“鼠标离开”事件,并将光标更改为您为该控件设置的 this.Cursor。一旦鼠标位于控件的透明部分,这些东西都不会触发。

如何在控件外观方面保持它们现在的状态,但仍然在透明区域接收鼠标事件。特别是,我想接收鼠标悬停并遵守 Cursor控件的值。请注意,如果将控件的 BackColor设置为 Color.Transparent以外的任何其他选项,则鼠标事件可以正常工作。

谢谢!

更新资料

基于Hans的评论,我想补充一点,我们已经实现了上述功能,并且通常可以正常工作(即透明区域确实响应鼠标事件)。出现此问题的原因是因为我最近用所有Windows 8.1更新和最新的ATI图形驱动程序重建了我的计算机,之后,上述设置不再起作用(控件上的透明区域不再接收任何鼠标事件,并且不会出现所有意图)和目的不是控制的一部分),尽管我们偶尔注意到它不起作用,但在同事的机器上它几乎总是可以工作,但我们永远无法始终如一地重现该问题。

我的假设是我们做错了什么,导致透明区域无法响应鼠标事件。但是,根据汉斯的评论,上述代码似乎永远都行不通,并且唯一起作用的原因是因为Aero中的错误。

我们的透明键的确切颜色是 rgb(255, 128, 0)。此外,我们确实注意到,放置在透明表单上的任何标签控件看起来都很糟糕(根据Han的评论)。

更新2

基于Han关于Aero透明度错误的其他评论,我有以下更新的问题。


在某处是否有有关此错误的任何信息来说明该错误是什么?
控件透明区域的预期行为(假定没有错误)是什么?鼠标事件(例如,鼠标悬停)是否应该在透明区域起作用?


最终答案(通常有效)

下面的Reza提供的答案确实对我的某些计算机有用。但是,我的主要台式机仍然顽固地拒绝合作。即使在使用相同版本的Windows和.NET的计算机之间复制确切的项目时,也存在问题。出现问题的原因是透明区域不会触发鼠标事件,也不会被视为控件的一部分。

此外,我注意到Reza注意到的同一件事,即某些TransparencyKey颜色平坦不起作用。尽管我不知道该错误的任何细节,但我必须与Hans同意,WinForms上存在涉及透明性的错误,如果有人从头开始,我会走WPF路线,并为以后避免任何麻烦。

最后,我们根据Hans的一些答案最终实现了解决方法,这些答案需要使用计时器来检查鼠标的位置,并嵌套两种形式(一种设置了不透明度)来管理鼠标光标。该解决方案已在我们所有的系统上运行,并且有望持续到我们迁移到WPF为止。我接受Reza的回答,因为它似乎在大多数地方都有效,但是要知道它可能对您不起作用,并且没有任何押韵或原因。

有关我们实施的两种解决方法的详细信息,请参阅Hans的以下问题和解答。

MouseHover and MouseLeave Events controlling

How can I add transparency to a c# form while keeping controls visible?

最佳答案

重要

考虑将表单的BackgroundColor设置为Red,将TransparencyKey设置为Red,将透明控件的BackGroundColor设置为Transparent,它将起作用!

我看到的奇怪的是,这种方法不适用于洋红色,但适用于红色和蓝色。



我认为您应该这样创建透明控件:

透明控制码

public class TransparentControl : Control
{
public TransparentControl()
{
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
}

private const int WS_EX_TRANSPARENT = 0x20;
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT;
return cp;
}
}
}


对于鼠标进入时的鼠标事件和渲染边框,这是我在 .Net 4.5上使用 Windows 8.1所做的示例:

创建一个 Form并在上面放置我们使用上述代码创建的 TransparentControl,然后处理 MouseEnterMouseLeavePaint事件,并在鼠标处于控制键中并处理 Click时绘制边框事件并显示一条消息。

表格代码

private bool drawBorder;
private void transparentControl1_MouseLeave(object sender, EventArgs e)
{
drawBorder = false;
transparentControl1.Invalidate();
}

private void transparentControl1_MouseEnter(object sender, EventArgs e)
{
drawBorder = true;
transparentControl1.Invalidate();
}

private void transparentControl1_Paint(object sender, PaintEventArgs e)
{
if(drawBorder)
{
using (var pen = new Pen(this.ForeColor, 5))
{
e.Graphics.DrawRectangle(pen, 0, 0, this.transparentControl1.Width - 1, this.transparentControl1.Height - 1);
}
}
}

private void transparentControl1_Click(object sender, EventArgs e)
{
MessageBox.Show("Clicked");
}


屏幕截图

enter image description here

鼠标光标位于控件的区域中,因此黑色边框已绘制。

重要的提示

如果您绘制的边框颜色与表单的透明键相同,则边框不会显示。

关于c# - Winforms:如何在透明窗体上获取鼠标事件以进行透明控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32389571/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com