【问题标题】:Problems with Opacity不透明度问题
【发布时间】:2016-02-05 06:46:31
【问题描述】:

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

我怎么就不能这样?

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 中绘制相比,绘制确实有点滞后(这不会产生预期的结果,因为绘制的区域需要在整个表单中是透明的)。

【问题讨论】:

  • 如果您需要透明度,那么 winforms 确实不是您想要使用的,它的图形处理 (gdi+) 总是在某些方面遇到困难,因为它的整个透明度处理有点像 hack
  • 它的整个透明度处理有点像 hack 说得客气一点。关于它的官方说法是:透明度是通过复制控件的父级背景来伪造的;这意味着除其他限制外:不允许重叠,任何动态都相当困难..

标签: c# winforms


【解决方案1】:

这不起作用,因为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;
}

您可能还想研究this post,它还显示了一种将两种形式夹在中间的方法。

请注意,我选择了一种相当随机的颜色,而不是更常见的命名颜色 Fuchsia 或任何命名颜色。这是因为我

  • 不想在绘图中意外使用它,这样会破坏使错误的点透明,但也
  • 不想让表单对鼠标操作透明,也就是“点击”。出于一些奇怪的遗留原因使用Fuchsia(可能还有其他颜色)时会发生这种情况..

【讨论】:

  • 谢谢你,TaW。我已经设置了 3 个表格。第一个是主程序。第二个是背景(不透明度),第三个是您绘制的前景。表格 1 和 2 效果很好,问题是表格 3 拒绝透明。我无法将 BackColor 设置为 Color.Transparent。如果我将透明度键和背景色设置为相同,我将无法移动鼠标并进行绘制(因为表单不再存在,有点不可见)
  • 你选择了哪种背景色?紫红色可能吗?这是唯一要避免的,因为它会使表单“点击”...
  • 感谢您提出这个问题。到目前为止,我已经尝试了不同的颜色(不是您提到的那个),现在我随机尝试了 CadetBlue,它可以工作!我之前试过的颜色都是标准色,黑色、白色、红色、粉色、青柠色……不知道为什么颜色会有不同的效果……
  • 我试图实现的一件事是通过两种形式使选择透明,所以我设置了相同的透明度键,并且选择的矩形填充了相同的颜色。绘制的框不会从前景中流血。我想这样做,以便通过两种形式选择的任何内容都变得 100% 透明。有没有办法做到这一点?如何将 form3 中的选择框矩形变为 form 2,以便我可以在那里绘制它?
  • 嗯,我想我不完全明白。但是,由于所有表格的大小相同,您始终可以做的是从顶部获取坐标,但在较低的表格上进行绘图。我希望您以正确(即持久)的方式进行绘图。通过最小化和最大化表格来检查!这些表格现在是如何堆叠的?主要-半透明-透明?你想画到哪一个?
猜你喜欢
  • 2011-06-04
  • 2013-06-16
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 2018-02-19
相关资源
最近更新 更多