不透明度问题
本文关键字:问题 不透明度 | 更新日期: 2023-09-27 18:33:23
我正在尝试绘制一个半透明的背景,然后在它上面绘制不透明的元素。
为什么我不能做这样的事情?
protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
this.Opacity = 0.5;
pe.Graphics.FillRectangle(trans_black_brush, square_rect_big);
this.Opacity = 1;
pe.Graphics.FillRectangle(solid_red_brush, square_rect);
}
如果对表单绘图有更好理解的人可以告诉我为什么这不起作用,我将不胜感激:)
更新:该解决方案有 3 种形式:1(主(程序,按钮等(2(半透明背景(屏幕尺寸,使用不透明度(3(透明背景,但顶部有实心画笔。
在 Form2 的构造函数中,我有这个:
Foreground = new FormForeground(this);
在 Form3 的构造函数中,我有这个:
private Form_FormBackground m_Parent;
public FormForeground(FormBackground parent)
{
InitializeComponent();
FormBackground m_Parent = parent;
...
}
每当单击鼠标并用于在窗体 3 中绘制时,我像这样更新父级的矩形:
private void _UpdateParent()
{
m_Parent.s_DrawArea = m_DrawArea;
m_Parent.Invalidate();
}
然后,父级(窗体 2(执行其 OnPaint((,在其中绘制标记区域。
它确实有效,但是与直接在 form3 中绘制相比,绘图确实有点滞后(这不会产生所需的结果,因为绘制区域需要在窗体中透明(。
这
不起作用,因为Opacity
是Form
的属性,并且始终使整个表单及其所有内容都具有当前值。不过,它非常适合淡入或淡出表单。
你不能只用一种形式实现你想要的。
相反,您将需要两个同步形式。
一个可以有些不透明,可以让桌面发光;另一个必须通过使用TransparencyKey
属性是透明的,你可以在上面绘图。
要同步两个表单,请对Move
和ResizeEnd
事件进行编码。
对于首次设置,请使用如下代码:
用于创建半透明外观的虚拟表单:
Form form0 = new Form() { Opacity = 0.33f , BackColor = Color.Black};
在 Form1 的Load
事件中:
TransparencyKey = Color.FromArgb(255, 147, 151, 162);
BackColor = TransparencyKey;
DoubleBuffered = true;
form0.Enabled = false;
form0.BringToFront();
form0.Show();
form0.Size = Size;
form0.Location = Location;
BringToFront();
在Move
和ResizeEnd
事件中,代码可能如下所示:
private void Form1_Move(object sender, EventArgs e)
{
form0.Size = Size;
form0.Location = Location;
}
private void Form1_ResizeEnd(object sender, EventArgs e)
{
form0.Size = Size;
form0.Location = Location;
}
您可能还想研究这篇文章,它也展示了一种将两种形式夹在中间的方法。
请注意,我选择了一种相当随机的颜色,而不是更常见的命名颜色Fuchsia
或任何命名颜色。这是因为我
- 不想在图纸中不小心使用它,thius破坏使错误的点透明,而且还
- 不想使表单对鼠标操作透明,也称为"点击"。当出于一些奇怪的遗留原因使用
Fuchsia
(可能还有其他一些颜色(时,就会发生这种情况。