zoukankan      html  css  js  c++  java
  • Winform 自定义控件

      从事.net工作,拉拉杂杂算在一起,将近5年了,在各种技术群中,总是被问及“想要自定义控件,应该怎么做?”,“想要重绘控件,有什么入门教程没有”一类的问题,虽然很无奈,但是目前我确实没有看到过,最近在做一个ActiveX的同时,也在做一套控件美化,趁现在还没有忘了,把重绘控件的一些新的和方法与大家分享一下。

      首先给大家展示一下系统的类图:

      

      任何一个Windows窗体(这里所说的窗体包括控件,在Windows中,会把Button也识别为一个窗体,和Form略有区别的就是ClassStyle和ClassStyleEx略有区别)想要如何显示,是需要通过绘制来显示出来的,先来做一个基础类,这样各种控件在这个基础上生成。

      今天先做ControlBase类,该类功能如下:文本内容的绘制,字符串的对齐,自定义绘制方法。

      

    /*************************************************************************************
       * CLR版本:        2.0
       * 类 名 称:       Button
       * 机器名称:       Bluefire-PC
       * 命名空间:       Com.Bluefire.ControlCollection.Common.Util
       * 文 件 名:       ControlBase
       * 创建时间:       2012年4月5日
       * 作    者:       Bluefire
       * 说   明: 控件基础
       * 修改时间:
       * 修 改 人:
      *************************************************************************************/
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing;
    using Com.Bluefire.ControlCollection.Common.Properties;
    using System.Drawing.Drawing2D;
    using Com.Bluefire.ControlCollection.Common.Win32Helper;
    
    namespace Com.Bluefire.ControlCollection.Common.Util
    {
        public partial class ControlBase : Control
        {
            #region Event Load
            private event EventHandler m_Load;
            [Browsable(true),
            EditorBrowsable(EditorBrowsableState.Always),
            Category("BluefireEvent"),
            Description("控件显示之前")]
            /// <summary>
            /// 控件文本对齐方式改变
            /// </summary>
            public event EventHandler Load
            {
                add
                {
                    m_Load += value;
                }
                remove
                {
                    m_Load -= value;
                }
            }
    
            protected virtual void OnLoad(EventArgs e)
            {
                EventHandler temp = m_Load;
                if (temp != null)
                {
                    temp(this, e);
                }
            }
    
            #endregion
    
            #region Event TextAlignChanged
            protected virtual Boolean m_PaintText { get; set; }
    
            private event EventHandler m_TextAlignChanged;
            [Browsable(true),
            EditorBrowsable(EditorBrowsableState.Always),
            Category("BluefireEvent"),
            Description("控件文本对齐方式改变")]
            /// <summary>
            /// 控件文本对齐方式改变
            /// </summary>
            public event EventHandler TextAlignChanged
            {
                add
                {
                    m_TextAlignChanged += value;
                }
                remove
                {
                    m_TextAlignChanged -= value;
                }
            }
    
            protected virtual void OnTextAlignChanged(EventArgs e)
            {
                EventHandler temp = m_TextAlignChanged;
                if (temp != null)
                {
                    temp(this, e);
                }
            }
    
            #endregion
    
            #region TextAlign
            private ContentAlignment m_TextAlign = ContentAlignment.MiddleCenter;
    
            [
           DefaultValue(typeof(ContentAlignment), "MiddleCenter"),
           Browsable(true),
           EditorBrowsable(EditorBrowsableState.Always),
           Category("BluefireStyle"),
           Description("控件文本对齐方式")
           ]
            /// <summary>
            /// 控件文本对齐方式
            /// </summary>
            public virtual ContentAlignment TextAlign
            {
                get
                {
                    return m_TextAlign;
                }
                set
                {
                    if (value != m_TextAlign)
                    {
                        m_TextAlign = value;
                        Refresh();
                        OnTextAlignChanged(EventArgs.Empty);
                    }
                }
            }
            #endregion
    
            #region Text
            private string m_Text;
    
    
            [
           DefaultValue(null),
           Browsable(true),
           EditorBrowsable(EditorBrowsableState.Always),
           Category("BluefireStyle"),
           Description("文本内容")
           ]
            /// <summary>
            /// 控件文本
            /// </summary>
            public override string Text
            {
                get
                {
                    return m_Text;
                }
                set
                {
                    if (value != m_Text)
                    {
                        m_Text = value;
                        Refresh();
                        base.OnTextChanged(EventArgs.Empty);
                    }
                }
            }
            #endregion
    
            #region ColorGradientDirection
            private LinearGradientMode m_ColorGradientDirection = LinearGradientMode.Vertical;
            [
            DefaultValue(typeof(LinearGradientMode), "Vertical"),
            Browsable(true),
            EditorBrowsable(EditorBrowsableState.Always),
            Category("BluefireStyle"),
            Description("颜色渐变方向")
            ]
            /// <summary>
            /// 颜色渐变方向
            /// </summary>
            public virtual LinearGradientMode ColorGradientDirection
            {
                get
                {
                    return m_ColorGradientDirection;
                }
                set
                {
                    m_ColorGradientDirection = value;
                    this.Refresh();
                }
            }
            #endregion
    
            #region LightColor
            private Color m_LightColor = StyleManager.BaseLightColor;
    
            [
               DefaultValue(typeof(Color), "110, 255, 255, 255"),
               Browsable(true),
               EditorBrowsable(EditorBrowsableState.Always),
               Category("BluefireStyle"),
               Description("浅色区颜色"),
               RefreshProperties(System.ComponentModel.RefreshProperties.Repaint)
            ]
            /// <summary>
            ///浅色区颜色
            /// </summary>
            public virtual Color LightColor
            {
                get
                {
                    return m_LightColor;
                }
                set
                {
                    if (SystemManagedColor)
                    {
                        throw new ArgumentException("operation is prohibited");
                    }
                    else
                    {
                        m_LightColor = value;
                        Refresh();
                    }
                }
            }
            #endregion
    
            #region DarkColor
            private Color m_DarkColor = StyleManager.BaseColor;
    
            [
               DefaultValue(typeof(Color), "200, 0, 191, 255"),
               Browsable(true),
               EditorBrowsable(EditorBrowsableState.Always),
               Category("BluefireStyle"),
               Description("浅色区颜色")
            ]
            /// <summary>
            ///浅色区颜色
            /// </summary>
            public virtual Color DarkColor
            {
                get
                {
                    return m_DarkColor;
                }
                set
                {
                    if (SystemManagedColor)
                    {
                        throw new ArgumentException("operation is prohibited");
                    }
                    else
                    {
                        m_DarkColor = value;
                        Refresh();
                    }
                }
            }
            #endregion
    
            #region DarkColor
            private IntPtr m_ParentHandle = IntPtr.Zero;
    
            [
            Browsable(false),
            EditorBrowsable(EditorBrowsableState.Never),
            Category("BluefireStyle"),
            Description("父容器句柄")
            ]
            /// <summary>
            ///父容器句柄
            /// </summary>
            public virtual IntPtr ParentHandle
            {
                get
                {
                    return m_ParentHandle;
                }
            }
            #endregion
    
            #region ControlDirection
            private ControlDirection m_ControlDirection = ControlDirection.Horizontal;
    
            [DefaultValue(typeof(ControlDirection), "Horizontal"),
            Browsable(true),
            EditorBrowsable(EditorBrowsableState.Always),
            Category("BluefireStyle"),
            Description("最大值"),
            RefreshProperties(System.ComponentModel.RefreshProperties.Repaint)]
            /// <summary>
            ///最大值
            /// </summary>
            public virtual ControlDirection ControlDirection
            {
                get
                {
                    return m_ControlDirection;
                }
                set
                {
                    if (value != m_ControlDirection)
                    {
                        m_ControlDirection = value;
                        Refresh();
                    }
                }
            }
            #endregion
    
            #region DisLightColor
    
            private Color m_DisLightColor = StyleManager.DisableBaseLightColor;
    
            [DefaultValue(typeof(Color), "110, 255, 255, 255"),
            Browsable(true),
            EditorBrowsable(EditorBrowsableState.Always),
            Category("BluefireStyle"),
            Description("禁用时浅色区颜色"),
            RefreshProperties(System.ComponentModel.RefreshProperties.Repaint)]
            /// <summary>
            ///禁用时浅色区颜色
            /// </summary>
            public virtual Color DisLightColor
            {
                get
                {
                    return m_DisLightColor;
                }
                set
                {
                    if (SystemManagedColor)
                    {
                        throw new ArgumentException("operation is prohibited");
                    }
                    else
                    {
                        m_DisLightColor = value;
                        Refresh();
                    }
                }
            }
            #endregion
    
            #region DisDarkColor
    
            private Color m_DisDarkColor = StyleManager.DisableBaseColor;
    
            [DefaultValue(typeof(Color), "200, 180, 180, 180"),
            Browsable(true),
            EditorBrowsable(EditorBrowsableState.Always),
            Category("BluefireStyle"),
            Description("禁用时深色区颜色"),
            RefreshProperties(System.ComponentModel.RefreshProperties.Repaint)]
            /// <summary>
            ///禁用时深色区颜色
            /// </summary>
            public virtual Color DisDarkColor
            {
                get
                {
                    return m_DisDarkColor;
                }
                set
                {
                    if (SystemManagedColor)
                    {
                        throw new ArgumentException("operation is prohibited");
                    }
                    else
                    {
                        m_DisDarkColor = value;
                        Refresh();
                    }
                }
            }
            #endregion
    
            #region SystemManagedColor
    
            private Boolean m_SystemManagerColor = true;
    
            [DefaultValue(true),
            Browsable(true),
            EditorBrowsable(EditorBrowsableState.Always),
            Category("BluefireStyle"),
            Description("是否让系统管理颜色")]
            /// <summary>
            /// 是否让系统管理颜色
            /// </summary>
            public virtual Boolean SystemManagedColor
            {
                get
                {
                    return m_SystemManagerColor;
                }
                set
                {
                    if (value != m_SystemManagerColor)
                    {
                        m_SystemManagerColor = value;
                        if (value)
                        {
                            ReSetColor();
                        }
                        this.Refresh();
                    }
                }
            }
            #endregion
    
            #region Enable
            [Browsable(false),
            EditorBrowsable(EditorBrowsableState.Never)]
            /// <summary>
            ///是否禁用
            /// </summary>
            public new bool Enabled
            {
                get
                {
                    return Enable;
                }
                set
                {
                    Enable = value;
                }
            }
    
    
            private Boolean m_Enabled = true;
    
            [
               DefaultValue(true),
               Browsable(true),
               EditorBrowsable(EditorBrowsableState.Always),
               Category("BluefireStyle"),
               Description("是否禁用")
            ]
            /// <summary>
            ///是否禁用
            /// </summary>
            public virtual Boolean Enable
            {
                get
                {
                    return m_Enabled;
                }
                set
                {
                    if (value != m_Enabled)
                    {
                        m_Enabled = value;
                        Refresh();
                        OnEnabledChanged(EventArgs.Empty);
                        Enabled = value;
                    }
                }
            }
            #endregion
    
            #region Region
            /// <summary>
            /// 边框类型
            /// </summary>
            [DefaultValue(typeof(RegionSizeType), "NONE"),
            Browsable(false),
            EditorBrowsable(EditorBrowsableState.Never),
            Category("BluefireStyle"),
            Description("边框形状")]
            public virtual RegionSizeType SizeType
            {
                get
                {
                    return this.manager.SizeType;
                }
                set
                {
                    this.manager.SizeType = value;
                }
            }
    
            /// <summary>
            /// ↖大小
            /// </summary>
            [DefaultValue(0),
            Browsable(false),
            EditorBrowsable(EditorBrowsableState.Never),
            Category("BluefireStyle"),
            Description("↖大小")]
            public virtual int LeftTopRadius
            {
                get
                {
                    return this.manager.LeftTopRadius;
                }
                set
                {
                    this.manager.LeftTopRadius = value;
                }
            }
            /// <summary>
            /// ↙大小
            /// </summary>
            [DefaultValue(0),
            Browsable(false),
            EditorBrowsable(EditorBrowsableState.Never),
            Category("BluefireStyle"),
            Description("↙大小")]
            public virtual int LeftButtomRadius
            {
                get
                {
                    return this.manager.LeftButtomRadius;
                }
                set
                {
                    this.manager.LeftButtomRadius = value;
                }
            }
            /// <summary>
            /// ↗大小
            /// </summary>
            [DefaultValue(0),
            Browsable(false),
            EditorBrowsable(EditorBrowsableState.Never),
            Category("BluefireStyle"),
            Description("↗大小")]
            public virtual int RightTopRadius
            {
                get
                {
                    return this.manager.RightTopRadius;
                }
                set
                {
                    this.manager.RightTopRadius = value;
                }
            }
            /// <summary>
            /// ↘大小
            /// </summary>
            [DefaultValue(0),
            Browsable(false),
            EditorBrowsable(EditorBrowsableState.Never),
            Category("BluefireStyle"),
            Description("↘大小")]
            public virtual int RightButtomRadius
            {
                get
                {
                    return this.manager.RightButtomRadius;
                }
                set
                {
                    this.manager.RightButtomRadius = value;
                }
            }
            #endregion
    
            public ControlBase()
            {
                InitializeComponent();
    
                this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw |
                    ControlStyles.UserPaint, true);
                this.DoubleBuffered = true;
                this.ResizeRedraw = true;
                this.SetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick | ControlStyles.Selectable, false);
                m_PaintText = true;
            }
    
            #region 自定义方法
            protected virtual Boolean ReSetColor()
            {
                if (DesignMode)
                {
                    if (MessageBox.Show(Resources.sys_ResetColor, Resources.sys_Caption, MessageBoxButtons.YesNo) == DialogResult.No)
                    {
                        return false;
                    }
                }
                m_LightColor = StyleManager.BaseLightColor;
                m_DarkColor = StyleManager.BaseColor;
                m_DisLightColor = StyleManager.DisableBaseLightColor;
                m_DisDarkColor = StyleManager.DisableBaseColor;
                return true;
            }
    
            protected virtual void PaintRectangle(Graphics graphic, Color basecolor, Color baselightcolor)
            {
                graphic.SmoothingMode = SmoothingMode.HighQuality;
                graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
                switch (m_ColorGradientDirection)
                {
                    case LinearGradientMode.BackwardDiagonal:
                        {
                            LinearGradientBrush brushtop = new LinearGradientBrush(this.ClientRectangle,
                                baselightcolor, basecolor, LinearGradientMode.BackwardDiagonal);
                            graphic.FillRectangle(brushtop, this.ClientRectangle);
                        }
                        break;
                    case LinearGradientMode.ForwardDiagonal:
                        {
                            LinearGradientBrush brushtop = new LinearGradientBrush(this.ClientRectangle,
                                baselightcolor, basecolor, LinearGradientMode.ForwardDiagonal);
                            graphic.FillRectangle(brushtop, this.ClientRectangle);
                        }
                        break;
                    case LinearGradientMode.Horizontal:
                        {
                            int leftwidth = this.Width / 2;
                            int rightwidth = this.Width - leftwidth;
    
                            Rectangle rectleft = new Rectangle(0, 0, leftwidth,
                                this.Height);
                            Rectangle rectright = new Rectangle(leftwidth, 0,
                                rightwidth, Height);
                            LinearGradientBrush brushleft = new LinearGradientBrush(rectleft,
                               baselightcolor, basecolor, LinearGradientMode.Horizontal);
                            LinearGradientBrush brushrigth = new LinearGradientBrush(rectright,
                                basecolor, baselightcolor, LinearGradientMode.Horizontal);
                            graphic.FillRectangle(brushrigth, rectright);
                            graphic.FillRectangle(brushleft, rectleft);
                        }
                        break;
                    case LinearGradientMode.Vertical:
                        {
                            int topheight = this.Height / 2;
                            int buttomheight = this.Height - topheight;
    
                            Rectangle recttop = new Rectangle(0, 0, this.Width,
                                topheight);
                            Rectangle rectbuttom = new Rectangle(0, topheight,
                                this.Width, buttomheight);
                            LinearGradientBrush brushtop = new LinearGradientBrush(recttop, baselightcolor, basecolor, LinearGradientMode.Vertical);
                            LinearGradientBrush brushbuttom = new LinearGradientBrush(rectbuttom, basecolor, baselightcolor, LinearGradientMode.Vertical);
                            graphic.FillRectangle(brushbuttom, rectbuttom);
                            graphic.FillRectangle(brushtop, recttop);
                        }
                        break;
                }
            }
    
            protected virtual void PaintRectangle(Graphics graphic, Color basecolor, Color baselightcolor, Rectangle rect)
            {
                if (rect.Width == 0 || rect.Height == 0)
                {
                    return;
                }
                graphic.SmoothingMode = SmoothingMode.HighQuality;
                graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
                switch (m_ColorGradientDirection)
                {
                    case LinearGradientMode.BackwardDiagonal:
                        {
                            LinearGradientBrush brushtop = new LinearGradientBrush(rect,
                                baselightcolor, basecolor, LinearGradientMode.BackwardDiagonal);
                            graphic.FillRectangle(brushtop, rect);
                        }
                        break;
                    case LinearGradientMode.ForwardDiagonal:
                        {
                            LinearGradientBrush brushtop = new LinearGradientBrush(rect,
                                baselightcolor, basecolor, LinearGradientMode.ForwardDiagonal);
                            graphic.FillRectangle(brushtop, rect);
                        }
                        break;
                    case LinearGradientMode.Horizontal:
                        {
                            float leftwidth = rect.Width / 2;
                            float rightwidth = rect.Width - leftwidth;
    
                            RectangleF rectleft = new RectangleF(rect.X, rect.Y, leftwidth,
                                rect.Height);
                            RectangleF rectright = new RectangleF(leftwidth, rect.Y,
                                rightwidth, rect.Height);
                            LinearGradientBrush brushleft = new LinearGradientBrush(rectleft,
                               baselightcolor, basecolor, LinearGradientMode.Horizontal);
                            LinearGradientBrush brushrigth = new LinearGradientBrush(rectright,
                                basecolor, baselightcolor, LinearGradientMode.Horizontal);
                            graphic.FillRectangle(brushrigth, rectright);
                            graphic.FillRectangle(brushleft, rectleft);
                        }
                        break;
                    case LinearGradientMode.Vertical:
                        {
                            float topheight = rect.Height / 2;
                            float buttomheight = rect.Height - topheight;
    
                            RectangleF recttop = new RectangleF(rect.X, rect.Y, rect.Width,
                                topheight);
                            RectangleF rectbuttom = new RectangleF(rect.X, rect.Y + topheight,
                                rect.Width, buttomheight);
                            LinearGradientBrush brushtop = new LinearGradientBrush(recttop, baselightcolor, basecolor, LinearGradientMode.Vertical);
                            LinearGradientBrush brushbuttom = new LinearGradientBrush(rectbuttom, basecolor, baselightcolor, LinearGradientMode.Vertical);
                            graphic.FillRectangle(brushbuttom, rectbuttom);
                            graphic.FillRectangle(brushtop, recttop);
                        }
                        break;
                }
            }
    
            protected virtual void PaintRectangle(Graphics graphic, Color basecolor, Color baselightcolor, Rectangle rect, LinearGradientMode mode)
            {
                if (rect.Width == 0 || rect.Height == 0)
                {
                    return;
                }
                graphic.SmoothingMode = SmoothingMode.HighQuality;
                graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
                switch (mode)
                {
                    case LinearGradientMode.BackwardDiagonal:
                        {
                            LinearGradientBrush brushtop = new LinearGradientBrush(rect,
                                baselightcolor, basecolor, LinearGradientMode.BackwardDiagonal);
                            graphic.FillRectangle(brushtop, rect);
                        }
                        break;
                    case LinearGradientMode.ForwardDiagonal:
                        {
                            LinearGradientBrush brushtop = new LinearGradientBrush(rect,
                                baselightcolor, basecolor, LinearGradientMode.ForwardDiagonal);
                            graphic.FillRectangle(brushtop, rect);
                        }
                        break;
                    case LinearGradientMode.Horizontal:
                        {
                            float leftwidth = rect.Width / 2;
                            float rightwidth = rect.Width - leftwidth;
    
                            RectangleF rectleft = new RectangleF(rect.X, rect.Y, leftwidth,
                                rect.Height);
                            RectangleF rectright = new RectangleF(leftwidth, rect.Y,
                                rightwidth, rect.Height);
                            LinearGradientBrush brushleft = new LinearGradientBrush(rectleft,
                               baselightcolor, basecolor, LinearGradientMode.Horizontal);
                            LinearGradientBrush brushrigth = new LinearGradientBrush(rectright,
                                basecolor, baselightcolor, LinearGradientMode.Horizontal);
                            graphic.FillRectangle(brushrigth, rectright);
                            graphic.FillRectangle(brushleft, rectleft);
                        }
                        break;
                    case LinearGradientMode.Vertical:
                        {
                            float topheight = rect.Height / 2;
                            float buttomheight = rect.Height - topheight;
    
                            RectangleF recttop = new RectangleF(rect.X, rect.Y, rect.Width,
                                topheight);
                            RectangleF rectbuttom = new RectangleF(rect.X, rect.Y + topheight,
                                rect.Width, buttomheight);
                            LinearGradientBrush brushtop = new LinearGradientBrush(recttop, baselightcolor, basecolor, LinearGradientMode.Vertical);
                            LinearGradientBrush brushbuttom = new LinearGradientBrush(rectbuttom, basecolor, baselightcolor, LinearGradientMode.Vertical);
                            graphic.FillRectangle(brushbuttom, rectbuttom);
                            graphic.FillRectangle(brushtop, recttop);
                        }
                        break;
                }
            }
            protected virtual void PaintRectangle(Graphics graphic, Color basecolor, Color baselightcolor, RectangleF rect, LinearGradientMode mode)
            {
                if (rect.Width == 0 || rect.Height == 0)
                {
                    return;
                }
                graphic.SmoothingMode = SmoothingMode.HighQuality;
                graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
                switch (mode)
                {
                    case LinearGradientMode.BackwardDiagonal:
                        {
                            LinearGradientBrush brushtop = new LinearGradientBrush(rect,
                                baselightcolor, basecolor, LinearGradientMode.BackwardDiagonal);
                            graphic.FillRectangle(brushtop, rect);
                        }
                        break;
                    case LinearGradientMode.ForwardDiagonal:
                        {
                            LinearGradientBrush brushtop = new LinearGradientBrush(rect,
                                baselightcolor, basecolor, LinearGradientMode.ForwardDiagonal);
                            graphic.FillRectangle(brushtop, rect);
                        }
                        break;
                    case LinearGradientMode.Horizontal:
                        {
                            float leftwidth = rect.Width / 2;
                            float rightwidth = rect.Width - leftwidth;
    
                            RectangleF rectleft = new RectangleF(rect.X, rect.Y, leftwidth,
                                rect.Height);
                            RectangleF rectright = new RectangleF(leftwidth, rect.Y,
                                rightwidth, rect.Height);
                            LinearGradientBrush brushleft = new LinearGradientBrush(rectleft,
                               baselightcolor, basecolor, LinearGradientMode.Horizontal);
                            LinearGradientBrush brushrigth = new LinearGradientBrush(rectright,
                                basecolor, baselightcolor, LinearGradientMode.Horizontal);
                            graphic.FillRectangle(brushrigth, rectright);
                            graphic.FillRectangle(brushleft, rectleft);
                        }
                        break;
                    case LinearGradientMode.Vertical:
                        {
                            float topheight = rect.Height / 2;
                            float buttomheight = rect.Height - topheight;
    
                            RectangleF recttop = new RectangleF(rect.X, rect.Y, rect.Width,
                                topheight);
                            RectangleF rectbuttom = new RectangleF(rect.X, rect.Y + topheight,
                                rect.Width, buttomheight);
                            LinearGradientBrush brushtop = new LinearGradientBrush(recttop, baselightcolor, basecolor, LinearGradientMode.Vertical);
                            LinearGradientBrush brushbuttom = new LinearGradientBrush(rectbuttom, basecolor, baselightcolor, LinearGradientMode.Vertical);
                            graphic.FillRectangle(brushbuttom, rectbuttom);
                            graphic.FillRectangle(brushtop, recttop);
                        }
                        break;
                }
            }
    
            protected virtual void PaintText(Graphics graphic)
            {
                #region Text
                if (!m_PaintText)
                {
                    return;
                }
                SizeF size = graphic.MeasureString(this.Text, this.Font);
    
                PointF location = new PointF(this.Width / 2.0F - size.Width / 2.0F, this.Height / 2.0F - size.Height / 2.0F);
    
                switch (m_TextAlign)
                {
                    case ContentAlignment.BottomCenter:
                        location = new PointF(this.Width / 2.0F - size.Width / 2.0F, this.Height - size.Height - 3);
                        break;
                    case ContentAlignment.BottomLeft:
                        location = new PointF(3, this.Height - size.Height - 3);
                        break;
                    case ContentAlignment.BottomRight:
                        location = new PointF(this.Width - size.Width, this.Height - size.Height - 3);
                        break;
                    case ContentAlignment.MiddleCenter:
                        location = new PointF(this.Width / 2.0F - size.Width / 2.0F, this.Height / 2.0F - size.Height / 2.0F);
                        break;
                    case ContentAlignment.MiddleLeft:
                        location = new PointF(3, this.Height / 2.0F - size.Height / 2.0F);
                        break;
                    case ContentAlignment.MiddleRight:
                        location = new PointF(this.Width - size.Width - 3, this.Height / 2.0F - size.Height / 2.0F);
                        break;
                    case ContentAlignment.TopCenter:
                        location = new PointF(this.Width / 2.0F - size.Width / 2.0F, 3);
                        break;
                    case ContentAlignment.TopLeft:
                        location = new PointF(3, 3);
                        break;
                    case ContentAlignment.TopRight:
                        location = new PointF(this.Width - size.Width - 3, 3);
                        break;
                    default:
                        break;
                }
                graphic.DrawString(this.Text, Font, new SolidBrush(this.ForeColor), location);
                #endregion
            }
    
            protected virtual void PaintText(Graphics graphic, string text)
            {
                #region Text
                if (!m_PaintText)
                {
                    return;
                }
                SizeF size = graphic.MeasureString(text, this.Font);
    
                PointF location = new PointF(this.Width / 2.0F - size.Width / 2.0F, this.Height / 2.0F - size.Height / 2.0F);
    
                switch (m_TextAlign)
                {
                    case ContentAlignment.BottomCenter:
                        location = new PointF(this.Width / 2.0F - size.Width / 2.0F, this.Height - size.Height - 3);
                        break;
                    case ContentAlignment.BottomLeft:
                        location = new PointF(3, this.Height - size.Height - 3);
                        break;
                    case ContentAlignment.BottomRight:
                        location = new PointF(this.Width - size.Width, this.Height - size.Height - 3);
                        break;
                    case ContentAlignment.MiddleCenter:
                        location = new PointF(this.Width / 2.0F - size.Width / 2.0F, this.Height / 2.0F - size.Height / 2.0F);
                        break;
                    case ContentAlignment.MiddleLeft:
                        location = new PointF(3, this.Height / 2.0F - size.Height / 2.0F);
                        break;
                    case ContentAlignment.MiddleRight:
                        location = new PointF(this.Width - size.Width - 3, this.Height / 2.0F - size.Height / 2.0F);
                        break;
                    case ContentAlignment.TopCenter:
                        location = new PointF(this.Width / 2.0F - size.Width / 2.0F, 3);
                        break;
                    case ContentAlignment.TopLeft:
                        location = new PointF(3, 3);
                        break;
                    case ContentAlignment.TopRight:
                        location = new PointF(this.Width - size.Width - 3, 3);
                        break;
                    default:
                        break;
                }
                graphic.DrawString(text, Font, new SolidBrush(this.ForeColor), location);
                #endregion
            }
    
            protected virtual void PaintBackGround(Graphics g)
            {
                PaintRectangle(g, Color.FromArgb(110, Color.LightGray), Color.FromArgb(200, Color.White));
                if (m_Enabled)
                {
                    PaintRectangle(g, DarkColor, LightColor);
                }
                else
                {
                    PaintRectangle(g, DisDarkColor, DisLightColor);
                }
            }
    
            protected virtual void SendMessage(uint msg, IntPtr lparam, IntPtr wparam)
            {
                UnsafeMethod.SendMessage(this.Handle, msg, wparam, lparam);
            }
    
            protected virtual void SendMessage(WindowsMessage msg, IntPtr lparam, IntPtr wparam)
            {
                UnsafeMethod.SendMessage(this.Handle, (uint)msg, wparam, lparam);
            }
    
            protected virtual void SetCapture()
            {
                UnsafeMethod.SetCapture(this.Handle);
            }
    
            protected virtual void ReleaseCapture()
            {
                UnsafeMethod.ReleaseCapture();
            }
    
            protected virtual IntPtr WndProc(IntPtr hWnd, WindowsMessage msg, IntPtr lParam, IntPtr wParam)
            {
                if (msg == WindowsMessage.SHOWWINDOW)
                {
                    OnLoad(EventArgs.Empty);
                }
                if (msg == WindowsMessage.LBUTTONDBLCLK)
                {
                    int x = (int)Win32Helper.UnsafeMethod.LOWORD(lParam);
                    int y = (int)Win32Helper.UnsafeMethod.HIWORD(lParam);
                    OnMouseDoubleClick(new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 2, x, y, 0));
                }
                return IntPtr.Zero;
            }
    
            #endregion
    
            protected override void OnParentChanged(EventArgs e)
            {
                base.OnParentChanged(e);
                if (this.Parent == null)
                {
                    m_ParentHandle = IntPtr.Zero;
                }
                else
                {
                    m_ParentHandle = this.Parent.Handle;
                }
            }
    
            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
    
                PaintBackGround(e.Graphics);
    
                PaintText(e.Graphics);
            }
    
            protected override void WndProc(ref Message m)
            {
                IntPtr resualt = WndProc(m.HWnd, (WindowsMessage)m.Msg, m.LParam, m.WParam);
                if (resualt == new IntPtr(2))
                {
                    m.Result = new IntPtr(1);
                    return;
                }
                base.WndProc(ref m);
            }
    
        }
    
        public enum ControlDirection : uint
        {
            None = 0x00,
            /// <summary>
            /// 竖向
            /// </summary>
            Vertical = 0x01,
            /// <summary>
            /// 横向
            /// </summary>
            Horizontal = 0x02,
        }
    }
    

      

      

  • 相关阅读:
    树状数组 浅显学习
    主席树 浅显学习
    B
    python测试开发面试之深浅拷贝
    2020年全网最全的自动化测试面试题及答案--吊打面试官就靠它了!
    软件测试员这个工作怎么样?做软件测试员这个职业有什么好处吗?
    软件测试能干到多少岁?写给像我相同迷茫的人
    python+requests实现接口自动化
    Python+selenium自动化测试之浏览器基础操作
    如何用 Python 做自动化测试【进阶必看】
  • 原文地址:https://www.cnblogs.com/Coolfire/p/2436029.html
Copyright © 2011-2022 走看看