C# NET - 在窗体上使用不透明度设置绘制不透明画刷

4
我想实现的是一个半透明背景,覆盖整个屏幕。并且能够在其上方绘制不透明的画笔。
我尝试过创建一个与屏幕大小相同的窗体,然后设置它的颜色并设置 this.opacity = 0.5。但是这会影响窗体中所有的画笔。
另外,我也尝试将背景颜色设置为 Color.Transparent,并且在绘制不透明画笔之前使用 opacity 0.5 绘制覆盖整个屏幕的附加画笔... 但是背景也变得不透明了。即使设置了样式标志 (ControlStyles.SupportsTransparentBackColor, true) 我知道可以通过增加另一个窗体来实现这一点。一个用于透明背景,另一个用于不透明前景,但这不是过度设计吗?
有更好的方法吗?
更新1: 尝试评论中提到的建议。
当前状态: Form1:主程序,调用“遮罩”的显示,其中包括: Form2:遮罩背景(半透明黑色)和, Form3:遮罩前景,这是用户绘制的地方。
Form1 和 Form2 的工作方式符合预期,但 Form3 拒绝支持透明度。 如果我设置

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

当程序运行时性能下降,程序会出现严重的滞后(尽管它确实变得透明)。

理想情况下,我希望使用this.BackColor = Color.Transparent;但这并没有效果(固体背景,无alpha通道)。

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


1
一个替代方案是在显示表单之前创建一个屏幕截图,并将其用作背景图像。也许不是最好的解决方案,但它很简单(就像我一样:P) - C.Evenhuis
@C.Evenhuis 这是个好主意,我也考虑过。我正在尝试制作一个截屏程序,所以我希望能够在后台捕获潜在的视频 :) - Alx
2
你需要一个由两个窗口组成的三明治。底部窗口使用Opacity,顶部窗口使用TransparencyKey,并且是你绘制的窗口。三明治的示例代码在这里 - Hans Passant
@HansPassant 谢谢您的建议。我已经尝试实现了两个窗体。一个是背景,只是一个黑色的颜色,透明度设置为0.5。另一个是前景,它具有backcolor = transparent,仅显示绘制的画笔。问题是前景窗体拒绝变成透明。如果我通过将backcolor和transparencykey设置为相同来使其透明,性能会下降,并且在鼠标移动时程序会严重滞后。 - Alx
1个回答

0

您可以重写窗体的 OnPaintBackground 方法,而无需调用其基类。 这将使您能够指定任何您想要的背景颜色。

试试这个:

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

谢谢您的建议。我正在尝试将标志ControlStyles.SupportsTransparentBackColor设置为true。无论alpha值设置为多少,颜色都是不透明的... :( - Alx
实际上,它对我有效,但仅当表单无法移动时。我认为Hans Passant有更好的解决方案(像往常一样:-))。 - Zohar Peled
我已经锁定了我的表单,所以它不能被移动(它已经覆盖整个屏幕),但这并没有起到作用。Alpha 没有任何效果。如果我使用 BackColor = Transparent,则我绘制的画笔不会带有 Alpha(始终是实心的),但如果我设置不透明度,则所有内容都会受到影响。 - Alx

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