使控制透明

我目前正在使用Winforms.NET 3.5 (工作环境)开发一个简单的图像编辑工具。

我有一个要求,当用户点击一个select工具button,会出现一个正方形(在C#中的矩形),他们可以在100x100400x400之间缩放。 我有这个位固定 – 问题与使矩形的背景透明。

我有点不清楚,如果在.NET 3.5支持透明度,我已经尝试了以下内容:

 SetStyle(ControlStyles.SupportsTransparentBackColor, true); pnlSelectArea.BackColor = Color.Transparent; pnlSelectArea.ForeColor = Color.Transparent; selectArea1.BackColor = Color.Transparent; selectArea1.ForeColor = Color.Transparent; 

但这没有效果 – 任何意见,将不胜感激。

这是我的特殊的控制,其中包含一个不透明的属性,它100%的作品:

 using System; using System.Collections; using System.ComponentModel; using System.ComponentModel.Design; using System.Drawing; using System.Windows.Forms; using System.Windows.Forms.Design; public class TranspCtrl : Control { public bool drag = false; public bool enab = false; private int m_opacity = 100; private int alpha; public TranspCtrl() { SetStyle(ControlStyles.SupportsTransparentBackColor, true); SetStyle(ControlStyles.Opaque, true); this.BackColor = Color.Transparent; } public int Opacity { get { if (m_opacity > 100) { m_opacity = 100; } else if (m_opacity < 1) { m_opacity = 1; } return this.m_opacity; } set { this.m_opacity = value; if (this.Parent != null) { Parent.Invalidate(this.Bounds, true); } } } protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle = cp.ExStyle | 0x20; return cp; } } protected override void OnPaint(PaintEventArgs e) { Graphics g = e.Graphics; Rectangle bounds = new Rectangle(0, 0, this.Width - 1, this.Height - 1); Color frmColor = this.Parent.BackColor; Brush bckColor = default(Brush); alpha = (m_opacity * 255) / 100; if (drag) { Color dragBckColor = default(Color); if (BackColor != Color.Transparent) { int Rb = BackColor.R * alpha / 255 + frmColor.R * (255 - alpha) / 255; int Gb = BackColor.G * alpha / 255 + frmColor.G * (255 - alpha) / 255; int Bb = BackColor.B * alpha / 255 + frmColor.B * (255 - alpha) / 255; dragBckColor = Color.FromArgb(Rb, Gb, Bb); } else { dragBckColor = frmColor; } alpha = 255; bckColor = new SolidBrush(Color.FromArgb(alpha, dragBckColor)); } else { bckColor = new SolidBrush(Color.FromArgb(alpha, this.BackColor)); } if (this.BackColor != Color.Transparent | drag) { g.FillRectangle(bckColor, bounds); } bckColor.Dispose(); g.Dispose(); base.OnPaint(e); } protected override void OnBackColorChanged(EventArgs e) { if (this.Parent != null) { Parent.Invalidate(this.Bounds, true); } base.OnBackColorChanged(e); } protected override void OnParentBackColorChanged(EventArgs e) { this.Invalidate(); base.OnParentBackColorChanged(e); } } 

您将需要使用Opacity属性并将其设置为零以使表单不可见。

如果你想控制透明,就像你在示例中试过的一样,请参阅这篇文章

如何:给你的控制一个透明的背景

它说你写的代码必须在控件的构造函数中。 因此,我想,你将需要创build一个从你的pnlSelectAreatypes最可能是一个button派生的pnlSelectArea 。 在该自定义控件的构造函数中,您可以编写代码来设置其样式和颜色。

这是什么为我工作,因为其他解决scheme没有工作。

这是透明的UserControl添加到ListView / TreeView控件集合

我知道它说ButtonRenderer,但它应该适用于任何控件。

在UserControl中:

 protected override void OnPaint(PaintEventArgs e) { ButtonRenderer.DrawParentBackground(e.Graphics, this.ClientRectangle, this); } 

在父级控件中:

 protected override void WndProc(ref Message m) { if(m.Msg == 0xF) foreach(Control c in this.Controls) { c.Invalidate(); c.Update(); } base.WndProc(ref m); } 

大!! 我终于设法画出透明的形状。 我已经添加了一个虚拟的方法

 Draw(g); 

就在之前

 bckColor.Dispose(); g.Dispose(); base.OnPaint(e); 

并在最后宣布虚拟方法

 protected virtual void Draw(Graphics g){ } 

现在我可以继续创build自己的透明形状,graphics等