カスタムコントロールのデザイン時動作 のバックアップ(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: 7832 (from 2010/06/03), today: 3, yesterday: 2