我目前正在使用 Winforms 和.NET 3.5
(工作环境)开发一个简单的图像编辑工具。
我要求当用户点击选择工具按钮时,会出现一个正方形(C#中的矩形),它们可以在100x100
和400x400
之间缩放。我有点修复 - 问题在于使矩形的背景透明。
我对.NET 3.5
是否支持透明度有点不清楚,我尝试了以下内容:
SetStyle(ControlStyles.SupportsTransparentBackColor, true);
pnlSelectArea.BackColor = Color.Transparent;
pnlSelectArea.ForeColor = Color.Transparent;
selectArea1.BackColor = Color.Transparent;
selectArea1.ForeColor = Color.Transparent;
但这没有任何效果 - 任何建议都会受到赞赏。
答案 0 :(得分:45)
这是我的特殊控件,它包含一个不透明度属性,它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);
}
}
答案 1 :(得分:4)
您需要使用Opacity
属性并将其设置为零才能使表单不可见。
如果您想要将控件设为透明,正如您在示例中所尝试的那样,请参阅此文章
How to: Give Your Control a Transparent Background
它说你编写的代码必须在控件的构造函数中。因此,我想,您需要创建一个自定义控件,该控件源自pnlSelectArea
类型,最可能是一个按钮。在该自定义控件的构造函数中,您可以编写代码来设置其样式和颜色。
答案 2 :(得分:1)
这对我有用,因为其他解决方案无效。
这是将透明UserControl添加到ListView / TreeView Control Collection
我知道它说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);
}
答案 3 :(得分:0)
大!! 我终于设法绘制透明的形状。 我添加了一个虚拟方法
Draw(g);
之前
bckColor.Dispose();
g.Dispose();
base.OnPaint(e);
并在最后声明虚方法
protected virtual void Draw(Graphics g){ }
现在我可以继续创建自己的透明形状,图形等......
答案 4 :(得分:0)
有一个简单的解决方法。您可以创建具有透明背景(PNG)的图像,并将其添加到图标的Image属性。由于信息在样式上没有太多灵活性,因此可以很好地工作。有时这可能并不适合所有人。请记住,这只是一种解决方法。
PS: 在图像上的任意位置添加文本,并保留text属性为空。