カスタムコントロールのデザイン時動作 の履歴(No.2)
更新やりたいこと†
カスタムコントロールのデザイン時の動作をカスタマイズしたい。
具体的には、
- 配列プロパティをコレクションエディタで編集する
- ComponentDesigner / ControlDesigner を元に独自のデザイン時動作を行う
とりあえず関係ない部分も含めてメモ†
後で別のページに動かすかも。
リソースに埋め込んだカーソルを使う方法†
http://rararahp.cool.ne.jp/cgi-bin/lng/dotnet/dotnetlng.cgi?print+200212/02120004.txt
http://dobon.net/vb/dotnet/programing/vsresource.html
- 外部ファイルの中身を丸ごとリソースに埋め込んでおいて、 実行時に byte[] として読み出すことができる
- MemoryStream を使って byte[] を Stream にできる
- カーソルを Stream から作成することができる
この3つを組み合わせて、リソースに埋め込んでおいたカーソルを 以下のように使う。
カーソルをリソースに埋め込む†
- カーソルは "MyCursor.cur" と言うファイルに入っているとする
- [プロジェクト]-[既存項目の追加] から "MyCursor.cur" をプロジェクトに追加する
- Properties/Resources.resx を開いておき、ソリューションエクスプローラから "MyCursor.cur" をドロップする
- できたアイコンは "MyCursor" という名前になるので、分かりやすいように "MyCursor_cur" に直しておく
- "MyCursor.cur" はリソース名の識別子として適当ではないので "MyCursor_cur" としている
こうしておくと、プロジェクト名 (例えば MyApp) と同名の名前空間に
LANG:C# namespace MyApp.Properties{ internal class Resources { ... public static byte[] MyCursor { get; } ... } }
というように、Resources というクラスが定義され、 その static メンバーとして MyCursor を byte[] の形で読めるようになる。
デフォルトではアクセス制御が internal になるので、外部アセンブリからは 読み出せない。
これを外からでも読めるようにするには、Resources.resx の編集画面の 上部にある [アクセス制御子] というのを public にする。
一括じゃなくて各リソースごとに制御できたら便利なのに、と思うのは私だけ?
プログラムから使う†
LANG:C# using System.IO; // MemoryStream using System.Windows.Forms; // Cursor ... Cursor CreateCursorFromResource(byte[] CursorResource) { using(var stream = new MemoryStream(CursorResource)) return new Cursor(stream); } ... Cursor MyCursor= null; ... if(MyCursor==null) MyCursor= CreateCursorFromResource( MyApp.Properties.Resources.MyCursor_cur); Cursor.Current= MyCursor;
Counter: 8468 (from 2010/06/03),
today: 1,
yesterday: 1