第37章 イメージを持つチェックボックス


チェックボックスにイメージを持たせるのは簡単です。



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構造体の主なプロパティには、次のような物があります。

プロパティプロパティ値 意味
Allintすべての端の埋め込み値の取得・設定
Bottomint下端の埋め込み値の取得・設定
Horizontalint右端と左端の埋め込み値の合計の取得
Leftint左端の埋め込み値の取得・設定
Rightint右端の埋め込み値の取得・設定
SizeSize埋め込み情報をSystem.Drawing.Size形式で取得
Topint上端の埋め込み値の取得・設定
Verticalint上端と下端の埋め込み値の合計の取得

サンプルのプログラムを作る前準備として、適当なイメージを用意しておいてください。 ここでは、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の背景色が赤になります。



親フォームのサイズを変更しても、コントロールは自動的に伸縮しています。

選択されている項目は、タイトルバーに表示されています。




[C# フォーム Index] [C# コンソール Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 21/Nov/2006 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。