6.6 アイコン
6.6.1 小さなビットマップ
アイコンは、ビットマップイメージの一種ですが、一般的にはイメージのサイズが小さく色数も限られたイメージを指します。アイコンの目的は通常のイメージよりも限定的で、システムに近いプログラムの部品として利用されます。例えば、ボタンやメニューなどに視覚的な効果を与えるために描画します。
Windows では、カーソルを .bmp ファイルとは別に .ico ファイルとして保存できます。.ico ファイルは基本的にビットマップと同じですが、通常は幅と高さが共に 32 ピクセル、または 16 ピクセルで、色が16色の小さなイメージです。また、ビットマップとは異なり .ico は透明なピクセルを表現することができます。これは、正方形ではないアイコンを作るためです。
アイコンファイルを作成するには、専用のアイコンエディタ使うか、.ico 形式に対応した画像編集ソフトで作成する必要があります。Visual Studio を使っている場合は、アイコンエディタが付属されているのでこれを使ってアイコンを作ることができます。
Image クラスの FromFile() メソッドで .ico ファイルを読み込んで Image オブジェクトを作ることもできますが、アイコンを表す 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 インスタンスを生成するには、次のようなコンストラクタを使います。
public Icon(string fileName)
public Icon(Stream stream)
fileName パラメータには Icon オブジェクトを読み込むディスク上のファイルパスを、stream パラメータにはアイコンのデータストリームを指定します。どちらも .ico 形式のファイルフォーマットのデータを指定しなければなりません。
Icon オブジェクトからアイコンのサイズを取得するには Size プロパティを使うか、Width プロパティと Height プロパティを使う方法があります。
public Size Size { get; }
public int Width { get; }
public int Height { get; }
Size プロパティは、アイコンの幅と高さを格納している Size 構造体のオブジェクトを取得します。Width プロパティと Height プロパティは、それぞれ数値で幅と高さを直接取得できます。
Icon オブジェクトを描画するには、Graphics クラスの DrawIcon() メソッドを使います。DrawIcon() メソッドは、DrawImage() メソッドのように画像の一部だけを描画するというような細かい操作はできません。
public void DrawIcon(Icon icon, int x, int y);
public void DrawIcon(Icon icon, Rectangle targetRect);
icon パラメータには描画する Icon オブジェクトを、x パラメータと y パラメータには、アイコンを描画する座標を指定します。targetRect パラメータを指定する場合は、アイコンを描画する矩形を表す Rectangle オブジェクトを指定します。Rectangle 構造体で矩形を指定した場合、アイコンは矩形のサイズに合わせて伸縮されます。
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は、実行ファイルが配置されているディレクトリの test.ico というファイルをアイコンとして開き、これをウィンドウのクライアント領域に描画するプログラムです。単純に座標のみを指定した場合は、アイコンファイルの既定のサイズで描画されますが、Rectangle 構造体で矩形を指定した場合は、矩形のサイズに伸縮されて表示していることが確認できます。
6.6.2 フォームのアイコン
フォームのタイトルバーの左隅には、フォームやアプリケーションを表すアイコンが表示されます。このアイコンはフォームのタイトルバーだけではなく、タスクバーに表示されるボタンにも表示されます。デフォルトではアプリケーション既定のアイコンが使われますが、プログラム中に変更することが可能です。
アプリケーションを完成させて、ネットワークやパッケージ製品を通して流通させるときには、アプリケーションのシンボルとなるアイコンを表示させたいと考えることでしょう。特に、ゲームのような独自の世界観を重視するアプリケーションの場合はこうした小さな演出にもこだわりたいものです。
フォーム表示されるアイコンは Form クラスの Icon プロパティから設定したり取得することができます。
public Icon Icon { get; set; }
フォームに表示されるアイコンは幅と高さが 32 ピクセルのアイコンではなく 16 ピクセルのアイコンなので注意してください。
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は、実行時に test.ico ファイルを読み込んで、読み込んだ Icon オブジェクトをフォームに設定しています。フォームのタイトルバーに表示されるアイコンや、タスクバーのアイコンが .NET デフォルトのアイコンではなく、独自のアイコン変更されます。