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图片的解析,可直接从网上查找相关资料
相关文章
|
1月前
Winform使用PictureBox控件显示图片并且自适应
Winform使用PictureBox控件显示图片并且自适应
35 0
|
Windows
Winform控件Button及控件的鼠标事件介绍
按钮控件是最常用的,用于实现点击完成操作。其主要处理的就是鼠标点击Click事件。由此可以引发出所有与鼠标有关的事件.....
1122 0
Winform控件Button及控件的鼠标事件介绍
|
C#
【WPF】使用Popup控件做浮窗/提示框
原文:【WPF】使用Popup控件做浮窗/提示框 需求:当鼠标移入某个区域时,弹出一个浮窗,以便用户进行下一步操作。 效果如下图: 当鼠标移入左上角的【多选显示】框内,出现下面的浮窗(悬浮在原UI之上)。
4186 0
|
C#
用WPF实现在ListView中的鼠标悬停Tooltip显示
原文:用WPF实现在ListView中的鼠标悬停Tooltip显示 一、具体需求描述     在WPF下实现,当鼠标悬停在ListView中的某一元素的时候能弹出一个ToolTip以显示需要的信息。 二、代码实现 在.XMAL文件中   Code   在listview 元素中加入ItemContainerStyle="{StaticResource InfoTipStyle}" 如下所示代码: Code   三、心得     调用顺序就是listview呈现出预定的style, InfoTipStyle 调用声明好的tooltip。
1740 0
|
前端开发 C# 容器
WPF实现滚动显示的TextBlock
原文:WPF实现滚动显示的TextBlock   在我们使用TextBlock进行数据显示时,经常会遇到这样一种情况就是TextBlock的文字内容太多,如果全部显示的话会占据大量的界面,这是我们就会只让其显示一部分,另外的一部分就让其随着时间的推移去滚动进行显示,但是WPF默认提供的TextBlo...
2276 0
|
C#
【WPF】自定义形状的按钮Button
原文:【WPF】自定义形状的按钮Button 需求:做一个如下图所示的多边形按钮。 Points点从左上角(0, 0)点开始,顺时针绘制,最后回到原点完成封闭的图形。
1668 0
|
C#
关于wpf中popup跟随鼠标移动显示
原文:关于wpf中popup跟随鼠标移动显示 最近在做一个画图工具,里面有一个功能是需要实现,当鼠标移动的时候在,鼠标的旁边显示坐标信息。 第一反应是想到了tooltip,但是tooltip有许多的限制,查询资料的过程中看到了popup,popup比tooltip更加灵活,下面讲讲tooltip跟popup的区别: 1.tooltip会自动显示,自动隐藏,而popup则需要设置IsOpen属性,并且在Popup.StaysOen属性为true时,Popup控件会一直显示,直到显式地将IsOpen属性设置为False。
1912 0
|
C#
WPF中Popup等弹窗的位置不对(偏左或者偏右)
原文:WPF中Popup等弹窗的位置不对(偏左或者偏右) 1.情况如图:    正常情况:         部分特殊情况:        在一般的电脑都能正确显示,就是第一种情况,同样的代码为什么在不同的电脑就会显示不同的位置呢,原来Windows为了满足 不同需求的用户,左撇子和右撇子,就...
1804 0
|
C# 容器 前端开发
WPF: 实现 ScrollViewer 滚动到指定控件处
原文:WPF: 实现 ScrollViewer 滚动到指定控件处 在前端 UI 开发中,有时,我们会遇到这样的需求:在一个 ScrollViewer 中有很多内容,而我们需要实现在执行某个操作后能够定位到其中指定的控件处;这很像在 HTML 页面中点击一个链接后定位到当前网页上的某个 anchor。
1574 0