SurLabel.cs 3.9 KB
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace Asa.Face
{
    /// <summary>
    /// 标签控件
    /// </summary>
    [DefaultProperty("Text")]
    [DefaultEvent("Click")]
    public partial class SurLabel : BaseCtl
    {
        private bool _foreCus = false;
        private RectangleF _textRect = new RectangleF();
        private HorizontalAlignment _textAlign = HorizontalAlignment.Left;

        /// <summary>
        /// 标签控件
        /// </summary>
        public SurLabel()
        {
            InitializeComponent();
        }

        //==========属性==========
        /// <summary>
        /// 显示的文本的对齐方式
        /// </summary>
        [Browsable(true), Category(""), Description("显示的文本的对齐方式"), DefaultValue(HorizontalAlignment.Left)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public HorizontalAlignment TextAlign
        {
            set
            {
                _textAlign = value;
                CalcSize();
                Refresh();
            }
            get
            {
                return _textAlign;
            }
        }

        /// <summary>
        /// 前景色是否自定义,通过ForeColor指定
        /// </summary>
        [Browsable(true), Category(""), Description("前景色是否自定义,通过ForeColor指定"), DefaultValue(false)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public bool ForeColorCustom
        {
            set
            {
                _foreCus = value;
                Refresh();
            }
            get
            {
                return _foreCus;
            }
        }

        //==========私有==========
        /// <summary>
        /// 计算位置大小
        /// </summary>
        protected override void CalcSize()
        {
            base.CalcSize();
            SizeF sf = CreateGraphics().MeasureString(Text, Font, Width);

            switch (TextAlign)
            {

                case HorizontalAlignment.Left:
                    _textRect = new RectangleF(BorderWidth, (Height - sf.Height) / 2f, sf.Width, sf.Height);
                    break;
                case HorizontalAlignment.Center:
                    _textRect = new RectangleF((Width - sf.Width) / 2f, (Height - sf.Height) / 2f, sf.Width, sf.Height);
                    break;
                case HorizontalAlignment.Right:
                    _textRect = new RectangleF(Width - BorderWidth - sf.Width, (Height - sf.Height) / 2f, sf.Width, sf.Height);
                    break;
            }
        }

        private void SurLabel_Paint(object sender, PaintEventArgs e)
        {
            BufferedGraphicsContext current = BufferedGraphicsManager.Current;
            BufferedGraphics bg = current.Allocate(e.Graphics, e.ClipRectangle);
            Graphics g = bg.Graphics;
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.Clear(Common.BACK_COLOR);  //背景

            if (Inside && Enabled)
            {
                if (BorderWidth > 0)
                    g.DrawRectangle(BorderInsidePen, BorderRect);
            }
            else
            {
                if (BorderWidth > 0)
                    g.DrawRectangle(BorderOutsidePen, BorderRect);
            }

            if (Enabled)
                g.DrawString(Text, Font, _foreCus ? new SolidBrush(ForeColor) : Common.FORE_BRUSH, _textRect);
            else
                g.DrawString(Text, Font, Common.BORDER_BRUSH, _textRect);

            bg.Render();
            bg.Dispose();
        }
    }
}