カーソルをリソースからセットする。

Step 1.カーソルをリソースからロードする

なんというか、いろいろ迷いがち。

public Cursor(Type type,string resource); 

なんていうコンストラクタがあるけど、使ったら負け。

ストリームで返せって言ってるので、素直にMemoryStreamを使いましょう。 例:

var csor = new Cursor(new MemoryStream(Properties.Resources.csor)); 

ただし。

これで読むと、カーソルは白黒になります。

メモ Cursor クラスでは、アニメーション カーソル (.ani ファイル)、またはカラーのカーソルはサポートされていません。

http://msdn.microsoft.com/ja-jp/library/system.windows.forms.cursor%28VS.71%29.aspx

仕様です。仕様かーそーなのかー。

でも他のアプリケーションはバリバリカラーですね。どうしましょう。

Step 2.カーソルをカラーでリソースからロードする

カラーで読む方法は無いのかって?あるんです。

Icon icon = new Icon(@"orignal.ico");
Cursor cur = new Cursor(icon.Handle);
Cursor = cur;

ただし、ホットスポットは中心になります。なんとまぁ使えない

Step 3.最終奥義

困った時のWinAPI。

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]  
extern public static IntPtr LoadImage(IntPtr Instance, String Name, uint Type, int xDesired, int yDesired, uint LoadOption);  
public static System.Windows.Forms.Cursor LoadCursor(String LoadCursorName)
{
         IntPtr ptr = LoadImage(IntPtr.Zero, LoadCursorName, 2, 0, 0, 0x10 | 0x40);
        if (ptr == IntPtr.Zero)
        {
            throw new Exception("カーソルのロードに失敗しました。(" + Marshal.GetLastWin32Error() + ")");
       }
       return new System.Windows.Forms.Cursor(ptr);  
}
  

これで、リソースを一旦ファイルにして読めばいいと思うよ!ほら、GetTempFileNameとかあるし!

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
extern public static IntPtr LoadImage(IntPtr Instance, String Name, uint Type, int xDesired, int yDesired, uint LoadOption); 
public static System.Windows.Forms.Cursor LoadCursor(String LoadCursorName) 
{ 
       IntPtr ptr = LoadImage(IntPtr.Zero, LoadCursorName, 2, 0, 0, 0x10 | 0x40); 
      if (ptr == IntPtr.Zero) 
      { 
          throw new Exception("カーソルのロードに失敗しました。(" + Marshal.GetLastWin32Error() + ")"); 
     } 
     return new System.Windows.Forms.Cursor(ptr); 
} 

以上、備忘録。つかれた。

細かいところTypict 1.xのソースからパクったからバグあるかも。あと、Dispose関連は緩め。気をつけてね。(MemoryStreamに関してはCloseいらないみたいだけど)

カーソルをリソースからセットする。” への1件のコメント

  1. ピンバック: CrystalMark13 Dev2

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です