チェックボックスにイメージを持たせるのは簡単です。
CheckBoxクラスのImageプロパティにBitmapオブジェクトを割り当てるだけです。
イメージの配置を指定するにはButtonBase.ImageAlignプロパティを設定します。
public ContentAlignment ImageAlign { get; set; }
ContentAlignment列挙体についてはすでに、第16章で出てきています。チェックボックスに、イメージとテキストの両方を表示する場合、その配置が問題となります。これは、ButtonBase.TextImageRelationプロパティを設定します。(C#2.0で追加)
public TextImageRelation TextImageRelation { get; set; }
TextImageRelation列挙体のメンバと意味は次の通りです。
| メンバ | 意味 | 
|---|---|
| ImageAboveText | イメージはテキストの上部に表示 | 
| ImageBeforeText | イメージはテキストの前(左側)に表示 | 
| Overlay | テキストとイメージは同じスペースを共有 | 
| TextAboveImage | テキストがイメージの上部に表示 | 
| TextBeforeImage | テキストがイメージの前(左側)に表示 | 
さて、FormクラスにはPaddingというプロパティが存在します。これは、Controlクラスから継承されてきています。
public Padding Padding { get; set; }
プロパティ値のPaddingは、構造体です。Paddingは、コンテナに詰め物をして、その内側にコントロールを配置するイメージです。これに対して、Marginは、コントロールの外側にスペースを作ってコンテナに配置するイメージです。
Form.Marginは、
public Padding Margin { get; set; }
となっており、プロパティ値はPadding構造体です。この構造体もC#2.0から追加された物です。コンストラクタは、オーバーロードされた2つのバージョンがあります。
public Padding ( int all )allは、すべての端の埋め込みに使用するピクセル数です。
public Padding ( int left, int top, int right, int bottom )left,top,right,bottomはそれぞれの端の埋め込みに使用するピクセル数です。
Padding構造体の主なプロパティには、次のような物があります。
| プロパティ | プロパティ値 | 意味 | 
|---|---|---|
| All | int | すべての端の埋め込み値の取得・設定 | 
| Bottom | int | 下端の埋め込み値の取得・設定 | 
| Horizontal | int | 右端と左端の埋め込み値の合計の取得 | 
| Left | int | 左端の埋め込み値の取得・設定 | 
| Right | int | 右端の埋め込み値の取得・設定 | 
| Size | Size | 埋め込み情報をSystem.Drawing.Size形式で取得 | 
| Top | int | 上端の埋め込み値の取得・設定 | 
| Vertical | int | 上端と下端の埋め込み値の合計の取得 | 
サンプルのプログラムを作る前準備として、適当なイメージを用意しておいてください。 ここでは、gifファイルを用意してみました。
| イメージ | ファイル名 | 
|---|---|
![]()  | file.gif | 
![]()  | open.gif | 
![]()  | save.gif | 
![]()  | exit.gif | 
これらのイメージを、プロジェクトに埋め込んでおいてください。
では、サンプルのプログラムを見てみましょう。
// bmpchk01.cs
using System;
using System.Drawing;
using System.Windows.Forms;
class bmpchk01 : Form
{
    public static void Main()
    {
        Application.Run(new bmpchk01());
    }
    public bmpchk01()
    {
        Text = "猫でもわかるC#プログラミング";
        
        BackColor = SystemColors.Window;
        Padding = new Padding(10);
        Bitmap bmpFile, bmpOpen, bmpSave, bmpExit;
        bmpFile = new Bitmap(GetType(), "bmpchk01.file.gif");
        bmpOpen = new Bitmap(GetType(), "bmpchk01.open.gif");
        bmpSave = new Bitmap(GetType(), "bmpchk01.save.gif");
        bmpExit = new Bitmap(GetType(), "bmpchk01.exit.gif");
        MyCheckBox mcb3 = new MyCheckBox(this, bmpExit, "Exit");
        MyCheckBox mcb2 = new MyCheckBox(this, bmpSave, "Save");
        MyCheckBox mcb1 = new MyCheckBox(this, bmpOpen, "Open");
        MyCheckBox mcb0 = new MyCheckBox(this, bmpFile, "File");
    }
}
class MyCheckBox : CheckBox
{
    public MyCheckBox(Form f, Bitmap bmp, string str)
    {
        Parent = f;
        BackColor = SystemColors.Control;
        Dock = DockStyle.Top;
        Image = bmp;
        ImageAlign = ContentAlignment.MiddleCenter;
        Height = bmp.Height;
        Text = str;
        TextImageRelation = TextImageRelation.ImageBeforeText;
    }
    protected override void OnMouseHover(EventArgs e)
    {
        base.OnMouseHover(e);
        Cursor = Cursors.Hand;
        BackColor = Color.Red;
    }
    protected override void OnMouseLeave(EventArgs eventargs)
    {
        base.OnMouseLeave(eventargs);
        Cursor = Cursors.Arrow;
        BackColor = SystemColors.Control;
    }
    protected override void OnCheckedChanged(EventArgs e)
    {
        base.OnCheckedChanged(e);
        int n = Parent.Controls.Count;
        CheckBox[] cb = new CheckBox[n];
        string str = "";
        for (int i = 0; i < n; i++)
        {
            cb[i] = (CheckBox)Parent.Controls[i];
            if (cb[i].Checked)
                str += (cb[i].Text + " ");
        }
        if (str != "")
            str = "現在選択されているのは" + str + "です";
        else
            str = "現在選択されている項目はありません";
        Parent.Text = str;
        
    }
}
親フォームのPaddingをPadding(10)で設定して、CheckBoxのDockをDockStyle.Topに設定して、次々にドッキングさせています。今までは、Locationプロパティを設定していましたね。実行結果は、次のようになります。Paddingの意味をはっきりさせるために、CheckBoxのBackColorをSystemColors.Controlに設定しています。
フォームのクライアント領域の左右と上にPaddingが存在することがわかります。
マウスでポイントすると、CheckBoxの背景色が赤になります。
親フォームのサイズを変更しても、コントロールは自動的に伸縮しています。
選択されている項目は、タイトルバーに表示されています。
Update 21/Nov/2006 By Y.Kumei