カスタムコントロールのデザイン時動作 のバックアップの現在との差分(No.2)

更新


  • 追加された行はこの色です。
  • 削除された行はこの色です。
[[公開メモ]]

* やりたいこと [#yc9b2862]

カスタムコントロールのデザイン時の動作をカスタマイズしたい。

具体的には、

- 配列プロパティをコレクションエディタで編集する
- ComponentDesigner / ControlDesigner を元に独自のデザイン時動作を行う

* とりあえず関係ない部分も含めてメモ [#m3f9a03a]

後で別のページに動かすかも。

** リソースに埋め込んだカーソルを使う方法 [#ic80703f]

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つを組み合わせて、リソースに埋め込んでおいたカーソルを
以下のように使う。

*** カーソルをリソースに埋め込む [#i919277a]

- カーソルは "MyCursor.cur" と言うファイルに入っているとする
- [プロジェクト]-[既存項目の追加] から "MyCursor.cur" をプロジェクトに追加する
- Properties/Resources.resx を開いておき、ソリューションエクスプローラから "MyCursor.cur" をドロップする
- できたアイコンは "MyCursor" という名前になるので、分かりやすいように "MyCursor_cur" に直しておく
- "MyCursor.cur" はリソース名の識別子として適当ではないので "MyCursor_cur" としている
- Resources.resx の編集画面の上部にある [アクセス制御子] を internal または public にする。

こうしておくと、プロジェクト名 (例えば MyApp) と同名の名前空間に

 LANG:C#
 namespace MyApp.Properties{
     internal class Resources {
         ...
 
         public static byte[] MyCursor { get; }
         ...
 
     }
 }

というように、Resources というクラスが定義され、
その static メンバーとして MyCursor を byte[] の形で読めるようになる。

デフォルトではアクセス制御が internal になるので、外部アセンブリからは
読み出せない。
アクセス制御は internal / public から選べるのだが、これはすべての
リソースに対して一括でしか指定できないみたい?

これを外からでも読めるようにするには、Resources.resx の編集画面の
上部にある [アクセス制御子] というのを public にする。

一括じゃなくて各リソースごとに制御できたら便利なのに、と思うのは私だけ?

*** プログラムから使う [#m7502975]

 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: 7832 (from 2010/06/03), today: 3, yesterday: 2