2011-08-01 7 views
6

"x.ani"というファイルをリソースファイルResources.resxにインポートしました。今、(確かに)..C#:リソースファイルからCursorをロードするには?

Cursor.Current = (Cursor)ResourcesX.GetObject("aero_busy.ani"); 

(「aero_busy.ani」)ResourceManager.GetObjectを使用して、そのファイルをロードしようとしているが、それはうまくいきませんでした:)

を私はリソースを使用して、現在のカーソルを変更するにはどうすればよいですオブジェクト?

+1

カーソルクラスは、アニメーションカーソルをサポートしていません。下の私の答えのように。 – Jethro

+0

@ Jethroありがとうございました:) –

答えて

6

一時ファイルにダンプし、ファイルメソッドからWin32ロードカーソルを使用するよりも良い方法はありませんでした。ハックはこのようなものになります(わかりやすくするために、ストリームからのデータを使って一時ファイルが書き込まれるような大きなコードのボイラープレートコードを削除しました)。また、すべての例外処理などが削除されました。

[DllImport("User32.dll", CharSet = CharSet.Ansi, BestFitMapping = false, ThrowOnUnmappableChar = true)] 
private static extern IntPtr LoadCursorFromFile(String str); 

public static Cursor LoadCursorFromResource(string resourceName) 
{   
    Stream cursorStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName);   

    // Write a temp file here with the data in cursorStream 

    Cursor result = new Cursor(LoadCursorFromFile(tempFile)); 
    File.Delete(tempFile); 

    return result. 
} 

これは(埋め込みリソースを読み込むときの名前空間を覚えている)として使用します。

Cursors.Current = LoadCursorFromResource("My.Namespace.Filename"); 
+1

Jethroからのコメント&回答に関しては、私はこの方法で.cur(アニメーションではない)カーソルのみを使用しました。このメソッドは色付きのカーソルを許可する必要があります。 –

+0

貴重な応答をありがとう:)私はちょうど私のプログラムが携帯用のものであることを望んでいた(スタブプログラムを呼んでも)私はExeファイルだけがコピーされなければならないことを意味する。しかし、あなたの提案は実装する価値があります:)もう一度感謝します。 –

3

私は、Cursorとして使用するには、カーソルに.cur拡張子を付ける必要があります。

//次のコードは、埋め込みリソースからカーソルを生成します。 //ファイル - >新規項目の追加 - >ローカルプロジェクト項目 - >カーソル - 新しいカーソルファイルをプロジェクトに追加します。 //ファイル - >新規項目の追加 - >ローカルプロジェクト項目 - >カーソル // 2. 16×16の画像タイプファイル:16×16

>各種タイプ - //イメージ - >現在のアイコンイメージを上記のMSDNから取られました。

更新:理由を見つけました。

「注注

カーソルクラスは、アニメーションカーソル(.ANIファイル)または黒と白以外の色でカーソルをサポートしていません。」

見つかりHere

+0

貴重な時間と応答ありがとう: 重要なヒントのために+1: –

17

私は(私は、Visual Studioを使用しています)プロジェクトのリソース部分にカーソル.CURファイルを追加することによってそれを行います。開発プログラムがロードできる限り、それが.curでなければならないかどうかはわかりません。

私のコードの変数宣言部分で、私はカーソルファイルからMemoryStreamを作成することを終われ:

private static System.IO.MemoryStream cursorMemoryStream = new System.IO.MemoryStream(myCurrentProject.Properties.Resources.myCursorFile); 

を...そしてあなたはMemoryStreamをからカーソルを作成することができます

private Cursor newCursor = new Cursor(cursorMemoryStream); 

これで、プログラム内で好きなようにカーソルを割り当てることができます。

pictureBox1.Cursor = newCursor; 

となり、新しいカーソルはプログラムの一部としてコンパイルされます。問題に数ターン後

+4

私はこの方法が他よりも優れていると思います! – moorara

+1

32ビット深度のカーソルでは機能しません – GorillaApe

4

、私はエレガントな解決策がある見つける:

internal static Cursor GetCursor(string cursorName) 
    { 
     var buffer = Properties.Resources.ResourceManager.GetObject(cursorName) as byte[]; 

     using (var m = new MemoryStream(buffer)) 
     { 
      return new Cursor(m); 
     } 
    } 
関連する問題