2010年1月4日月曜日

C# カラーピッカーのスライダーを作ってみた その2

C#たんかわいいよC#たん もでりんぐしたい><


先日から引き続きカラーピッカー用のスライダーを作ってみた。
変更点は色選択を配列で渡すように変更して、2色以上のグラデーションに対応。

これでHSVのHのスライダーが作れるようになった^^



  1. using System;  
  2. using System.ComponentModel;  
  3. using System.Drawing;  
  4. using System.Windows.Forms;  
  5. using System.Drawing.Drawing2D;  
  6.   
  7. public partial class GradationSlider : Control  
  8. {  
  9.   
  10.     // イベントの宣言  
  11.     [Description("コントロールの値が変更するとき発生します。")]  
  12.     [Category("アクション")]  
  13.     public event EventHandler ValueChanged;  
  14.   
  15.     // プロパティ  
  16.     private int _maximum = 100;  
  17.     public int Maximum  
  18.     {  
  19.         set  
  20.         {  
  21.             this._maximum = value;  
  22.         }  
  23.         get  
  24.         {  
  25.             return this._maximum;  
  26.         }  
  27.     }  
  28.   
  29.     public int Minimum { getset; }  
  30.   
  31.     private int _value;  
  32.     public int Value  
  33.     {  
  34.         set  
  35.         {  
  36.             this._value = value;  
  37.             if (ValueChanged != null && Value >= Minimum && Value <= Maximum) ValueChanged(thisnew EventArgs());  
  38.             this.Refresh();  
  39.         }  
  40.         get  
  41.         {  
  42.             return this._value;  
  43.         }  
  44.     }  
  45.   
  46.     private Color[] _gradationColor;  
  47.     public Color[] GradationColor  
  48.     {  
  49.         set  
  50.         {  
  51.             this._gradationColor = value;  
  52.             drawGradation();  
  53.             this.Refresh();  
  54.         }  
  55.         get  
  56.         {  
  57.   
  58.             return this._gradationColor;  
  59.         }  
  60.     }  
  61.   
  62.     public GradationSlider()  
  63.     {  
  64.         InitializeComponent();  
  65.   
  66.         this.SetStyle(ControlStyles.ResizeRedraw, true);  
  67.         this.SetStyle(ControlStyles.DoubleBuffer, true);  
  68.         this.SetStyle(ControlStyles.UserPaint, true);  
  69.         this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);  
  70.   
  71.         this.Resize += new System.EventHandler(this.CSlider_Resize);  
  72.         this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.CSlider_MouseMove);  
  73.         this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.CSlider_MouseDown);  
  74.         this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.CSlider_MouseUp);  
  75.         this.MouseLeave += new System.EventHandler(this.CSlider_MouseLeave);  
  76.         this.MouseEnter += new System.EventHandler(this.CSlider_MouseEnter);  
  77.   
  78.         drawTick();  
  79.     }  
  80.   
  81.     // 描画  
  82.     //針の描画  
  83.     private Bitmap tick;  
  84.     private void drawTick()  
  85.     {  
  86.         tick = new Bitmap(10, 10);  
  87.   
  88.         Graphics g = Graphics.FromImage(tick);  
  89.         g.SmoothingMode = SmoothingMode.HighQuality;  
  90.         Point[] point = {   new Point(5,1), new Point(9,5),  
  91.                                 new Point(9,7), new Point(8,8),  
  92.                                 new Point(2,8), new Point(1,7),  
  93.                                 new Point(1,5), new Point(5,1) };  
  94.         Brush b = new SolidBrush(Color.White);  
  95.         g.FillPolygon(b, point);  
  96.         Pen p = new Pen(Color.Black, 1);  
  97.         if (activeFlag == true)  
  98.         {  
  99.             p = new Pen(Color.Brown, 1);  
  100.         }  
  101.         g.DrawLines(p, point);  
  102.         g.Dispose();  
  103.     }  
  104.   
  105.     protected override void OnPaint(PaintEventArgs pe)  
  106.     {  
  107.         base.OnPaint(pe);  
  108.         drawGradation();  
  109.         pe.Graphics.DrawImage(gradation, 5, 0, gradation.Width, gradation.Height);  
  110.         pe.Graphics.DrawImage(tick, (Value * gradation.Width) / (Maximum - Minimum), gradation.Height);  
  111.   
  112.     }  
  113.   
  114.     //グラデーションの描画  
  115.     private Bitmap gradation;  
  116.     private void drawGradation()  
  117.     {  
  118.         if (this.Width > 10 && this.Height > 10)  
  119.         {  
  120.             Size gradationSize = new Size(this.Width - 10, this.Height - 10);  
  121.   
  122.             gradation = new Bitmap(gradationSize.Width, gradationSize.Height);  
  123.             Graphics g = Graphics.FromImage(gradation);  
  124.             LinearGradientBrush lgb =  
  125.                 new LinearGradientBrush(new Rectangle(0, 0, gradationSize.Width, gradationSize.Height),  
  126.                     Color.Black, Color.White, LinearGradientMode.Horizontal);  
  127.   
  128.             //多色用  
  129.   
  130.   
  131.             if (GradationColor != null && GradationColor.Length >= 2)  
  132.             {  
  133.                 // ColorBlendクラスを生成   
  134.                 ColorBlend cb = new ColorBlend();  
  135.                 cb.Colors = GradationColor;  
  136.                 float[] Position = new float[GradationColor.Length];  
  137.                 for (int i = 0; i < GradationColor.Length; i++)  
  138.                 {  
  139.                     Position[i] = (1.0f / (GradationColor.Length - 1)) * (i);  
  140.                 }  
  141.   
  142.                 cb.Positions = Position;  
  143.                 // ブラシのInterpolationColorsに設定   
  144.                 lgb.InterpolationColors = cb;  
  145.             }  
  146.   
  147.   
  148.             g.FillRectangle(lgb, new Rectangle(0, 0, gradationSize.Width, gradationSize.Height));  
  149.   
  150.             //枠線  
  151.             Pen p = new Pen(Color.Black, 1);  
  152.             if (activeFlag == true)  
  153.             {  
  154.                 p = new Pen(Color.Brown, 1);  
  155.             }  
  156.   
  157.             g.DrawRectangle(p, 0, 0, gradationSize.Width - 1, gradationSize.Height - 1);  
  158.             lgb.Dispose();  
  159.             g.Dispose();  
  160.         }  
  161.   
  162.     }  
  163.   
  164.   
  165.     //リサイズ時、グラデーションの再描画  
  166.     private void CSlider_Resize(object sender, EventArgs e)  
  167.     {  
  168.         drawGradation();  
  169.         this.Refresh();  
  170.     }  
  171.   
  172.   
  173.     //プロパティ  
  174.     private bool mouseDown = false;  
  175.     private void CSlider_MouseDown(object sender, MouseEventArgs e)  
  176.     {  
  177.         Value = (int)(((float)(e.X - 5) / (this.Width - 10)) * (Maximum - Minimum));  
  178.         if (Value <= Minimum) Value = Minimum;  
  179.         if (Value >= Maximum) Value = Maximum;  
  180.   
  181.         if (ValueChanged != null) ValueChanged(thisnew EventArgs());  
  182.   
  183.         mouseDown = true;  
  184.     }  
  185.   
  186.     private void CSlider_MouseMove(object sender, MouseEventArgs e)  
  187.     {  
  188.         if (mouseDown == true)  
  189.         {  
  190.             Value = (int)(((float)(e.X - 5) / (this.Width - 10)) * (Maximum - Minimum));  
  191.             if (Value <= Minimum) Value = Minimum;  
  192.             if (Value >= Maximum) Value = Maximum;  
  193.   
  194.             if (ValueChanged != null) ValueChanged(thisnew EventArgs());  
  195.         }  
  196.     }  
  197.   
  198.     private void CSlider_MouseUp(object sender, MouseEventArgs e)  
  199.     {  
  200.         mouseDown = false;  
  201.     }  
  202.   
  203.   
  204.     private bool activeFlag = false;  
  205.     private void CSlider_MouseEnter(object sender, EventArgs e)  
  206.     {  
  207.         activeFlag = true;  
  208.   
  209.         drawGradation();  
  210.         drawTick();  
  211.         this.Refresh();  
  212.     }  
  213.   
  214.     private void CSlider_MouseLeave(object sender, EventArgs e)  
  215.     {  
  216.         activeFlag = false;  
  217.   
  218.         drawGradation();  
  219.         drawTick();  
  220.         this.Refresh();  
  221.     }  
  222. }  

0 件のコメント:

コメントを投稿