不透明度问题



我正在尝试绘制一个半透明的背景,然后在它上面绘制不透明的元素。

为什么我不能做这样的事情?

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 中绘制相比,绘图确实有点滞后(这不会产生所需的结果,因为绘制区域需要在窗体中透明(。

不起作用,因为OpacityForm的属性,并且始终使整个表单及其所有内容都具有当前值。不过,它非常适合淡入或淡出表单。

你不能只用一种形式实现你想要的。

相反,您将需要两个同步形式。

一个可以有些不透明,可以让桌面发光;另一个必须通过使用TransparencyKey属性是透明的,你可以在上面绘图。

要同步两个表单,请对MoveResizeEnd事件进行编码。

对于首次设置,请使用如下代码:

用于创建半透明外观的虚拟表单:

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();

MoveResizeEnd事件中,代码可能如下所示:

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(可能还有其他一些颜色(时,就会发生这种情况。

最新更新