C# NET - 在不透明级别设置的窗体上绘制不透明画笔

标签 c# .net winforms transparency

我想要实现的是覆盖屏幕的半透明背景。 然后能够在其上绘制非透明画笔。

我尝试的是创建一个屏幕大小的表单,然后设置它的颜色并设置 this.opacity = 0.5。但是,这会影响表单中的所有画笔。

我还尝试将背景颜色设置为 Color.Transparent,然后在我绘制不透明画笔之前绘制一个覆盖屏幕的附加画笔,不透明度为 0.5...但是背景也变得不透明。 即使设置了样式标志 (ControlStyles.SupportsTransparentBackColor, true)

我知道我可以通过额外的表格来实现这一点。 一种形式用于透明背景,另一种形式用于不透明前景,但这不是矫枉过正吗?

有没有更好的办法?

更新 1: 尝试评论中的建议。

当前状态: Form1:主程序,调用'overlay'来显示,即: Form2:叠加背景(半透明黑色)和, Form3:覆盖前景,这是用户绘制的地方。

Form 1 和 2 按预期工作,但 Form3 拒绝透明工作。 如果我设置

this.BackColor = Color.Lime;
this.TransparencyKey = Color.Lime;

然后性能下降并且程序严重滞后(尽管它确实变得透明)。 理想情况下,我想使用 this.BackColor = Color.Transparent; 但这没有任何效果(纯色背景,无 alpha)。

请注意,窗体覆盖屏幕,背景通常是桌面。也许这就是它不起作用的原因?

最佳答案

您可以覆盖表单的 OnPaintBackground,而无需调用它的基础。 这将使您能够为背景指定任何颜色。

试试这个:

protected override void OnPaintBackground(PaintEventArgs e)
{
    using (var brush = new SolidBrush(Color.FromAgrb(50, 0, 0, 0))
    {
        e.Graphics.FillRectangle(brush, e.ClipRectangle);
    }
}

关于C# NET - 在不透明级别设置的窗体上绘制不透明画笔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35181917/

相关文章:

c# - 如何在 Xamarin.Forms 中根据 ListView 滚动方向显示和隐藏 StackLayout?

C# 正则表达式 : matching anything between single quotes (except single quotes)

c# - 如何有效地管理对 Membership.GetUser() 的多次调用

c# - 使用 String+string+string 与使用 string.replace

c# - Windows 窗体应用程序未关闭

c# - 在 geckofx 中显示 html

c# - HTML.ActionLink 方法

c# - 计算html文件表格中有多少列和行

c# - 从 C# 的 .txt 文件中读取 SQL 查询

c# - 字符串或二进制数据将被截断。?