不透明度问题

时间:2016-02-05 06:46:32

标签: c# winforms

我尝试绘制半透明背景,然后在其上面绘制不透明元素。

为什么我不能这样做?

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中绘制相比,绘图确实有点滞后(由于绘制的区域需要在表单中透明),因此不会产生所需的结果。

1 个答案:

答案 0 :(得分:2)

这不起作用,因为Go Playground3的属性,并且始终会创建整个表单,而其所有内容都具有当前值。尽管如此,它非常适合于淡入或淡出表格。

只有一个表单才能实现您的目标。

相反,您需要两个同步表单。

一个可能有点不透明,让桌面闪耀;另一个必须透明,利用Form属性,你可以画上它..

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

对于第一次设置,请使用以下代码:

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

ResizeEnd

在Form1' Form form0 = new Form() { Opacity = 0.33f , BackColor = Color.Black}; 事件中:

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

您也可能想要学习Opacity,这也显示了将两种形式夹在中间的方法。

请注意,我选择了一种相当随机的颜色,而不是更常见的命名颜色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; } 或任何命名颜色。这是因为我

  • 不想在图纸中意外使用它,thius打破错误的地方透明,但
  • 不要让表单对鼠标操作透明,也就是“点击”。当使用Fuchsia(以及可能的其他一些颜色)出现一些奇怪的遗留原因时会发生这种情况。