我尝试绘制半透明背景,然后在其上面绘制不透明元素。
为什么我不能这样做?
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中绘制相比,绘图确实有点滞后(由于绘制的区域需要在表单中透明),因此不会产生所需的结果。
答案 0 :(得分:2)
这不起作用,因为Go Playground是3
的属性,并且始终会创建整个表单,而其所有内容都具有当前值。尽管如此,它非常适合于淡入或淡出表格。
只有一个表单才能实现您的目标。
相反,您需要两个同步表单。
一个可能有点不透明,让桌面闪耀;另一个必须透明,利用Form
属性,你可以画上它..
要同步两个表单,请对TransparencyKey
和Move
事件进行编码。
对于第一次设置,请使用以下代码:
用于创建半透明外观的虚拟表单:
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;
}
或任何命名颜色。这是因为我
Fuchsia
(以及可能的其他一些颜色)出现一些奇怪的遗留原因时会发生这种情况。