【发布时间】: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 说得客气一点。关于它的官方说法是:透明度是通过复制控件的父级背景来伪造的;这意味着除其他限制外:不允许重叠,任何动态都相当困难..