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

Posted tlmbem

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了颜色选择美化控件----------WinForm控件开发系列相关的知识,希望对你有一定的参考价值。

技术图片

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

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

    private bool backBorderShow = true;
    /// <summary>
    /// 是否显示边框
    /// </summary>
    [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;
    /// <summary>
    /// 颜色位置
    /// </summary>
    [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);
    /// <summary>
    /// 边框颜色
    /// </summary>
    [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;
    /// <summary>
    /// 颜色选择面板
    /// </summary>
    [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;
      
    

    /// <summary>
    /// 背景图
    /// </summary>
    private static Image back_image = global::AnimationLibrary.Properties.Resources.squaresback;
    /// <summary>
    ///背景图平铺 
    /// </summary>
    private ImageAttributes back_image_ia = new ImageAttributes();
    /// <summary>
    /// 颜色面板显示状态
    /// </summary>
    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;
    

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

  

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

以上是关于颜色选择美化控件----------WinForm控件开发系列的主要内容,如果未能解决你的问题,请参考以下文章

右下角弹窗美化控件----------WinForm控件开发系列

c#winform能实现用css美化吗

TabControl美化扩展----------WinForm控件开发系列

TabPanel美化控件----------WinForm控件开发系列

ToolTip提示美化控件----------WinForm控件开发系列

vs2010用 IrisSkin2.dll皮肤控件美化WINFORM窗体 不显示皮肤也不报错 这个是啥原因呢