• 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 class TabCtrlX : TabControl
      7     {
      8         public TabCtrlX()
      9         {
     10             InitializeComponent();
     11             this.SetStyle(ControlStyles.UserPaint, true);//用户自己绘制
     12             this.SetStyle(ControlStyles.ResizeRedraw, true);
     13             this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
     14             this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
     15             //让控件支持透明色
     16             this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
     17         }
     18 
     19         #region designer
     20         /// <summary>
     21         /// 必需的设计器变量。
     22         /// </summary>
     23         private System.ComponentModel.IContainer components = null;
     24 
     25         /// <summary> 
     26         /// 清理所有正在使用的资源。
     27         /// </summary>
     28         /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
     29         protected override void Dispose(bool disposing)
     30         {
     31             if (disposing && (components != null))
     32             {
     33                 components.Dispose();
     34             }
     35             base.Dispose(disposing);
     36         }
     37 
     38         #region 组件设计器生成的代码
     39 
     40         /// <summary>
     41         /// 设计器支持所需的方法 - 不要
     42         /// 使用代码编辑器修改此方法的内容。
     43         /// </summary>
     44         private void InitializeComponent()
     45         {
     46             components = new System.ComponentModel.Container();
     47         }
     48 
     49         #endregion
     50         #endregion
     51         //[EditorBrowsable(EditorBrowsableState.Always), Browsable(true)]
     52         public override Color BackColor {
     53             get {
     54                 return Color.FromArgb(Alpha, BgColor);
     55             }
     56             set {
     57                 Alpha = BackColor.A;
     58                 BgColor = BackColor;
     59             }
     60         }
     61 
     62         [DisplayName("Color.Alpha")]
     63         [CategoryAttribute("Color"), DescriptionAttribute("Opacity不透明度0--255")]
     64         [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)]
     65         public byte Alpha { get; set; } = 16;
     66 
     67         [DisplayName("Color.BgColor")]
     68         [CategoryAttribute("Color"), DescriptionAttribute("TabControl工作区背景色")]
     69         [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)]
     70         public Color BgColor { get; set; } = Color.White;
     71 
     72         [DisplayName("Color.BordColor")]
     73         [CategoryAttribute("Color"), DescriptionAttribute("TabControl边线颜色")]
     74         [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)]
     75         public Color BordColor { get; set; } = Color.LightGray;
     76 
     77         [DisplayName("Color.TitleColor")]
     78         [CategoryAttribute("Color"), DescriptionAttribute("TabPage标头背景色")]
     79         [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)]
     80         public Color TitleColor { get; set; } = Color.WhiteSmoke;
     81 
     82         [DisplayName("Color.TitleSeleColor")]
     83         [CategoryAttribute("Color"), DescriptionAttribute("TabPage标头选中背景色")]
     84         [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)]
     85         public Color TitleSeleColor { get; set; } = Color.White;
     86 
     87         [DisplayName("Color.TextColor")]
     88         [CategoryAttribute("Color"), DescriptionAttribute("TabPage标题颜色")]
     89         [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)]
     90         public Color TextColor { get; set; } = Color.Gray;
     91 
     92         [DisplayName("Color.TextSeleColor")]
     93         [CategoryAttribute("Color"), DescriptionAttribute("TabPage选中标题颜色")]
     94         [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)]
     95         public Color TextSeleColor { get; set; } = Color.Black;
     96 
     97         protected override void OnPaint(PaintEventArgs e)
     98         {
     99             this.DrawTitle(e.Graphics);
    100             base.OnPaint(e);
    101             DrawBorder(e.Graphics);
    102         }
    103 
    104         protected void DrawBorder(Graphics g)
    105         {
    106             g.DrawRectangle(new Pen(BordColor, 1F), ClientRectangle);
    107         }
    108 
    109         protected void DrawTitle(Graphics g)
    110         {
    111             StringFormat sf = new StringFormat();
    112             sf.Alignment = StringAlignment.Center;
    113             sf.LineAlignment = StringAlignment.Center;
    114             using (SolidBrush sb = new SolidBrush(SystemColors.Control))
    115             {
    116                 for (int i = 0; i < this.TabPages.Count; i++)
    117                 {
    118                     Rectangle rect = this.GetTabRect(i);
    119                     if (this.SelectedIndex == i)
    120                     {
    121                         sb.Color = TitleSeleColor;
    122                         g.FillRectangle(sb, rect);
    123                         g.DrawString(this.TabPages[i].Text, this.Font, new SolidBrush(TextSeleColor), rect, sf);
    124                     }
    125                     else
    126                     {
    127                         sb.Color = TitleColor;
    128                         g.FillRectangle(sb, rect);
    129                         g.DrawString(this.TabPages[i].Text, this.Font, new SolidBrush(TextColor), rect, sf);
    130                     }
    131                 }
    132             }
    133         }
    134     }
    135 }
    TabCtrlX
     1 using System.ComponentModel;
     2 using System.Drawing;
     3 using System.Windows.Forms;
     4 
     5 namespace RaywindStudio.Components
     6 {
     7 
     8     public partial class DataGViewX : DataGridView
     9     {
    10         public DataGViewX()
    11         {
    12             InitializeComponent();
    13             this.SetStyle(ControlStyles.UserPaint, true);//用户自己绘制
    14             this.SetStyle(ControlStyles.ResizeRedraw, true);
    15             this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
    16             this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
    17             this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
    18         }
    19 
    20         private System.ComponentModel.IContainer components = null;
    21         protected override void Dispose(bool disposing)
    22         {
    23             if (disposing && (components != null))
    24             {
    25                 components.Dispose();
    26             }
    27             base.Dispose(disposing);
    28         }
    29         private void InitializeComponent()
    30         {
    31             components = new System.ComponentModel.Container();
    32         }
    33 
    34         [DescriptionAttribute("自定义背景图:当BackTransparent=True时,忽略此设置,直接使用父容器背景")]
    35         [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)]
    36         public Image BackImage { get; set; }
    37 
    38         [DescriptionAttribute("背景透明:当True时,直接使用父容器背景。否则使用BackImage填充背景")]
    39         [EditorBrowsable(EditorBrowsableState.Always), Browsable(true)]
    40         public bool BackTransparent { get; set; } = true;
    41 
    42         protected override void PaintBackground(Graphics graphics, Rectangle clipBounds, Rectangle gridBounds)
    43         {
    44             base.PaintBackground(graphics, clipBounds, gridBounds);
    45             if(BackTransparent)
    46                 BackImage = GetBackImage(this.Parent, this.Left, this.Top, this.Width, this.Height);
    47             if (BackImage != null)
    48                 graphics.DrawImage(BackImage, clipBounds);
    49         }
    50 
    51         public Bitmap GetBackImage(Control parent, int x, int y, int w, int h)
    52         {
    53             if (parent.BackgroundImage != null)
    54             {
    55                 Bitmap bt = new Bitmap(parent.Width, parent.Height);
    56                 PictureBox pb = new PictureBox();
    57                 pb.Size = parent.Size;
    58                 pb.BackgroundImage = parent.BackgroundImage;
    59                 pb.BackgroundImageLayout = parent.BackgroundImageLayout;
    60                 pb.DrawToBitmap(bt, pb.DisplayRectangle);
    61                 pb.Dispose();
    62                 Bitmap destBitmap = new Bitmap(w, h);
    63                 Graphics g = Graphics.FromImage(destBitmap);
    64                 g.DrawImage(bt, new Rectangle(0, 0, w, h), new Rectangle(x, y, w, h), GraphicsUnit.Pixel);
    65                 bt.Dispose();
    66                 g.Dispose();
    67                 return destBitmap;
    68             }
    69             else
    70                 return null;
    71         }
    72     }
    73 
    74 }
    DataGViewX
  • 相关阅读:
    产品思维和用户思维
    IT界是丽春院?
    凡事要讲究方式方法
    一个比较差的接口定义
    软件开发中的官话和土话
    Frida之app逆向hook,动态插装
    Airtext远程控制多台手机
    linux下使用uwsgi部署flask写的接口遇到的坑
    软件质量管理(六)- 无有规矩不成方圆
    软件质量管理(五)- 质量优异的产品离不开一支优秀的团队
  • 原文地址:https://www.cnblogs.com/leavind/p/6732530.html
Copyright © 2020-2023  润新知