第16章 ボタンにイメージを表示する


ButtonBaseクラスに、Imageプロパティがあります。これを設定するとボタンにイメージを表示することができます。



public Image Image { get; set; }
となっています。Imageクラスは、Bitmap, Metafileの派生クラスの機能を提供する抽象基本クラスです。

ImageプロパティをImageオブジェクトまたは、Bitmapオブジェクトに設定します。

ここでは、Bitmapのコンストラクタを使ってImageプロパティを設定します。

Bitmapクラスについては、後の章で詳しく解説します。コンストラクタには多数のオーバーロードバージョンがあります。ここでは、リソースとしてexeに埋め込まれたイメージファイルをImageプロパティに設定することにします。

public Bitmap (
	Type type,
	string resource
)
typeには、リソースの抽出に使用するクラスを指定します。普通は、GetTypeメソッドで取得します

resourceには、リソースの名前を指定します。

リソース名は、ファイル名が"abc.bmp"をリソースとした場合、"名前空間.abc.bmp"というようになります。通常、プロジェクト名が規定の名前空間となっています。

名前はBitmapですが、ビットマップ以外の形式でも大丈夫です。

ところで、イメージファイルをリソースとしてexeに埋め込むにはどうしたらよいのでしょうか。

これは、簡単です。

1.リソースにしたいイメージファイルを用意(bmpに限らず、GIF,JPG,TIF,PNGなどでもよい)
2.ソリューション・エクスプローラで、プロジェクト名を右クリック。「追加」「既存項目」で目的のイメージファイルを選択
3.イメージファイルのプロパティで、ビルドアクションを「埋め込まれたリソース」に設定
たったこれだけです。プロジェクトのプロパティで「リソース」を選択して、あれこれしてもうまくいきません。

では、サンプルのプログラムを見てみましょう。

// imgbtn01.cs

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

class imgbtn01
{
    public static void Main()
    {
        Form form = new Form();
        form.Text = "猫でもわかるプログラミング";
        form.BackColor = SystemColors.Window;
        form.ClientSize = new Size(230, 230);

        MyButton mb1 = new MyButton();
        mb1.Location = new Point(10, 10);

        MyButton mb2 = new MyButton();
        mb2.Location = new Point(20 + mb1.Width, 10);

        MyButton mb3 = new MyButton();
        mb3.Location = new Point(10, 20 + mb1.Height);

        MyButton mb4 = new MyButton();
        mb4.Location = new Point(20 + mb1.Width, 20 + mb1.Height);

        form.Controls.Add(mb1);
        form.Controls.Add(mb2);
        form.Controls.Add(mb3);
        form.Controls.Add(mb4);

        Application.Run(form);
    }
}

class MyButton : Button
{
    public MyButton()
    {
        Text = "猫";
        TextAlign = ContentAlignment.TopCenter;
        Font = new Font("MS ゴシック", 30);
        ForeColor = Color.Green;
        Size = new Size(100, 100);
        BackColor = SystemColors.Control;
        Image = new Bitmap(GetType(), "imgbtn01.cat.gif");
        ImageAlign = ContentAlignment.BottomCenter;

    }

    protected override void OnMouseHover(EventArgs e)
    {
        base.OnMouseHover(e);
        ForeColor = Color.Red;
        Cursor = Cursors.Hand;
    }

    protected override void OnMouseLeave(EventArgs e)
    {
        base.OnMouseLeave(e);
        ForeColor = Color.Green;
        Cursor = Cursors.Arrow;
    }

    protected override void OnClick(EventArgs e)
    {
        base.OnClick(e);
        string str;

        int n = Parent.Controls.IndexOf(this);

        switch (n)
        {
            case 0:
                str = "左上のボタンがクリックされました";
                break;
            case 1:
                str = "右上のボタンがクリックされました";
                break;
            case 2:
                str = "左下のボタンがクリックされました";
                break;
            case 3:
                str = "右下のボタンがクリックされました";
                break;
            default:
                str = "";
                break;
        }
        MessageBox.Show(str, "猫でもわかるプログラミング",
            MessageBoxButtons.OK, MessageBoxIcon.Information);
    }

}
まずは、Mainメソッドを見てみましょう。

form.ClientSize = new Size(230, 230);
と、しています。FormクラスのClientSizeプロパティは、クライアント領域のサイズを取得、または設定します。
public Size ClientSize { get; set; }
ここでは、100*100のボタンを4つ、(2列 * 2列, 各隙間を10)クライアント領域に表示する予定なので、クライアント領域のサイズは230*230にしています。

その後、MyButtonクラスのインスタンスを4つ生成してControls.Addメソッドで、子供コントロールとして登録しています。

MyButtonクラスのコンストラクタを見てみましょう。

Textプロパティを設定した後、TextAlignプロパティを設定してTextを上端中央に表示するようにしています。TextAlignプロパティは、Textの表示位置を指定するものです。(TextAlignプロパティはButtonBaseクラスのvirtualメンバ)

public virtual ContentAlignment TextAlign { get; set; }
戻り値のContentAlignmentは、System.Drawing名前空間で定義されている列挙体です。 メンバと意味は次の通りです。

メンバ意味
BottomCenter内容は下端中央
BottomLeft下端左寄せ
BottomRight下端右寄せ
MiddleCenter中段中央
MiddleLeft中段左寄せ
MiddleRight中段右寄せ
TopCenter上端中央
TopLeft上端左寄せ
TopRight上端右寄せ

Imageプロパティを次のように設定しています。

Image = new Bitmap(GetType(), "imgbtn01.cat.gif");
これは、リソースとしてimgbtn01名前空間で定義されているcat.gifをImageに設定しなさいという意味です。

そして、Imageの表示位置を下端中央に指定しています。

OnMouseHoverメソッドをオーバーライドして、マウスがコントロールに乗っかったときの挙動を指定しています。

具体的にはForeColorを赤に、カーソルを指型にしています。

OnMouseLeaveメソッドは、マウスがコントロールから離れた時の挙動を指定します。

このプログラムでは、ForeColorを緑にもどし、カーソルを矢印に戻しています。

OnClickメソッドをオーバーライドして、ボタンがクリックされたときの動作を指定しています。

まず、

int n = Parent.Controls.IndexOf(this);
に注目してください。

Control.ControlCollection.IndexOfメソッドは、指定されたコントロールがコントロールコレクションのインデックスを返します。これにより、Controls[x]のxがわかるわけです。ここでは、自分自身がコレクションのインデックスを調べています。これで、どのボタンがクリックしたかを知ることができるわけですね。この番号により、メッセージボックスで表示する文字列を決めています。

複数のボタンがあり、一つのイベントハンドラで処理する場合、どのボタンが押されたかを知る方法はたくさんあります。このHPで紹介した以外にも多くの方法があると思われます。

では、実行結果を見てみましょう。

マウスでポイントすると、カーソルが指型に変わり、ボタンの「猫」という文字が赤色になります。

ちょっと不満なのが、マウスをクリックしたとき「猫」の文字は少し右下に移動しますが、イメージは移動しません。




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

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