定義済み色をリストアップする

あらかじめ名前で定義されている色、たとえば Color.Aqua や Color.Orange など、そういった色を列挙する方法を紹介します。また、その色の RGB 成分を参照する方法も同時に紹介します。

Fig. 1 に示すアプリケーションを作って確認します。

Fig. 1 定義済み色をリストアップして表示したウインドウ

Form1 に下記のコントロールを配置してください。

listBox1 という名前の ListBox
listBox2 という名前の ListBox
pictureBox1 という名前の PictureBox

Form には Load イベントを定義してください。
ListBox には SelectedIndexChanged イベントを定義してください。
PictureBox には Paint イベントを定義してください。

具体的には、下記のコードです。22行目で定義済み色の配列を取得しています。

その色がシステムカラーかどうかは IsSystemColor というプロパティの true/false で知ることができます。色の名前から Color を取得するには Color.FromName() というメソッドを利用します。

using System;
using System.Drawing;
using System.Windows.Forms;

namespace aaa
{
	public partial class Form1 : Form
	{

		// ピクチャボックスを塗りつぶす色.
		Color TheColor;

		public Form1()
		{
			InitializeComponent();
		}

		private void Form1_Load( object sender, EventArgs e )
		{

			// すべての定義済み色を列挙した配列を取得する.
			Array arr = Enum.GetValues( typeof( KnownColor ));

			// いったんリストボックスのアイテムをクリアする.
			listBox1.Items.Clear();
			listBox2.Items.Clear();

			// リストボックス項目に仕込む.
			for ( int k = 0; k < arr.Length; k++ )
			{

				KnownColor kc = (KnownColor)( arr.GetValue(k));
				Color c = Color.FromKnownColor( kc );

				if ( c.IsSystemColor )
				{
					// システムカラーの場合.
					listBox1.Items.Add( c.Name );
				}
				else
				{
					// そうでないカラーの場合.
					listBox2.Items.Add( c.Name );
				}
			}

			// それぞれ何色あるか起動時に表示する.
			// StringBuilder sb = new StringBuilder();
			// sb.AppendLine( String.Format( "システムカラー {0} 色.", listBox1.Items.Count ));
			// sb.AppendLine( String.Format( "そうでないカラー {0} 色.", listBox2.Items.Count ));
			// MessageBox.Show( sb.ToString().Trim());

		}

		private void listBox1_SelectedIndexChanged( object sender, EventArgs e )
		{

			int k = listBox1.SelectedIndex;
			String color_name = listBox1.Items[k].ToString();

			// 色の名前から Color を取得する.
			TheColor = Color.FromName( color_name );

			// ピクチャボックスの再描画を要請する.
			pictureBox1.Invalidate( true );

		}

		private void listBox2_SelectedIndexChanged( object sender, EventArgs e )
		{

			int k = listBox2.SelectedIndex;
			String color_name = listBox2.Items[k].ToString();

			// 色の名前から Color を取得する.
			TheColor = Color.FromName( color_name );

			// ピクチャボックスの再描画を要請する.
			pictureBox1.Invalidate( true );

		}

		private void pictureBox1_Paint( object sender, PaintEventArgs e )
		{

			int pw = pictureBox1.Width;
			int ph = pictureBox1.Height;

			// ピクチャボックス全体を指定の色で塗りつぶす.
			using ( SolidBrush sb = new SolidBrush( TheColor ))
			{
				e.Graphics.FillRectangle( sb, 0, 0, pw, ph );
			}

			// ピクチャボックスの枠線は常に黒とする.
			using ( Pen pen = new Pen( Color.Black ))
			{
				int xs = 0;
				int ys = 0;
				int xe = pw - 1;
				int ye = ph - 1;
				e.Graphics.DrawLine( pen, xs, ys, xe, ys );
				e.Graphics.DrawLine( pen, xe, ys, xe, ye );
				e.Graphics.DrawLine( pen, xe, ye, xs, ye );
				e.Graphics.DrawLine( pen, xs, ye, xs, ys );
			}

			// 3原色に分解する.
			byte r = TheColor.R;
			byte g = TheColor.G;
			byte b = TheColor.B;

			// 10進と16進で文字列を生成する.
			String str0 = String.Format( "( {0}, {1}, {2} )", r, g, b );
			String str1 = String.Format( "( {0:x}, {1:x}, {2:x} )", r, g, b );

			// タイトルバーに表示する.
			str1 = str1.ToUpper();
			this.Text = String.Format( "RGB {0}, {1}", str0, str1 );

		}
	}
}