颜色选择美化控件----------WinForm控件开发系列

2021-02-03 03:13

阅读:571

标签:poi   ntb   背景   mat   value   ipc   efault   edr   attr   

技术图片

下面是控件显示界面源码,日期选择面板源码太多了2000行左右,没有贴出来,可以下载源码去看。你可以完善这个颜色控件。

/// 
  /// 颜色选择美化控件
  /// 
  [ToolboxItem(true)]
  [DefaultProperty("ColorPicker")]
  [Description("颜色选择美化控件")]
  public partial class ColorExt : Control
  {
    #region

    private bool backBorderShow = true;
    /// 
    /// 是否显示边框
    /// 
    [DefaultValue(true)]
    [Description("是否显示边框")]
    public bool BackBorderShow
    {
      get { return this.backBorderShow; }
      set
      {
        if (this.backBorderShow == value)
          return;
        this.backBorderShow = value;
        this.Invalidate();
      }
    }

    private ColorAnchors colorAnchor = ColorAnchors.Right;
    /// 
    /// 颜色位置
    /// 
    [DefaultValue(ColorAnchors.Right)]
    [Description("颜色位置")]
    public ColorAnchors ColorAnchor
    {
      get { return this.colorAnchor; }
      set
      {
        if (this.colorAnchor == value)
          return;
        this.colorAnchor = value;
        this.Invalidate();
      }
    }

    private Color backBorderColor = Color.FromArgb(192, 192, 192);
    /// 
    /// 边框颜色
    /// 
    [DefaultValue(typeof(Color), "192, 192, 192")]
    [Description("边框颜色")]
    [Editor(typeof(ColorEditorExt), typeof(System.Drawing.Design.UITypeEditor))]
    public Color BackBorderColor
    {
      get { return this.backBorderColor; }
      set
      {
        if (this.backBorderColor == value)
          return;
        this.backBorderColor = value;
        this.Invalidate();
      }
    }

    private ColorPickerExt colorPicker = null;
    /// 
    /// 颜色选择面板
    /// 
    [Browsable(true)]
    [Description("颜色选择面板")]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public ColorPickerExt ColorPicker
    {
      get { return this.colorPicker; }
      set { this.colorPicker = value; }
    }

    protected override Size DefaultSize
    {
      get
      {
        return new Size(130, 23);
      }
    }

    protected override Cursor DefaultCursor
    {
      get
      {
        return Cursors.Hand;
      }
    }

    /// 
    /// 背景图
    /// 
    private static Image back_image = global::AnimationLibrary.Properties.Resources.squaresback;
    /// 
    ///背景图平铺 
    /// 
    private ImageAttributes back_image_ia = new ImageAttributes();
    /// 
    /// 颜色面板显示状态
    /// 
    private bool DisplayStatus = false;

    private ToolStripDropDown tsdd = null;

    private ToolStripControlHost tsch = null;

    private readonly StringFormat color_sf = new StringFormat() { Alignment = StringAlignment.Near, LineAlignment = StringAlignment.Center, Trimming = StringTrimming.None, FormatFlags = StringFormatFlags.NoWrap };

    #endregion

    public ColorExt()
    {
      SetStyle(ControlStyles.UserPaint, true);
      SetStyle(ControlStyles.AllPaintingInWmPaint, true);
      SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
      SetStyle(ControlStyles.ResizeRedraw, true);
      SetStyle(ControlStyles.SupportsTransparentBackColor, true);
      InitializeComponent();

      this.BackColor = Color.FromArgb(255, 255, 255);
      this.ForeColor = Color.FromArgb(105, 105, 105);
      this.Font = new Font("微软雅黑", 9);

      this.back_image_ia.SetWrapMode(WrapMode.Tile);

      this.ColorPicker = new ColorPickerExt();
      this.tsdd = new ToolStripDropDown() { Padding = Padding.Empty };
      this.tsch = new ToolStripControlHost(this.ColorPicker) { Margin = Padding.Empty, Padding = Padding.Empty };
      tsdd.Items.Add(this.tsch);


      this.tsdd.Closed += new ToolStripDropDownClosedEventHandler(this.tsdd_Closed);
      this.ColorPicker.ValueChanged += new EventHandler(this.ColorPicker_ValueChanged);
      this.ColorPicker.ClearClick += new EventHandler(this.ColorPicker_ClearClick);
      this.ColorPicker.ConfirmClick += new EventHandler(this.ColorPicker_ConfirmClick);

    }

    protected override void OnPaint(PaintEventArgs e)
    {
      base.OnPaint(e);
      Graphics g = e.Graphics;

      if (this.BackBorderShow)
      {
        Pen backborder_pen = new Pen(this.BackBorderColor, 1);
        g.DrawRectangle(backborder_pen, new Rectangle(e.ClipRectangle.X, e.ClipRectangle.Y, e.ClipRectangle.Width - 1, e.ClipRectangle.Height - 1));
        backborder_pen.Dispose();
      }

      int color_width = (int)(g.ClipBounds.Height - 4);
      int color_height = (int)(g.ClipBounds.Height - 4);
      Rectangle color_rect = new Rectangle(e.ClipRectangle.Right - color_width - 2, e.ClipRectangle.Y + (e.ClipRectangle.Height - color_height) / 2, color_width, color_height);
      Rectangle argb_rect = new Rectangle(e.ClipRectangle.X + 5, e.ClipRectangle.Y, e.ClipRectangle.Width - color_width - 12, e.ClipRectangle.Height);
      if (this.ColorAnchor == ColorAnchors.Left)
      {
        color_rect = new Rectangle(e.ClipRectangle.X + 2, (e.ClipRectangle.Y + e.ClipRectangle.Height - color_height) / 2, color_width, color_height);
        argb_rect = new Rectangle(e.ClipRectangle.X + 2 + color_width + 5, e.ClipRectangle.Y, e.ClipRectangle.Width - color_width - 12, e.ClipRectangle.Height);
      }

      g.DrawImage(back_image, color_rect, 0, 0, color_rect.Width, color_rect.Height, GraphicsUnit.Pixel, this.back_image_ia);

      if (this.ColorPicker.Value != Color.Empty)
      {
        SolidBrush argb_sb = new SolidBrush(this.ColorPicker.Value);
        g.FillRectangle(argb_sb, color_rect);
        argb_sb.Color = this.ForeColor;
        string argb_format = String.Format("{0},{1},{2},{3}", this.ColorPicker.Value.A, this.ColorPicker.Value.R, this.ColorPicker.Value.G, this.ColorPicker.Value.B);
        g.DrawString(argb_format, this.Font, argb_sb, argb_rect, color_sf);
        argb_sb.Dispose();
      }

    }

    protected override void OnClick(EventArgs e)
    {
      base.OnClick(e);
      if (!this.DisplayStatus)
      {
        tsdd.Show(this.PointToScreen(new Point(0, this.Height + 2)));
        this.ColorPicker.InitializeColor();
      }
    }

    protected override void Dispose(bool disposing)
    {
      if (disposing && (components != null))
      {
        components.Dispose();
        if (this.color_sf != null)
          this.color_sf.Dispose();
        if (this.back_image_ia != null)
          this.back_image_ia.Dispose();
      }
      base.Dispose(disposing);
    }

    private void ColorPicker_ValueChanged(object sender, EventArgs e)
    {
      this.Invalidate();
    }

    private void ColorPicker_ClearClick(object sender, EventArgs e)
    {
      this.tsdd.Close();
      this.DisplayStatus = false;
      this.Invalidate();
    }

    private void ColorPicker_ConfirmClick(object sender, EventArgs e)
    {
      this.tsdd.Close();
      this.DisplayStatus = false;
    }

    private void tsdd_Closed(object sender, ToolStripDropDownClosedEventArgs e)
    {
      this.Invalidate();
      this.DisplayStatus = false;
    }

    /// 
    /// 颜色位置
    /// 
    [Description("颜色位置")]
    public enum ColorAnchors
    {
      /// 
      /// 左边
      /// 
      Left,
      /// 
      /// 右边
      /// 
      Right
    }

  }

源码下载:颜色选择美化控件.zip

颜色选择美化控件----------WinForm控件开发系列

标签:poi   ntb   背景   mat   value   ipc   efault   edr   attr   

原文地址:https://www.cnblogs.com/tlmbem/p/11520981.html


评论


亲,登录后才可以留言!