この章では、色の選択ダイアログボックスを取り扱います。
色の選択ダイアログボックスは、ColorDialogクラスから作ります。
このクラスは、フォント選択ダイアログボックスと同様CommonDialogクラスから派生しています。
System.Object 
   System.MarshalByRefObject 
     System.ComponentModel.Component 
       System.Windows.Forms.CommonDialog 
        System.Windows.Forms.ColorDialog
ダイアログを作って、表示するにはフォント選択ダイアログと同様、次のように行います。ColorDialog clrdlg = new ColorDialog(); ShowDialog();このダイアログボックスで設定した色はColorDialog.Colorプロパティで取得できます。また、Colorプロパティを設定するとその色が選択された状態となります。
public Color Color { get; set; }
プロパティ値はColor構造体です。AllowFullOpenプロパティをtrueにすると(デフォルトはtrue)、色の作成ボタンが使用できるようになります。
FullOpenプロパティをtrueに設定すると(デフォルトはfalse)、初めから色の作成ボタンを押した状態でダイアログが出てきます。
AnyColorプロパティは、使用可能なすべての色を基本色セットとしてダイアログに表示する場合はtrueに(デフォルトはfalse)設定します。
選択できる色を純色のみに制限するときはSolidColorOnlyプロパティをtrueに(デフォルトはfalse)設定します。
ヘルプボタンを表示するときは、ShowHelpプロパティをtrueに(デフォルトはfalse)設定します。
さて、ユーザーが作成した色は、CustomColorsプロパティで取得、設定ができます。
public int[] CustomColors { get; set; }
プロパティ値がint型の配列であることに注意してください。ユーザーの作成した色は、32ビット整数値で表され、最上位バイトが0、次のバイトから順に青、緑、赤となります。ユーザーが複数のカスタムカラーを作成する可能性があるので配列となっています。
では、サンプルのプログラムを見てみましょう。
// colordlg01.cs
using System;
using System.Drawing;
using System.Windows.Forms;
class colordlg01 : Form
{
    int[] custom = null;
    public static void Main()
    {
        Application.Run(new colordlg01());
    }
    public colordlg01()
    {
        Text = "猫でもわかるC#プログラミング";
        BackColor = SystemColors.Window;
        Menu = new MainMenu();
        MenuItem miFile = new MenuItem("ファイル(&F)");
        Menu.MenuItems.Add(miFile);
        MenuItem miExit = new MenuItem("終了(&X)");
        miExit.Click += new EventHandler(miExit_Click);
        miFile.MenuItems.Add(miExit);
        MenuItem miOption = new MenuItem("オプション(&O)");
        Menu.MenuItems.Add(miOption);
        MenuItem miColor = new MenuItem("色の選択(&C)");
        miColor.Click += new EventHandler(miColor_Click);
        miOption.MenuItems.Add(miColor);
    }
    void miExit_Click(object sender, EventArgs e)
    {
        Close();
    }
    void miColor_Click(object sender, EventArgs e)
    {
        MyColorDlg mcd = new MyColorDlg();
        mcd.Color = ForeColor;
        mcd.CustomColors = custom;
        DialogResult dr = mcd.ShowDialog();
        if (dr == DialogResult.OK)
        {
            ForeColor = mcd.Color;
            custom = mcd.CustomColors;
            Invalidate();
        }
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        Graphics g = e.Graphics;
        g.DrawString("猫でもわかる\nC#プログラミング",
            new Font("MS ゴシック", 24),
            new SolidBrush(ForeColor),
            new PointF(10f, 10f)
        );
    }
}
colordlg01クラスは、Formクラスを継承しています。customフィールドは、カスタムカラーを格納するのに利用します。初期状態では、カスタムカラーはないので、nullです。
Mainメソッドでは、メインフォームを作成しています。
コンストラクタでは、メニューを作成しています。
メニューで「終了」を選択すると、miExit_Clicメソッドが呼び出され、メインフォームを閉じてプログラムを終了します。
メニューから「色の選択」を選択すると、miColor_Clickメソッドが呼び出されます。
ここで、MyColorDlgクラス(ColorDialogクラスより継承、後述)のインスタンスを生成します。そしてColorとCustomColorsプロパティを設定します。
ShowDialogメソッドで、色の選択ダイアログボックスを見えるようにします。
「OK」ボタンが押されて、ShowDialogメソッドが制御を返した時は、親フォームのForeColorプロパティを、ダイアログで選択した色に設定します。
また、custonフィールドに、ダイアログで作ったカスタムカラーをコピーしておきます。
Invalidateメソッドを実行して、親フォームのクライアント領域を再描画します。
Paintイベントに応答してOnPaintメソッドが呼び出されます。ここでは、ForeColorの色で、テキストをクライアント領域に描画します。
class MyColorDlg : ColorDialog
{
    public MyColorDlg()
    {
        ShowHelp = true;
    }
    protected override void OnHelpRequest(EventArgs e)
    {
        base.OnHelpRequest(e);
        MessageBox.Show("色の選択ダイアログ",
            "猫C#", 
            MessageBoxButtons.OK,
            MessageBoxIcon.Information);
    }
}
MyColorDlgクラスはColorDialogクラスから継承されています。コンストラクタでは、ShowHelpプロパティをtrueに設定しているのみです。
ヘルプボタンが押されたら、OnHelpRequestメソッドが呼び出されます。ここでは、単にメッセージボックスを出しているだけです。
では、実行結果を見てみましょう。
メニューの「オプション」「色の選択」を選択すると、左のような色の選択ダイアログボックスが出現します。
希望する色が「基本色」の中にあれば、それを選択して「OK」ボタンを押します。
希望する色がない場合は、それに一番近い色を選んで、「色の作成ボタン」を押します。
すると、色の作成ツールが右側に出現します。
十字カーソルや、三角形のカーソルを動かして、希望の色を作ります。そして、「色の追加」ボタンを押します。
すると、その色が「作成した色」に追加されます。
「OK」ボタンを押します。
先ほど、作成した色でテキストが描画されます。
Update 29/Nov/2006 By Y.Kumei