Skip to content

CodeSnippet-WinForm

约 2209 字大约 7 分钟

winformCodeSnippet

2023-07-21

winform中,添加控件的顺序影响dock生效的方式,先添加的控件dock方式优先级高 > Dock属性不能放在窗体的构造函数中,最好放在 Load事件中,否则不起效

Cast 用法

int w = listViewEx.Columns.Cast<ColumnHeader>().Sum(s => s.Width);//表头宽度
Controls c = control.Controls.OfType<Control>().FirstOrDefault();//查找控件

圆角

{
    int radius = cornerRadius;//圆角大小
    using (GraphicsPath path = new GraphicsPath())
    {
        path.AddArc(0, 0, radius, radius, 180, 90);
        path.AddArc(panel.Width - radius, 0, radius, radius, 270, 90);
        path.AddArc(panel.Width - radius, panel.Height - radius, radius, radius, 0, 90);
        path.AddArc(0, panel.Height - radius, radius, radius, 90, 90);
        path.CloseAllFigures();

        panel.Region = new Region(path);
    }
}

渐变色绘制

using (var g = e.Graphics)
{
    LinearGradientBrush myLinearGradientBrush = new LinearGradientBrush(e.Bounds, ColorTranslator.FromHtml("#ECF5FF"), ColorTranslator.FromHtml("#CADFFF"), LinearGradientMode.Vertical);
    g.FillRectangle(myLinearGradientBrush, e.Bounds);//背景色
}

效果图

渐变色

ListBox 添加删除项的按钮

ListBox listBox = new ListBox();
//重绘
listBox.DrawItem += (s, e) =>
{
    if (e.Index < 0) return;
    e.Graphics.DrawString(listBox.Items[e.Index].ToString(), e.Font, new SolidBrush(Color.Black), e.Bounds);
    e.Graphics.DrawString("✕", e.Font, Brushes.Red, new Rectangle(e.Bounds.Right - 20, e.Bounds.Y, 18, e.Bounds.Height), new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
};

//判断点击到删除
listBox.MouseClick += (s, e) =>
{
    var lb = s as ListBox;
    int index = listBox.IndexFromPoint(e.Location);
    if (index >= 0 && e.X >= listBox.GetItemRectangle(index).Right - 20)
    {
        bool r = credentials.Remove(credentials.Find(t => t.DecUserName == listBox.Items[index].ToString()));
        listBox.Items.RemoveAt(index);
        SaveCredentials(credentials, filepath);
        listBox.Refresh();
    }
}

删除

开启 listview 其他项编辑

//开启listview 其他项编辑
//this.View = View.Details;this.FullRowSelect = true;需要开启整行选择
private void ListViewEx_ItemActivate(object sender, EventArgs e)
        {
            var lv = (ListView)sender;
            if (lv.SelectedItems.Count > 0)
            {
                ListViewItem item = lv.SelectedItems[0];
                if (item != null)
                {
                    // 获取选定项的特定子项(例如第二列)
                    ListViewSubItem subItem = item.SubItems[1];

                    // 显示子项的文本框,以便用户编辑文本
                    Rectangle subItemRect = subItem.Bounds;
                    TextBox subItemEdit = new TextBox();
                    subItemEdit.Text = subItem.Text;
                    subItemEdit.Bounds = subItemRect;
                    subItemEdit.Visible = true;
                    subItemEdit.LostFocus += (ts, te) =>
                    {
                        EditListViewItem((TextBox)ts, subItem);
                    };
                    subItemEdit.KeyDown += (ts, te) =>
                    {
                        if (te.KeyCode == Keys.Enter)
                            EditListViewItem((TextBox)ts, subItem);
                        else if (te.KeyCode == Keys.Escape)
                        {
                            subItemEdit.Text = subItem.Text;
                            subItemEdit.Visible = false;
                        }
                    };
                    lv.Controls.Add(subItemEdit);
                    subItemEdit.Focus();
                }
            }
        }

重绘 ListView

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace DiyControl
{
    public partial class ListViewEx : ListView
    {
        Color borderColor = Color.FromArgb(0, 113, 188);
        Color headerColor = ColorTranslator.FromHtml("#212B42");
        Color back_headerColor = ColorTranslator.FromHtml("#F0F6FD");
        Color o_headerColor = ColorTranslator.FromHtml("#7C828F");
        Color bodyColor = ColorTranslator.FromHtml("#4E576A");
        Color body_rowColor = ColorTranslator.FromHtml("#F6F6F6");

        /// <summary>
        /// 表头
        /// </summary>
        /// <param name="headers">表头数字</param>
        public ListViewEx(List<Tuple<string, int, HorizontalAlignment>> headers)
        {
            InitializeComponent();
            this.View = View.Details;
            this.OwnerDraw = true;
            this.ShowGroups = false;
            this.GridLines = false;
            this.MultiSelect = false;
            this.FullRowSelect = false;
            this.DoubleBuffered = false;
            this.AllowColumnReorder = false;
            this.BorderStyle = BorderStyle.None;
            this.Font = new Font("宋体", 13, FontStyle.Bold); //能控制间隔
            this.HeaderStyle = ColumnHeaderStyle.Nonclickable;

            foreach (var header in headers)
            {
                this.Columns.Add(header.Item1, header.Item2, header.Item3);
            }
        }

        protected override void OnColumnWidthChanging(ColumnWidthChangingEventArgs e)
        {
            e.Cancel = true;
            e.NewWidth = this.Columns[e.ColumnIndex].Width;
            this.EndUpdate();
        }

        protected override void OnDrawColumnHeader(DrawListViewColumnHeaderEventArgs e)
        {
            e.DrawDefault = false;
            using (var g = e.Graphics)
            {
                g.FillRectangle(new SolidBrush(back_headerColor), e.Bounds);//背景色

                using (StringFormat sf = new StringFormat())
                {
                    switch (e.Header.TextAlign)
                    {
                        case HorizontalAlignment.Center:
                            sf.Alignment = StringAlignment.Center;
                            break;
                        case HorizontalAlignment.Right:
                            sf.Alignment = StringAlignment.Far;
                            break;
                    }

                    using (Font headerFont = new Font("宋体", 10f)) //表头
                    {
                        var headrow_bounds = e.Bounds;
                        headrow_bounds.Y = e.Bounds.Y + 5;
                        if (e.ColumnIndex == 0)
                        {
                            g.DrawString(e.Header.Text, new Font("宋体", 11, FontStyle.Bold), new SolidBrush(headerColor), headrow_bounds, sf);
                        }
                        else if (e.ColumnIndex == 5) //更多按钮
                        {
                            if (e.Header.Tag == null) return;

                            PictureBox pictureBox = new PictureBox()
                            {
                                Tag = e.Header.Tag,
                                Cursor = Cursors.Hand,
                                Size = new Size(14, 14),
                                Image = Image.FromFile("Resources/more1.png"),
                                Location = new Point(headrow_bounds.X, headrow_bounds.Y),
                            };
                            this.Controls.Add(pictureBox);
                            pictureBox.Click += PictureBox_Click;
                        }
                        else
                            g.DrawString(e.Header.Text, headerFont, new SolidBrush(o_headerColor), headrow_bounds, sf);

                    }
                }
            }
        }

        public delegate void ClickDetailEventHandler(string name);
        /// <summary>
        /// 点击展示详情事件
        /// </summary>
        public event ClickDetailEventHandler ClickDetailEvent;
        private void PictureBox_Click(object sender, EventArgs e)
        {
            var pic = sender as PictureBox;
            ClickDetailEvent(pic.Tag.ToString());
        }


        protected override void OnDrawSubItem(DrawListViewSubItemEventArgs e)
        {
            TextFormatFlags flags = TextFormatFlags.Left;
            var item_bounds = e.Bounds;
            item_bounds.Y += 3;
            using (var g = e.Graphics)
            using (StringFormat sf = new StringFormat())
            {
                switch (e.Header.TextAlign)
                {
                    case HorizontalAlignment.Center:
                        sf.Alignment = StringAlignment.Center;
                        flags = TextFormatFlags.HorizontalCenter;
                        break;
                    case HorizontalAlignment.Right:
                        sf.Alignment = StringAlignment.Far;
                        flags = TextFormatFlags.Right;
                        break;
                }

                if (e.Header.ListView.Name == "listViewTotal")
                {
                    using (Font subItemFont = new Font("宋体", 11))
                    {
                        g.DrawString(e.SubItem.Text, subItemFont, new SolidBrush(Color.FromArgb(66, 142, 255)), item_bounds, sf);
                    }
                }
                else
                {
                    if (e.Item.Index % 2 == 1)
                        g.FillRectangle(new SolidBrush(body_rowColor), e.Bounds);

                    Font subItemFont = new Font("宋体", 10.2f);
                    if (e.SubItem.Text.Length > 15) subItemFont = new Font("宋体", 9);
                    if (e.ColumnIndex == 4 && e.SubItem.Text.IndexOfAny(new char[] { '+', '↑' }) > -1)
                        g.DrawString(e.SubItem.Text, subItemFont, new SolidBrush(Color.Red), item_bounds, sf);
                    else
                        g.DrawString(e.SubItem.Text, subItemFont, new SolidBrush(bodyColor), item_bounds, sf);
                }
            }
        }

    }
}

效果图 listview

重绘 tabControl

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DiyControl
{
    public partial class TabControlEXDetail : TabControl
    {
        SolidBrush blackBrush = new SolidBrush(Color.Black);
        SolidBrush whiteBrush = new SolidBrush(Color.White);
        SolidBrush checkBrush = new SolidBrush(Color.FromArgb(66, 142, 255));
        float fontsize = 11f;
        public TabControlEXDetail()
        {
            InitializeComponent();
            base.SetStyle(
               ControlStyles.UserPaint |
               ControlStyles.DoubleBuffer |
               ControlStyles.OptimizedDoubleBuffer |
               ControlStyles.AllPaintingInWmPaint |
               ControlStyles.ResizeRedraw |
               ControlStyles.SupportsTransparentBackColor, true);
            base.UpdateStyles();
            this.DrawMode = TabDrawMode.OwnerDrawFixed;
            //this.SizeMode = TabSizeMode.Fixed;  // 大小模式为固定
            //this.ItemSize = new Size(200, 30);   // 设定每个标签的尺寸
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            try
            {
                var g = e.Graphics;
                Rectangle allrect = e.ClipRectangle;
                allrect = new Rectangle(e.ClipRectangle.X - 1, e.ClipRectangle.Y - 1, e.ClipRectangle.Width + 2, e.ClipRectangle.Height + 2);
                g.FillRectangle(whiteBrush, allrect);

                int lastTabIndex = this.TabCount - 1;
                TabPage lastTab = new TabPage();
                var tabrect = this.GetTabRect(lastTabIndex > 0 ? lastTabIndex : 1);
                Rectangle rect = new Rectangle(tabrect.X + tabrect.Width, 2, Width, ItemSize.Height);
                g.FillRectangle(whiteBrush, rect); //填充标签空白处
                //g.DrawImage(Image.FromFile("Resources/close.png"), Width - 100, 5);

                for (int i = 0; i < this.TabCount; i++)
                {
                    var _tab = this.TabPages[i];
                    Rectangle bounds = this.GetTabRect(i);
                    g.FillRectangle(Brushes.White, bounds);
                    using (StringFormat sf = new StringFormat())
                    {
                        sf.Alignment = StringAlignment.Center;
                        sf.LineAlignment = StringAlignment.Center;
                        if (this.SelectedIndex == i)
                        {
                            g.DrawString(_tab.Text, new Font("微软雅黑", fontsize), checkBrush, bounds, sf);
                            g.FillRectangle(checkBrush, bounds.X + 15, bounds.Height - 5, bounds.Width - 30, 2); //选中项下划线
                        }
                        else
                        {
                            g.DrawString(_tab.Text, new Font("微软雅黑", fontsize), blackBrush, bounds, sf);
                        }
                    }
                }
            }
            catch (Exception ex) { }
        }
    }
}

效果图

tabcontrol

    void LoadSetMenuItem()
        {
            MainMenuStrip.Items.Clear();

            ToolStripMenuItem MenuItem;
            MenuItem = AddMenuItem("用户管理", MainMenuStrip.Items);

            MenuItem = AddMenuItem("样本信息设置", MainMenuStrip.Items);
            AddMenuItem("样本基础信息设置", MenuItem.DropDownItems);
            AddMenuItem("样本信息值设置", MenuItem.DropDownItems);

            MenuItem = AddMenuItem("检测项设置", MainMenuStrip.Items);
            AddMenuItem("检测项目组管理", MenuItem.DropDownItems);
            AddMenuItem("检测项管理", MenuItem.DropDownItems);
            AddMenuItem("检测项值管理", MenuItem.DropDownItems);
            AddMenuItem("检测项结果等级管理", MenuItem.DropDownItems);

            MenuItem = AddMenuItem("医生分析设置", MainMenuStrip.Items);
            AddMenuItem("医生分析内容管理", MenuItem.DropDownItems);
            AddMenuItem("医生分析条件管理", MenuItem.DropDownItems);

            MenuItem = AddMenuItem("报告设置", MainMenuStrip.Items);
            AddMenuItem("报告设置", MenuItem.DropDownItems);
            AddMenuItem("报告设计", MenuItem.DropDownItems);

            MenuItem = AddMenuItem("耗材管理", MainMenuStrip.Items);
            AddMenuItem("耗材管理", MenuItem.DropDownItems);
            AddMenuItem("耗材使用记录", MenuItem.DropDownItems);
            AddMenuItem("耗材生产管理", MenuItem.DropDownItems);
            AddMenuItem("耗材类型管理", MenuItem.DropDownItems);

            AddMenuItem("渠道管理", MainMenuStrip.Items);
            AddMenuItem("综合设置", MainMenuStrip.Items);
            AddMenuItem("出厂设置", MainMenuStrip.Items);
            AddMenuItem("数据备份", MainMenuStrip.Items);
            AddMenuItem("日志", MainMenuStrip.Items);
            AddMenuItem("关于", MainMenuStrip.Items);
        }

        public ToolStripMenuItem AddMenuItem(string text, ToolStripItemCollection parentItem)
        {
            ToolStripMenuItem subMenuItem = new ToolStripMenuItem(text);
            subMenuItem.Click += SubMenuItem_Click;
            parentItem.Add(subMenuItem);
            return subMenuItem;
        }
        private void SubMenuItem_Click(object sender, EventArgs e)
        {
            var ClickItem = (ToolStripMenuItem)sender;
            switch (ClickItem.Text)
            {
                case "用户管理":break;
                default: break;
            }
        }

效果图

menustrip

datagridview 基础设置

	//右边固定行,添加操作按钮图片
	 public void CreateHeader()
        {
            dataGridView1.AllowUserToAddRows = false;
            dataGridView1.AutoGenerateColumns = false;
            dataGridView1.AllowUserToResizeRows = false;
            dataGridView1.AllowUserToResizeColumns = false;
            dataGridView1.RowHeadersVisible = false;

            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dataGridView1.MultiSelect = false;
            dataGridView1.BackgroundColor = Color.White;
            dataGridView1.BorderStyle = BorderStyle.None;
            dataGridView1.EnableHeadersVisualStyles = false;
            dataGridView1.CellBorderStyle = DataGridViewCellBorderStyle.None;
            dataGridView1.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None;


            dataGridView1.RowHeadersDefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;

            dataGridView1.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing; //表头高度设置为不可更改
            dataGridView1.ColumnHeadersHeight = 40; //表头高度
            dataGridView1.RowTemplate.Height = 35; //内容行高度
            dataGridView1.RowsDefaultCellStyle.BackColor = Color.White;// 内容背景色;
            dataGridView1.DefaultCellStyle.SelectionBackColor = Color.FromArgb(66, 142, 255);// 选中行背景色
            dataGridView1.AlternatingRowsDefaultCellStyle.BackColor = SysParam.pageBackColor; // 奇数行背景色
            dataGridView1.ColumnHeadersDefaultCellStyle.BackColor = Color.FromArgb(240, 246, 253);//pageBackColor;// 标题栏背景/前景色
            dataGridView1.RowHeadersDefaultCellStyle.SelectionBackColor = Color.FromArgb(66, 142, 255);// 行头 选中行背景色
            dataGridView1.ColumnHeadersDefaultCellStyle.SelectionBackColor = dataGridView1.ColumnHeadersDefaultCellStyle.BackColor;// Color.Transparent; // 选中列背景色
            dataGridView1.ReadOnly = true;

            dataGridView1.CellContentClick += DataGridView1_CellContentClick;

            CreateCol("作", "Del", 25, "image", image: Properties.Resources.del);
            CreateCol("", "Edit", 25, "image", image: Properties.Resources.edit);
            CreateCol("操", "Add", 25, "image", image: Properties.Resources.dgadd);

            CreateCol("启用", "isEnabled", 60, "checkbox");
            CreateCol("预分类编号", "recogCode", 100);
            CreateCol("预分类项目", "isRecog", 100, "checkbox");
            CreateCol("单位", "unit", 60);
            CreateCol("女性最小值", "girlMin", 100);
            CreateCol("女性最大值", "girlMax", 100);
            CreateCol("男性最小值", "manMin", 100);
            CreateCol("男性最大值", "manMax", 100);
            CreateCol("区分性别", "isValueSex", 80, "checkbox");
            CreateCol("默认值", "defaulted", 80);
            CreateCol("值为数字", "isNum", 80, "checkbox");
            CreateCol("控件类型", "controlTypeStr", 90);
            CreateCol("项目分类", "itemsName", 150);
            CreateCol("检测项名称", "itemName", 200);
            CreateCol("检测项编码", "itemCode", 200);
            CreateCol("序号", "id", 60);


            dataGridView1.Columns[0].Frozen = true;
            dataGridView1.Columns[1].Frozen = true;
            dataGridView1.Columns[2].Frozen = true;

            dataGridView1.RightToLeft = RightToLeft.Yes;
            dataGridView1.HorizontalScrollingOffset = dataGridView1.Width;//滚动条
        }

	    /// <summary>
        /// 创建表头
        /// </summary>
        /// <param name="HeaderText">列名称</param>
        /// <param name="PropertyName">列字段名</param>
        /// <param name="width">列宽度</param>
        /// <param name="type">列类型</param>
        /// <param name="visible">是否显示该列</param>
        /// <param name="HeaderFont">表头字体</param>
        /// <param name="DefaultFont">内容字体</param>
    public void CreateCol(string HeaderText, string PropertyName, int width, string type = "text", bool visible = true, Font HeaderFont = null, Font DefaultFont = null, Image image = null)
        {
            if (HeaderFont == null) HeaderFont = new Font("宋体", 10, FontStyle.Bold);
            if (DefaultFont == null) DefaultFont = new Font("宋体", 10);

            DataGridViewColumn dataGridViewColumn = new DataGridViewTextBoxColumn();
            switch (type)
            {
                case "text":
                    dataGridViewColumn = new DataGridViewTextBoxColumn();
                    break;
                case "checkbox":
                    dataGridViewColumn = new DataGridViewCheckBoxColumn();
                    break;
                case "image":
                    dataGridViewColumn = new DataGridViewImageColumn();
                    ((DataGridViewImageColumn)dataGridViewColumn).Image = image;
                    break;
                default: break;
            }
            dataGridViewColumn.HeaderText = HeaderText;
            dataGridViewColumn.Name = PropertyName;
            dataGridViewColumn.DataPropertyName = PropertyName;
            dataGridViewColumn.Width = width;
            dataGridViewColumn.FillWeight = width;
            dataGridViewColumn.HeaderCell.Style.Font = HeaderFont;
            dataGridViewColumn.DefaultCellStyle.Font = DefaultFont;
            dataGridViewColumn.Visible = visible;
            dataGridView1.Columns.Add(dataGridViewColumn);
        }
     private void DataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            CurrentRow = null;
            string cellname = dataGridView1.Columns[e.ColumnIndex].Name;
            if (dataGridView1.SelectedRows.Count <= 0) return;
            SelctRowsToModel();
            switch (cellname)
            {
                case "Add": break;
                case "Edit": break;
                case "Del": break;
                default: break;
            }

效果图

datagirdview

蒙版模态弹窗

    public partial class MsgFrm : Form
    {
        public static MsgFrm msg = null;
        public MsgFrm()
        {
            InitializeComponent();
            this.ControlBox = false;
            this.ShowInTaskbar = false;
            this.FormBorderStyle = FormBorderStyle.None;
            this.StartPosition = FormStartPosition.CenterParent;
            this.BackColor = Color.White;
            this.Paint += MsgFrm_Paint;
        }

        private void MsgFrm_Paint(object sender, PaintEventArgs e)
        {
            using (GraphicsPath path = new GraphicsPath())
            {
                int radius = 3;
                Rectangle rect = new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height);
                path.AddArc(rect.X, rect.Y, radius * 2, radius * 2, 180, 90);
                path.AddArc(rect.X + rect.Width - radius * 2, rect.Y, radius * 2, radius * 2, 270, 90);
                path.AddArc(rect.X + rect.Width - radius * 2, rect.Y + rect.Height - radius * 2, radius * 2, radius * 2, 0, 90);
                path.AddArc(rect.X, rect.Y + rect.Height - radius * 2, radius * 2, radius * 2, 90, 90);

                this.Region = new Region(path);
            }
        }

        public static MsgFrm Instance()
        {
            if (msg == null)
                msg = new MsgFrm();
            return msg;
        }


        public DialogResult Show(string content)
        {
            MsgBox.Instance().Show(Frm_Form1.Frm_Form);
            btn_sure.Visible = false;
            btn_cancel.Visible = false;
            btn_know.Visible = true;
            DialogResult result = DialogResult.Cancel;
            if (content == string.Empty)
            {
                return result;
            }
            lab_showInfo.Text = content;
            result = this.ShowDialog();
            return result;
        }
        public DialogResult Confrim(string content)
        {
            MsgBox.Instance().Show(Frm_Form1.Frm_Form);
            btn_sure.Visible = true;
            btn_cancel.Visible = true;
            btn_know.Visible = false;
            DialogResult result = DialogResult.Cancel;
            if (content == string.Empty)
            {
                return result;
            }
            lab_showInfo.Text = content;
            result = this.ShowDialog();

            return result;
        }
        #region MyRegion

        /// <summary>
        /// 取消
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_cancel_Click(object sender, EventArgs e)
        {
            MsgBox.Instance().Hide();
            this.DialogResult = DialogResult.Cancel;
        }
        /// <summary>
        /// 确定
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btn_sure_Click(object sender, EventArgs e)
        {
            MsgBox.Instance().Hide();
            this.DialogResult = DialogResult.OK;
        }


        private void label1_Click(object sender, EventArgs e)
        {
            MsgBox.Instance().Hide();
            this.Close();
        }
        #endregion
    }

    /// <summary>
    /// 蒙版
    /// </summary>
    public class MsgBox : Form
    {
        public static MsgBox msg = new MsgBox();
        public MsgBox()
        {
            this.Opacity = 0.5;
            this.BackColor = Color.DarkGray;
            this.Dock = DockStyle.Fill;
            this.FormBorderStyle = FormBorderStyle.None;
            this.ShowInTaskbar = false;
            this.TopLevel = true;
            Rectangle workingArea = Screen.GetWorkingArea(this);
            this.Bounds = new Rectangle(workingArea.Left, workingArea.Top, workingArea.Width, workingArea.Height);
        }
        public static MsgBox Instance()
        {
            if (msg == null)
                msg = new MsgBox();
            return msg;
        }
        //public static MsgBox Instance { get => msg == null ? new MsgBox() : msg; }

    }

效果图

mask

TreeView 重绘

  • [[TreeView重绘]]

透明 Panel

   public partial class PanelOpacity : Panel
    {
        public PanelOpacity()
        {
            SetStyle(ControlStyles.Opaque, true);
        }
        private int opacity = 50;
        [Description("透明度0-100"),DefaultValue(50)]
        public int Opacity
        {
            get
            {
                return this.opacity;
            }
            set
            {
                if (value < 0 || value > 100)
                    throw new ArgumentException("值范围 0 - 100");
                this.opacity = value;
            }
        }
        private const int WS_EX_TRANSPARENT = 0x20;
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle = cp.ExStyle | WS_EX_TRANSPARENT;
                return cp;
            }
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            using (var brush = new SolidBrush(Color.FromArgb(this.opacity * 255 / 100, this.BackColor)))
            {
                e.Graphics.FillRectangle(brush, this.ClientRectangle);
            }
        }
    }