如何使表单透明,同时保持控件完全可见?

4
我希望有一个表单,表单上的控件完全可见但表单本身是不可见的。如果我改变表单的 Opacity,这会使表单和其上的控件半透明,所以这种方法行不通。
我不能通过设置表单的 TransparencyKey 来实现这一点,因为我在表单上有一个 PictureBox。如果PictureBox中的图像恰好包含与 TransparencyKey 匹配的像素,则它们将显示为表单中的开口,这不是我想要的。

我不确定我明白你在问什么? - Rob Goodwin
C# 不负责用户界面,框架才负责用户界面。你使用的是哪个框架(WinForm、WPF、Win32)? - dthorpe
1
经过澄清后的翻译内容 - 如果这不是您要求的,请随意回滚我的更改,但我相信这就是您要求的。我实际上遇到了完全相同的问题,想知道如何解决。 - MusiGenesis
2个回答

2

请注意,我从未使用过它,只是偶然发现了它,想着“不错!”就离开了...

研究一下System.Drawing.Drawing2D.GraphicsPath并设置表单的Region属性。我在基本的Windows窗体应用程序中添加了两个按钮:

public Form1()
{
    InitializeComponent();

    Rectangle r1 = new Rectangle(button1.Location, button1.Size);
    Rectangle r2 = new Rectangle(button2.Location, button2.Size);

    GraphicsPath gp = new GraphicsPath();
    gp.AddRectangle(r1);
    gp.AddRectangle(r2);

    this.Region = new Region(gp);
}

我已经用矩形近似了按钮的形状;使用这段代码,您可以在按钮的角落看到表单背景颜色。您需要为每个控件计算出封闭路径,并逐个将它们添加到路径中。您需要考虑表单标题栏或边框样式引入的任何偏移量。
更新:我进行了一些调查,并有几种可能的解决方法:
  • 使用GraphicsPath方法,如果没有加载图像,则将pictureBox.Visible设置为False
  • 当您将图像加载到图片框中时,分析图像以获取其中所有颜色的列表,然后随机生成一个不同的颜色。将表单的BackColorTransparencyKey属性设置为与此新颜色相匹配,参见Hans Passant的答案

嗨,這個並不符合我的需求。使用者控制背景依然會有表單的背景顏色。例如,如果我使用一個具有 .png 格式圖片的 picturebox,仍然可以看到表單的背景顏色。 - User6996

2

只有使用TransparencyKey才能实现这一点。选择正确的颜色。Color.Fuchsia长期以来一直是首选颜色,可以追溯到Win32开发的早期。用它攻击你的眼睛,看看它的优点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接