winform实现控件透明(实现真透明)

Winform控件背景透明实现原理与解决方案 UI开发中的透明效果实现是界面设计的关键技术之一,其核心原理涉及图形渲染和层级合成机制。在Winform框架中,透明效果通过背景复制机制实现,这与现代UI框架的Alpha通道透明有本质区别。从技术实现角度看,Winform控件的Color.Transparent实际上是将父控件背景作为当前控件背景,这种伪透明机制在工程实践中需要特别注意父子控件关系和绘制顺序。典型应用场景包括透明按钮实现、多控件叠加时的穿透问题处理等。针对Button控件的透明化,需要同时配置FlatStyle、BorderSize等多个属 阅读详情
AI摘要

本文介绍了一种在Windows Forms应用程序中实现控件透明效果的方法。通过创建自定义基类CYBaseControl,不仅实现了控件的透明背景,还提供了旋转功能,并确保了控件后面的内容可见。此外,还演示了如何使用该基类创建一个具体的透明矩形控件。

使用BackColor=Color.Translate这种方法只能实现和背景色一样但是不是真的透明,控件后面的控件还是看不到

1.首先写一个基类

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;
 
namespace CYControls
{
    /// <summary>
    /// 提供透明和旋转功能的基础控件
    /// </summary>
    public class CYBaseControl : Control
    {
        private float _iBorderThickness = 1f;
        private float _iOpacity = 1f;
        private Brush _brushBg = null;
        private Pen _penFg = null;
 
        public CYBaseControl()
        {
            this.SetStyle(ControlStyles.SupportsTransparentBackColor |
                ControlStyles.Opaque, true);
            this.BackColor = Color.Transparent;
            BackgroundBrush = Brushes.Transparent;
            ForegroundPen = Pens.Black;
        }
 
        #region Propertys
        #region HideParent
        [Browsable(false)]
        [EditorBrowsable(EditorBrowsableState.Never)]
        public override string Text
        {
            get { return base.Text; }
            set { base.Text = value; }
        }
 
        [Browsable(false)]
        [EditorBrowsable(EditorBrowsableState.Never)]
        public override Image BackgroundImage
        {
            get { return base.BackgroundImage; }
            set { base.BackgroundImage = value; }
        }
 
        [Browsable(false)]
        [EditorBrowsable(EditorBrowsableState.Never)]
        public override ImageLayout BackgroundImageLayout
        {
            get
            {
                return base.BackgroundImageLayout;
            }
            set
            {
                base.BackgroundImageLayout = value;
            }
        }
        #endregion
 
        public override Color BackColor
        {
            get
            {
                return base.BackColor;
            }
            set
            {
                base.BackColor = value;
                ResetBgBrush();
            }
        }
 
        //[EditorAttribute(typeof(BrushTypeEditor), typeof(System.Drawing.Design.UITypeEditor))]  
        //public double Background
        //{
        //    get;
        //    set;
        //}
 
        public override Color ForeColor
        {
            get
            {
                return base.ForeColor;
            }
            set
            {
                base.ForeColor = value;
                ResetFgPen();
            }
        }
 
        public float BorderThickness
        {
            get { return _iBorderThickness; }
            set
            {
                if (value < 0)
                {
                    throw new Exception("Out off range");
                }
                _iBorderThickness = value;
                ResetFgPen();
                ResetDrawRect();
            }
        }
 
        public virtual float RotateAngle
        {
            get;
            set;
        }
 
 
        public float Opacity
        {
            get { return _iOpacity; }
            set
            {
                if (value > 1 || value < 0)
                {
                    throw new Exception("Out of range,the Value be in [0,1]");
                }
                else
                {
                    _iOpacity = value;
                    ResetBrushes();
                }
            }
        }
 
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle = 0x20;
                return cp;
            }
        }
 
        protected virtual Brush BackgroundBrush
        {
            get { return _brushBg; }
            set { _brushBg = value; }
        }
 
        protected virtual Pen ForegroundPen
        {
            get { return _penFg; }
            set { _penFg = value; }
        }
 
        protected virtual RectangleF DrawRect
        {
            get;
            set;
        }
        #endregion
 
        #region Methods
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
        }
 
        protected override void OnSizeChanged(EventArgs e)
        {
            base.OnSizeChanged(e);
            ResetDrawRect();
        }
        protected override void OnPaddingChanged(EventArgs e)
        {
            base.OnPaddingChanged(e);
            ResetDrawRect();
        }
 
        protected void ResetBrushes()
        {
            ResetBgBrush();
            ResetFgPen();
        }
 
        protected void ResetBgBrush()
        {
            BackgroundBrush = new SolidBrush(GetOpacityColor(BackColor, Opacity));
        }
 
        protected void ResetFgPen()
        {
            ForegroundPen = new Pen(GetOpacityColor(ForeColor, Opacity), BorderThickness);
        }
 
        protected Color GetOpacityColor(Color baseColor, float op)
        {
            return Color.FromArgb(Convert.ToInt32(op * baseColor.A), baseColor);
        }
 
        private void ResetDrawRect()
        {
            float dbwidth = 2 * BorderThickness;
            float halfwidth = BorderThickness / 2;
            int paddingWhith = Padding.Left +  Padding.Right;
            int paddingHeight = Padding.Top  + Padding.Bottom;
            if (dbwidth > Width - paddingWhith || dbwidth > Height - paddingHeight)
            {
                DrawRect = this.Bounds;
            }
            else
            {
                DrawRect = new RectangleF(Padding.Left  + halfwidth,
                    Padding.Top +  halfwidth,
                    Width - BorderThickness - paddingWhith,
                    Height - BorderThickness - paddingHeight);
            }
        }
        #endregion
    }
}

2.创建RectangleShape

public class RectangleShape:CYBaseControl
{
    protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
    {
        base.OnPaint(e);
        e.Graphics.FillRectangle(BackgroundBrush,this.ClientRectangle);
        e.Graphics.DrawRectangle(ForegroundPen,Rectangle.Round(this.DrawRect));
    }
}

3.应用实例

RectangleShape recS=new RectangleShape ();
recS.Name="TestShape";
recS.Height=100;
recS.Width=100;
recS.BackColor=Color.Transparent;
recS.Location=new Point(0,0);
//设置透明度
recS.Opacity=0.5F;
//把自定义的这个控件添加到需要的容器中
**.Controls.Add(recS);

Winform开发必看:C#中Label控件透明背景的3种实现方式(附完整代码) 本文详细介绍了在Winform开发中实现C# Label控件透明背景的3种方法,包括基础方案、高级方案和创新方案,每种方法都附有完整代码示例。特别适合需要提升界面设计效果的开发者,涵盖透明设置、Graphics绘制等关键技术点,帮助解决实际开发中的常见问题。 阅读详情

相关推荐

C# Winform控件贴透明png图片遇到的问题

C# winform两个控件贴png透明图片后,两个控件有重叠部分,重叠部分不透明。

野百合的专栏 1万+

C# Winfrom设置button控件透明

【代码】C# Winfrom设置button控件透明。

余道长的博客 2092

C# WinForm 自定义控件,DataGridView背景透明,TabControl背景透明

注意: 以下代码,属性直接赋值的语法糖要vs2015以上才支持。 1 using System.ComponentModel; 2 using System.Drawing; 3 using System.Windows.Forms; 4 namespace RaywindStudio.Components 5 { 6 public ...

weixin_34092455的博客 3784

Winform 自定义控件背景色设置为透明

1.首先先设置当前自定义控件支持背景色透明,在设置当前控件绘制为不透明,且不绘制背景。所以这里还需要重写 CreateParams , 如下。这个时候显示出来的效果如图。

m0_51005282的博客 2766

3种方案对比!C# Winform控件透明化实战

本文介绍了在Winform中实现控件透明化的三种方法:基础透明、父控件继承和PNG图片透明。基础透明通过设置按钮的FlatStyle和BackColor属性实现;父控件继承通过改变按钮的Parent属性,使其继承父控件的背景;PNG图片透明则利用PNG图片的透明通道实现。文章还指出了常见的陷阱,如忘记设置FlatStyle、父控件未透明化以及误用窗体透明度,并提供了解决方案。此外,还分享了一些高级技巧,如使用Panel统一管理透明控件、实现动态透明度效果以及自定义绘制透明按钮。通过这些方法,开发者可以灵活地

java专栏 1304

C# Winform透明Label实现及应用教程

C# Winform应用是一种在Windows操作系统上开发的图形用户界面应用程序。它利用.NET Framework的强大功能,提供了一套丰富的UI控件,使得开发者可以快速构建出功能丰富、外观精美的桌面应用。Winform应用在企业软件、工具和小型游戏中得到了广泛应用,尤其适合那些对系统资源要求不是特别高的应用程序。在本章节中,我们将深入探讨如何在 C# Winform 应用中实现一个透明的 Label 控件。通过自定义控件,我们可以获得更多的功能和灵活性,而透明效果是用户界面设计中常见的需求之一。

weixin_32661831的博客 1206

Winform透明控件

最新做一个项目,使用的是Winform,碰到一个问题,需要在后台执行某项任务的时候,画面显示“处理中”这样的半透明遮罩,Web项目中可以使用DIV(Css半透明),或者Wpf项目的话本身控件支持真透明(直接与DirectX进行交互),而Winform本身控件并不支持真正的透明,经过各种调查还是...

chuangxian3510的博客 717

WinForm 实现半透明控件

半透明控件,包括直线,矩形,五角星等简单图形,还有实现了图片控件的半透效果

如何用C#写一个透明控件?(WinForm程序)

<br />首先先从System.Windows.Forms.Panel 继承一个自定义控件,然后在控件的构造函数中添加下面的代码 :<br />SetStyle(ControlStyles.UserPaint, true);<br />SetStyle(ControlStyles.SupportsTransparentBackColor, true);<br />this.BackColor = Color.Transparent;<br /> <br />其中调用SetStyle函数进行设置Contro

漫步天涯-IT 5190

C# winform 透明Panel

C# winform 透明Panel ,可以当一个隐藏的按钮使用,写个关闭程序的功能,或者其他功能

C#WinForm开发:将控件背景色设置为透明

以pictureBox控件上label控件为例,设置label控件的背景色透明,可以看到pictureBox控件的背景色。

在透明窗体上显示标准Winform控件

透明窗体指的是利用UpdateLayeredWindows函数完成窗体绘制过程的特殊窗体,采用这种技术的最大优势在于支持含Alpha通道的PNG格式图片作为背景图,从而得到非常漂亮的异型窗体。可惜的是这种窗体与Winform体系的本质冲突导致其不能与标准Winform控件共同工作。Google到的解决方案多是使用双窗体来解决,不过本着技术研究的精神,我尝试设计了另一种让此二者共存的方案。 Winform绘图过程简要分析控件在两种情况下需要调用绘制过程,一:遮挡物移开了;二:自身的视觉相关属性发生变化。这两个

zjarcher的专栏 2957

ESP32学习,驱动LED点阵屏,SD卡播放GIF动图

搬运就可以实现效果,如果有不足,请批评指正。下步该学一下如何文章上视频了,老是截图不方便展示效果。

u011625956的博客 1868

C# Winform 中真正意义的透明控件

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33777877的博客 1694

2023-12-26~2025-07-04备份

一、海康视觉与汇川机器人 服务器-客户端通信设置IP在同一网段名称IP端口类型海康相机工控机7930服务器机器人3000客户端海康VM服务器设置1通信管理 增添TCP服务端,设置本机IP:192.168.0.20,端口号79302 协议解析 通信双方约定通信格式(设置收发数据格式,分隔符)机器人客户端设置(不同类型机器人设置有差别)1 通讯服务设置 设置连接服务器IP、服务端端口号、机器人端口号,确保连接正常2 协议解析 使用指令代码构建通讯解析。

青铜小码农 3126

使用STM32微控制器实现光电传感器的接口和数据处理

本文将介绍如何使用STM32微控制器实现光电传感器的接口和数据处理的方案,包括硬件设计、引脚配置、数据采集、滤波和阈值判断等关键步骤,并给出相应的代码示例。本文将介绍如何使用STM32微控制器实现光电传感器的接口和数据处理的方案,包括硬件设计、引脚配置、数据采集、滤波和阈值判断等关键步骤,并给出相应的代码示例。在光电传感器的接口和数据处理的实现过程中,要关注系统的性能。在使用STM32微控制器实现光电传感器的接口和数据处理之前,需要设计一个合适的硬件平台。

weixin_66608063的博客 3201

关于透明、半透明winform的实现

前两个月由于项目需要,要求做一个半透明窗体,翻阅了很多网站都不尽人意,在吸取了众家之长后,终于得到了比较满意的答案,效果图如下 直接上代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using

x3230835的博客 5712

为什么PCB设计中的50Ω阻抗如此重要?从USB到以太网的实战解析

本文深入解析了PCB设计中50Ω特征阻抗的核心重要性及其工程权衡起源。文章从传输线理论出发,阐释了阻抗匹配对防止信号反射、确保信号完整性的关键作用,并对比了USB、以太网等不同应用场景的阻抗标准。同时,文章结合实际案例,剖析了在两层板等简单设计中实现精准阻抗控制的难点与实战解决方案。

weixin_29268385的博客 297

winform实现透明控件

前言 由于项目需求需要用到透明控件。但是,winform项目的控件透明都是将父控件的图像绘制成子控件的背景来实现的,这种透明存在很大的问题,不合格。 然后,我想到wpf在透明这块做的比较好,想是不是可以在winform中使用wpf控件来实现,结果发现还是走不通,由于elementhost控件是winform中的控件,而wpf控件必须要用它来承载才能在winform中实现,不合格。 最后,百度发现了...

wf2397108372的博客 7730

RAGFlow 系列教程 第三课:后端服务入口与请求生命周期

本文深入解析RAGFlow v0.25.0后端核心机制,重点介绍了Quart框架选型原因和服务启动流程。RAGFlow选择Quart作为Web框架,主要基于其异步能力对LLM调用的支持、Flask生态兼容性以及长响应超时处理优势。文章详细拆解了服务启动的8个关键步骤,从日志初始化到HTTP服务启动,并分析了配置加载、数据库初始化等核心环节。通过源码分析揭示了RAGFlow如何实现动态API注册、双重认证体系等关键技术点,为深入理解该系统的请求处理生命周期提供了基础。

weixin_43674738的博客 188

YOLOv8改进:基于EfficientNetV2均衡缩放网络的特征提取层优化【YOLOv8】

YOLO(You Only Look Once)系列模型以其高效的实时目标检测能力而闻名。YOLOv8作为该系列的最新版本,通过引入改进的网络结构和算法优化,进一步提升了目标检测的性能。然而,YOLOv8在特征提取阶段的网络结构仍有改进的空间。EfficientNetV2是一种基于均衡缩放的卷积神经网络,它通过优化网络的宽度、深度和分辨率来实现高效的特征提取。与之前的EfficientNet版本相比,EfficientNetV2在速度和精度上都有显著提升,尤其在处理复杂目标检测任务时表现尤为突出。

博客 1582

【亲测免费】 C WinForm开发:实现PictureBox内Label控件背景透明教程

C# WinForm开发:实现PictureBox内Label控件背景透明教程 去发现同类优质开源项目:https://gitcode.com/ 在进行Windows Forms应用开发时,经常需要处理UI的自定义样式,特别是对于控件透明效果的需求。本文通过实例演示如何在C# WinForm应用程序中,使放置于PictureBox上的Label控件背景色变为透明,从而能够透过Label看到其下方P...

gitblog_09767的博客 1262

全网最全-DA14531-全球最小-BLE从入门到精通开发教程

本教程主要适用于低功耗产品,DA14531它体积小,非常适用于对体积敏感的设备,如无线可穿戴、传感器、助听器等设备。本文经过作者发大量时间来记录开发项目的调试方法,里面有许多笔者开发心得体会,旨在让读者工程师快速上手,减少摸索时间,提高软件质量。读者对象本文档主要适用以下工程师:嵌入式系统工程师单片机软件工程师IOT固件工程师BLE固件工程师。

hejinwu1314的博客 5137

Winform控件背景透明原理与Button透明化实战

在Windows窗体应用开发中,控件透明化是提升UI体验的关键技术。从GUI渲染原理来看,Winform通过父控件背景继承机制实现视觉透明效果,这与现代UI框架的Alpha通道透明有本质区别。理解这种基于控件层级的背景复制机制,对解决界面开发中的显示异常问题尤为重要。特别是在Button等标准控件透明化场景中,需要综合运用FlatStyle配置、父容器管理和图像资源处理等技术方案。这些方法不仅适用于常规业务系统开发,也能为游戏界面、仪表盘等需要复杂视觉效果的应用提供技术支持。通过合理使用双缓冲、控件层级管理

weixin_26850069的博客 353

本地构建AI智能分析助手之 05 PandasAI如何MySQL数据库 (教程含源码)

与 PostgreSQL 连接器类似,MySQL 连接器允许您连接到 MySQL 数据库。即使您不熟悉 MySQL 或 PandasAI,它也设计得易于使用。

iCloudEnd的博客 703

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

上一篇: 序列化与反序列化高级应用
下一篇: 线程池强制终止的解决方案
奇点码农
博客等级 码龄19年 60粉丝 140原创
评论 22
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值