一些相关的实现思路
首先给定一个结论【官方】: WinForm不支持真正的透明,其控件透明的实现都是背景颜色设置和对应位置的父控件背景相同。
Windows Forms controls do not support true transparency. The background of a transparent Windows Forms control is painted by its parent.
且 .NET Framework 4.0 之前不支持任何的透明背景颜色设置。
如果拖拽的控件(如Button),无法正确的背景透明地显示其底层的控件,需要显式的设置其底层位置的控件为其父控件。比如后面示例中设置button的父控件为PictureBox:
nextBtn.Parent = preBtn.Parent = minePic;
。另,Winform中控件的背景透明只有三种:Button控件的透明、其他控件的透明、不支持透明,此外,还有Form窗体的透明、继承重写控件时设置的
SetStyle(ControlStyles.UserPaint, true);
完全由用户绘制的透明。
Button等控件想实现背景透明,有一个比较好的思路,如果父级控件背景是纯色的,可以将Button的背景色调整和父控件一样,这样看起来就像背景透明了一样。
从这个思路出发,如果我们能获取当前控件底部的背景图(父控件的背景),将其所在位置的背景内容完全的复制一份,作为自己的背景,这样就能实现看起来背景透明的效果(完全显示看见了底部的背景内容【虽然是复制的】)
如果父级控件不是纯色,同样可以通过复制底部的背景“假”实现。
除了设置属性实现,还可以通过重写控件(自定义控件)的方式,设置背景透明。
除了Button控件背景透明的设置稍微复杂点,其他控件都可直接通过BackColor = Color.Transparent
设置透明背景色实现。
Button按钮如何实现背景透明
对于想要实现背景透明,最开始想的实现办法,还一直停留在设置背景颜色的基础上(正常处理应该是这样),但是这种方法不行,如果如何设置背景色,哪怕Color.Transparent
、Color.Empty
,Button按钮使用的依旧是系统设置的默认颜色。这条路是不通的,需要从样式设置中查看实现,或者自己重写控件实现。
Button背景透明
winform项目的窗体添加一个背景图片,添加两个button按钮,一个按钮添加png格式无背景色的图片做按钮背景图片。
通过设置FlatStyle
为Flat
实现背景透明
button1.FlatStyle = FlatStyle.Flat;
button1.BackColor = Color.Transparent;
button1.FlatAppearance.MouseDownBackColor = Color.Transparent;
button1.FlatAppearance.MouseOverBackColor = Color.Transparent;
button1.FlatAppearance.CheckedBackColor = Color.Transparent;
背景透明的按钮效果如下:
Color.Transparent
的含义不是单纯的设置透明色,而是使用系统设置的默认颜色。比如:
button1.BackColor = Color.Transparent;
,其FlatStyle取值为Standard
时,显示效果为控件的背景,效果如下:
设置border的size为0,取消边框,实现真正透明。完整代码如下:
button1.FlatStyle = FlatStyle.Flat;
button1.BackColor = Color.Transparent;
button1.FlatAppearance.MouseDownBackColor = Color.Transparent;
button1.FlatAppearance.MouseOverBackColor = Color.Transparent;
button1.FlatAppearance.CheckedBackColor = Color.Transparent;
button1.FlatAppearance.BorderSize = 0;
这就是我们想要实现的,背景透明完全显示出下一层的背景
设置 button1.FlatStyle = FlatStyle.Popup;
也可以,但是无法取消突出的边框。
背景透明效果的前提是,加载的背景图片也是无背景色的png格式。
多控件叠加时的背景透明问题
FlatStyle.Flat
、BackColor = Color.Transparent
实现的背景透明是相对于父控件的。如果发生多个控件的叠加,就会发现,其透明背景显示的依旧是父控件对应位置的内容,而不是其底层覆盖的真实内容透出来。
效果如下:
目前这个问题似乎无解,不过相对来说已经效果很不错了!(下面介绍的PictureBox控件背景透明也同样有这个情况)
【如果能通过代码获取控件位置对应底部的所有内容,从而复制一份,就可以解决多控件叠加时的这个问题】
PictureBox实现背景透明的图片控件
借助PictureBox控件实现,加载图片(png格式背景透明)显示,并设置背景透明的效果(属性中背景颜色设置为Web的Transparent,即代码的Color.Transparent
值即可)
代码为:
pictureBox1.Image = Properties.Resources.start;
pictureBox1.BackColor = Color.Transparent;
pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
这样,可以通过图片控件PictureBox
模拟背景透明的其他控件。
PictureBox控件的透明同样是相对于其父控件的。要注意控件叠加的情况!
label等控件的透明
BackColor = Color.Transparent
直接设置背景透明。
label1.BackColor = Color.Transparent;
此外用户控件、Panel、TabPage等控件都可以通过BackColor = Color.Transparent
实现背景透明。
实现一个加载图片并以图片控件为透明背景的上一张/下一张按钮
按钮透明底层控件的图片基本效果
设置Button的父控件为pictureBox1
,Button的背景透明,并添加一张占满底层pictureBox1
的图片。
// 改变父控件,默认为Form窗体
button1.Parent = pictureBox1;
button2.Parent = pictureBox1;
button1.FlatStyle = FlatStyle.Flat;
button1.BackColor = Color.Transparent;
button1.FlatAppearance.MouseDownBackColor = Color.Transparent;
button1.FlatAppearance.MouseOverBackColor = Color.Transparent;
button1.FlatAppearance.CheckedBackColor = Color.Transparent;
button1.FlatAppearance.BorderSize = 0;
button2.FlatStyle = FlatStyle.Flat;
button2.BackColor = Color.Transparent;
button2.FlatAppearance.MouseDownBackColor = Color.Transparent;
button2.FlatAppearance.MouseOverBackColor = Color.Transparent;
button2.FlatAppearance.CheckedBackColor = Color.Transparent;
button2.FlatAppearance.BorderSize = 0;
如下,背景透明的按钮效果:
查看微信保存的图片文件dat格式的小软件,图片按钮透明效果
为两个Button控件添加上一张、下一张的无背景色png图片,设置Button背景透明,并通过显式设置其父控件为minePic(呈现图片的主体PictureBox
)。
nextBtn.Parent = preBtn.Parent = minePic;
选取一张底层图片,使图片按钮可以遮盖住,查看效果如下:
dat图片的解析,可直接从网上查找相关资料