Winform控件优化之背景透明那些事1:Button控件等背景透明

简介: WinForm不支持真正的透明,其控件透明的实现都是背景颜色设置和对应位置的父控件背景相同。Winform中控件的背景透明只有三种:Button控件的透明、其他控件的透明...

一些相关的实现思路

首先给定一个结论【官方】: 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.TransparentColor.Empty,Button按钮使用的依旧是系统设置的默认颜色。

这条路是不通的,需要从样式设置中查看实现,或者自己重写控件实现。

Button背景透明

winform项目的窗体添加一个背景图片,添加两个button按钮,一个按钮添加png格式无背景色的图片做按钮背景图片。

通过设置FlatStyleFlat实现背景透明

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.FlatBackColor = 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图片的解析,可直接从网上查找相关资料
相关文章
|
C# 图形学 Windows
Winform控件优化之背景透明那些事2:窗体背景透明、镂空穿透、SetStyle、GDI透明效果等
两行代码就能实现Form窗体的(背景)透明效果,它不是Opacity属性的整个窗体透明,`TransparencyKey`实现窗体的透明、窗体中间部分镂空效果...
4106 0
Winform控件优化之背景透明那些事2:窗体背景透明、镂空穿透、SetStyle、GDI透明效果等
|
前端开发 API C#
C#使用外部字体、嵌入字体到程序资源中(Winform)及字体的版权问题
应用程序能够使用一个好的字体,是用户界面很重要的一部分,但是很多字体如果系统没有安装,则需要额外引入,这就涉及到极其重要的字体版权问题,及额外字体的使用和安装。最好的方式应该是将字体嵌入到程序中...
5345 1
C#使用外部字体、嵌入字体到程序资源中(Winform)及字体的版权问题
|
C# 索引 Windows
Winform控件优化之TabControl控件的使用和常用功能
TabControl是一个分页切换(tab)控件,不同的页框内可以呈现不同的内容,将主要介绍调整tab的左右侧显示、设置多行tab、禁用或删除tabpage、隐藏TabControl头部的选项卡等
7007 0
Winform控件优化之TabControl控件的使用和常用功能
|
C# 容器
Winform控件优化之TabControl控件的美化和功能扩展
在基本的TabControl控件使用和功能之上,可以尝试对其进行美化和功能扩展,比如动态删除或添加tab、绘制图标按钮及鼠标hover时的背景变化、Tab从右向左布局的优化处理等。最重要...
3566 0
Winform控件优化之TabControl控件的美化和功能扩展
|
算法 Windows
Winform控件优化之实现无锯齿的圆角窗体(或任意图形的无锯齿丝滑的窗体或控件)【借助LayeredWindow】
在一般能搜到的所有实现圆角窗体的示例中,都有着惨不忍睹的锯齿...而借助于Layered Windows,是可以实现丝滑无锯齿效果的Form窗体的,其具体原理就是分层窗体....
2142 0
Winform控件优化之实现无锯齿的圆角窗体(或任意图形的无锯齿丝滑的窗体或控件)【借助LayeredWindow】
|
11月前
|
人工智能 API Apache
推荐3款开源、美观且免费的WinForm UI控件库
推荐3款开源、美观且免费的WinForm UI控件库
1877 6
|
12月前
|
C# 数据安全/隐私保护 计算机视觉
C#开发者的新选择:使用ImageSharp进行图像处理
C#开发者的新选择:使用ImageSharp进行图像处理
1390 8
|
12月前
|
设计模式 程序员 C#
C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤
WinForm MDI 模式就像是有超能力一般,让多个子窗体井然有序地排列在一个主窗体之下,既美观又实用。不过,也要小心管理好子窗体们的生命周期哦,否则一不小心就会出现一些意想不到的小bug
919 0
|
开发框架 前端开发 JavaScript
在Winform界面使用自定义用户控件及TabelPanel和StackPanel布局控件
在Winform界面使用自定义用户控件及TabelPanel和StackPanel布局控件
|
C# 数据可视化 开发者
WPF开发者福音:深度解析OxyPlot与LiveCharts图表库,轻松实现数据可视化不再是难题!
【8月更文挑战第31天】在WPF应用中,数据可视化对提升用户体验至关重要。本文介绍并演示了两种流行图表库OxyPlot和LiveCharts的集成与使用方法。OxyPlot是一款适用于.NET应用的开源图表库,提供多种图表类型,易于集成。LiveCharts则以其丰富的图表类型和动画效果,特别适合实时数据展示。通过具体代码示例,本文展示了如何利用这两种图表库创建折线图和柱状图,并详细说明了安装和配置步骤。希望本文能帮助开发者在WPF应用中轻松实现高效、美观的数据可视化。
1127 0