winform实现控件透明(实现真透明)
使用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;}}#endregionpublic 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 Methodsprotected 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实现控件透明(实现真透明)相关推荐
- 半透明窗口中显示标准控件(控件与文字不透明)的实现方案(附源码)
和大家分享一下在半透明窗口中显示标准控件的实现方案.通过层叠窗口可以简单实现半透明与不规则形状窗口的效果,但在其上显示标准控件(控件与文字不透明)却是件比较有挑战的事情,这里会给出一个可行的解决方案. ...
- winform常用控件介绍
winform常用控件介绍 1.窗体 1 2.Label 控件 3 3.TextBox 控件 4 4.RichTextBox控件 5 5.NumericUpDown 控件 7 6.Button 控件 ...
- Winform分页控件之纯分页显示处理
在之前介绍的Winform分页控件中,都以分页控件+显示表格控件作为一个整体性的控件,不可分开,这样做的目的是可以实现更多的操作,集成更多丰富的特性,减少我们开发的工作量,这种情况虽然适用于大多数的情 ...
- VB调用C#写的WinForm.NET控件
点击下载本文配套的演示程序代码http://files.cnblogs.com/xdesigner/VB-CS-WinformControl.zip. 一.前言: 虽然IT开发技术日新月异,不过业界仍 ...
- winform/timer控件/权限设置/三级联动
winform/timer控件/权限设置/三级联动 一.timer控件 组件--timer timer是一个线程,默认可以跨线程访问对象 属性:Enabled--可用性 Interval--间隔时间 ...
- winform上控件太多,绘制时会逐个出现,通常说双缓冲能解决但实际不能解决的问题的解决方法。
winform上控件太多,绘制时会逐个出现,通常说双缓冲能解决但实际不能解决的问题的解决方法. 参考文章: (1)winform上控件太多,绘制时会逐个出现,通常说双缓冲能解决但实际不能解决的问题的解 ...
- 如何在多线程中调用winform窗体控件2——实例篇
如何在多线程中调用winform窗体控件2--实例篇 针对之前文章<如何在多线程中调用winform窗体控件>,下面举个我项目中的实际案例,这是一个我自定义控件在异步设置焦点时的代码.在新 ...
- winform 判断控件有没有被遮挡_编程入门基础之 winform(2)
在编程入门1中,我们通过WINFORM等控件画出了登录界面,我们今天写登录界面的登录按钮事件. 装修预算小程序登录按钮事件 在上图中,我们看到了,有几个判断 ,在C#中,if ,else是作为条件判断 ...
- WinForm皮肤控件(SkinEngine)
WinForm皮肤控件(SkinEngine) 利用 IrisSkin2.dll 所提供的控件 SkinEngine 来为窗体添加皮肤. IrisSkin2.dll 及 皮肤素材,下载地址:http: ...
- C#Winform 实现控件自适应父容器大小
C#Winform 实现控件自适应父容器大小 在日常开发中经常遇到控件不能随着父容器大小的改变而且自动改变控件的所在位置和大小.以下是实现的代码 /// <summary>/// 根据父容 ...
最新文章
- Spring Boot 解决跨域问题的 3 种方案!
- 文件读取getline与fscanf_s
- ECharts的简单使用过程
- python中零碎的一点东西
- Discuz! $_DCACHE数组变量覆盖漏洞
- Thread 线程同步、线程状态
- [ 总结 ] 删除通过find查找到的文件
- VB2010中的MediaPlayer控件在哪?
- 编译原理——设计一个词法分析程序,实现对C程序设计语言的源程序(自定)的词法分析
- 技术胖TypeScript图文视频教程
- 的计算机基本操作知识,电脑的基本操作知识有哪些
- 机器人系统 是局域linux,一种基于命令行接口的机器人测试系统及测试方法
- Spring Boot整合Shiro + Springboot +vue
- php微信生成签名_微信APP支付服务端PHP生成签名
- 银河麒麟V10 开启root登录
- 计算机网络原理实验运城学院,运城学院力学精品课程--实验教学
- J_link无法调试
- Python中级 —— 07标准库
- php date not safe,PHP中date函数date(): It is not safe to rely
- hr背景调查会很详细吗_招聘员工时,HR真的会做背景调查吗?