首页 > 解决方案 > 如何为多个控件设置不同的不透明度?

问题描述

我对某些控件的不透明度有疑问。

所以我将表单不透明度设置为0.3,当表单加载时,问题是它使其他控件与表单一样透明。这是代码。

private void Form1_Load(object sender, EventArgs e)
{
      this.Opacity = 0.3;
}

通过这样做,我的所有控件都像表单一样透明。有没有办法让表单内的控件具有不同的不透明度?我根本不希望另一个是透明的。

标签: c#winforms

解决方案


我的第一个建议是避免这种情况。具有不透明控件的半透明背景看起来有些奇怪。相反,请考虑在表单处于活动状态时将不透明度从 0.3 更改为 0.7,以便更易于阅读。

如果某些控件是不透明的并且背景几乎是透明的,那么另一个问题是,您的 UI 在某些背景上可能无法正常工作。例如,如果背景真的很暗,那么深色文本(控件)将很难看到。如果背景是白色的,那么像编辑框这样的白色控件将与背景颜色相同。

您可以从其他人的评论中获得一些想法。尽管有些评论是针对 WPF 的,但您也许可以对 WinForms 有所了解。如果你没有得到预期的结果,你也可以考虑在 UI 的那部分使用 WPF。

话虽如此,获得您想要的一种可能的解决方法是在同一位置创建两个顶级窗口(并根据需要移动/调整它们的大小)。这样,您可以拥有一个带有透明度键的窗口和不透明区域所需的背景,该背景将用于具有不透明和半透明区域。另一个窗口将使用不透明度,以便它是半透明的。这是包含您的 UI 控件的窗口(以及位于顶部的那个)。

我过去曾使用该技术在一个应用程序中拥有一个具有完全不透明框架的半透明客户区域,我希望能够看到客户区域(可调节不透明度),以便我可以在我的窗口中使用另一个应用程序中的图像作为参考。

另一条评论是,对于某些在 WinForms 和/或 WPF 中不可用的自定义,您可能需要使用 Windows 句柄和直接 Win32 API 访问进行实际控制。在我的应用程序中,我处理激活的方式是,如果我单击底层窗口,顶层窗口仍会显示为活动窗口(标题栏颜色)。如果没有标准的标题栏(框架是自定义的或根本没有框架),那么您就不会有这个问题。

正如评论部分中的一些链接所建议的那样,也可以使用单个顶级窗口获得您想要的东西。我还没有尝试过。实际上,当我尝试上述解决方案时,我认为我的应用程序仍然在 Windows XP 上受支持,因此您的选项受到更多限制,并且行为本质上有所不同,因为 XP 或多或少直接写入屏幕,而 Vista 及更高版本为每个窗口使用位图(缓冲区)。

我还为启动屏幕(在单个窗口上)使用了组合的透明度键和不透明度,它适用于大多数系统,但有时我在某些系统上得到黑色背景而不是所需的背景(可能是一些具有特定配置的 XP 机器)。


推荐阅读