WisdomSoft - for your serial experiences.

6.6 アイコン

アプリケーションやフォームを表すロゴとして用いられるアイコンをプログラムから操作する方法を紹介します。実行時に動的にウィンドウ上のアイコンを変更したり、アイコンを画像として描画できます。

6.6.1 小さなビットマップ

アイコンは、ビットマップイメージの一種ですが、一般的にはイメージのサイズが小さく色数も限られたイメージを指します。アイコンの目的は通常のイメージよりも限定的で、システムに近いプログラムの部品として利用されます。例えば、ボタンやメニューなどに視覚的な効果を与えるために描画します。

Windows では、カーソルを .bmp ファイルとは別に .ico ファイルとして保存できます。.ico ファイルは基本的にビットマップと同じですが、通常は幅と高さが共に 32 ピクセル、または 16 ピクセルで、色が16色の小さなイメージです。また、ビットマップとは異なり .ico は透明なピクセルを表現することができます。これは、正方形ではないアイコンを作るためです。

アイコンファイルを作成するには、専用のアイコンエディタ使うか、.ico 形式に対応した画像編集ソフトで作成する必要があります。Visual Studio を使っている場合は、アイコンエディタが付属されているのでこれを使ってアイコンを作ることができます。

図1 アイコンファイルの編集
図1 アイコンファイルの編集

Image クラスの FromFile() メソッドで .ico ファイルを読み込んで Image オブジェクトを作ることもできますが、アイコンを表す System.Drawing.Icon クラスが用意されています。

System.Drawing.Icon クラス
System.Object
    System.MarshalByRefObject
        System.Drawing.Icon
[Serializable]
[ComVisible(false)]
public sealed class Icon : MarshalByRefObject,
    ISerializable, ICloneable, IDisposable

Icon クラスは、イメージを扱うものの Image クラスとは継承関係を持ちません。このクラスは、アイコンを操作するためのごく単純な機能しか提供していないのです。例えば、アイコンはイメージのような編集目的で利用されることはないので、ビットマップのようなピクセルレベルの操作はできません。イメージとはまったく異なる役割としてアイコンクラスが用意されている背景には、ネイティブの Win32 API でアイコンがビットマップとは異なるオブジェクトとして扱われているためです。Win32 API を経験した開発者には HICON をラッパーするクラスと説明した方が早いでしょう。

Icon インスタンスを生成するには、次のようなコンストラクタを使います。

Icon クラスのコンストラクタ
public Icon(string fileName)
public Icon(Stream stream)

fileName パラメータには Icon オブジェクトを読み込むディスク上のファイルパスを、stream パラメータにはアイコンのデータストリームを指定します。どちらも .ico 形式のファイルフォーマットのデータを指定しなければなりません。

Icon オブジェクトからアイコンのサイズを取得するには Size プロパティを使うか、Width プロパティHeight プロパティを使う方法があります。

Icon クラス Size プロパティ
public Size Size { get; }
Icon クラス Width プロパティ
public int Width { get; }
Icon クラス Height プロパティ
public int Height { get; }

Size プロパティは、アイコンの幅と高さを格納している Size 構造体のオブジェクトを取得します。Width プロパティと Height プロパティは、それぞれ数値で幅と高さを直接取得できます。

Icon オブジェクトを描画するには、Graphics クラスの DrawIcon() メソッドを使います。DrawIcon() メソッドは、DrawImage() メソッドのように画像の一部だけを描画するというような細かい操作はできません。

Graphics クラス DrawIcon() メソッド
public void DrawIcon(Icon icon, int x, int y);
public void DrawIcon(Icon icon, Rectangle targetRect);

icon パラメータには描画する Icon オブジェクトを、x パラメータと y パラメータには、アイコンを描画する座標を指定します。targetRect パラメータを指定する場合は、アイコンを描画する矩形を表す Rectangle オブジェクトを指定します。Rectangle 構造体で矩形を指定した場合、アイコンは矩形のサイズに合わせて伸縮されます。

コード1
using System.Drawing;
using System.Windows.Forms;

public class Test : Form
{
	private Icon icon;
	protected override void OnPaint(PaintEventArgs e)
	{
		base.OnPaint (e);
		if(icon == null) icon = new Icon("test.ico");

		e.Graphics.DrawIcon(icon, 0, 0);
		e.Graphics.DrawIcon(icon, new Rectangle(icon.Width, 0, 200, 200));
	}

	static void Main() 
	{
		Application.Run(new Test());
	}
}
実行結果
コード1 実行結果

コード1は、実行ファイルが配置されているディレクトリの test.ico というファイルをアイコンとして開き、これをウィンドウのクライアント領域に描画するプログラムです。単純に座標のみを指定した場合は、アイコンファイルの既定のサイズで描画されますが、Rectangle 構造体で矩形を指定した場合は、矩形のサイズに伸縮されて表示していることが確認できます。

6.6.2 フォームのアイコン

フォームのタイトルバーの左隅には、フォームやアプリケーションを表すアイコンが表示されます。このアイコンはフォームのタイトルバーだけではなく、タスクバーに表示されるボタンにも表示されます。デフォルトではアプリケーション既定のアイコンが使われますが、プログラム中に変更することが可能です。

アプリケーションを完成させて、ネットワークやパッケージ製品を通して流通させるときには、アプリケーションのシンボルとなるアイコンを表示させたいと考えることでしょう。特に、ゲームのような独自の世界観を重視するアプリケーションの場合はこうした小さな演出にもこだわりたいものです。

フォーム表示されるアイコンは Form クラスの Icon プロパティから設定したり取得することができます。

Form クラス Icon プロパティ
public Icon Icon { get; set; }

フォームに表示されるアイコンは幅と高さが 32 ピクセルのアイコンではなく 16 ピクセルのアイコンなので注意してください。

コード2
using System.Drawing;
using System.Windows.Forms;

public class Test
{
	static void Main() 
	{
		Form form = new Form();
		form.Icon = new Icon("test.ico");
		Application.Run(form);
	}
}
実行結果
コード2 実行結果

コード2は、実行時に test.ico ファイルを読み込んで、読み込んだ Icon オブジェクトをフォームに設定しています。フォームのタイトルバーに表示されるアイコンや、タスクバーのアイコンが .NET デフォルトのアイコンではなく、独自のアイコン変更されます。