2011-07-12 10 views
9

MemoryStreamを使用してリソースファイルからCursorをロードすると、ArgumentExceptionが返されます。カーソルをロードするコードは次のとおりです。リソースファイルからCursorを読み込むとArgumentExceptionがスローされます

Cursor myCursor 
    = new Cursor(new MemoryStream(WaterforMGC.Properties.Resources.waterspray)); 
Cursor = myCursor; 

エラーが発生します。私は何が間違っているのか分かりません、私はCursor = myCursor;this.Cursor = myCursor;に変更しました。私は同じエラーを出しました。私はgameform.Cursor = myCursor;を試しましたが、それはまったく動作しませんでした。

 
System.ArgumentException: Image format is not valid. The image file may be corrupted. 
Parameter name: stream ---> System.Runtime.InteropServices.COMException (0x800A01E1): Exception from HRESULT: 0x800A01E1 (CTL_E_INVALIDPICTURE) 
    at System.Windows.Forms.UnsafeNativeMethods.IPersistStream.Load(IStream pstm) 
    at System.Windows.Forms.Cursor.LoadPicture(IStream stream) 
    --- End of inner exception stack trace --- 
    at System.Windows.Forms.Cursor.LoadPicture(IStream stream) 
    at WaterforMGC.gameform.Form1_Load(Object sender, EventArgs e) in C:\Users\Jan\Documents\Visual Studio 2008\Projects\WaterforMGC\WaterforMGC\Form1.cs:line 39 
    at System.Windows.Forms.Form.OnLoad(EventArgs e) 
    at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) 
    at System.Windows.Forms.Control.CreateControl() 
    at System.Windows.Forms.Control.WmShowWindow(Message& m) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
+0

画像はどのような画像形式ですか? –

+0

例外メッセージは読まれるはずです...明らかに、エラーを修正する例外が発生した行の後の行を変更したため、あなたはそれを行っていません。 –

+0

@Dan:彼は何を知っているのか疑問に思います彼は例外的なテキストのその巨大な壁を探していた。私はそれを助けてくれると期待しています。 – user7116

答えて

11

問題は、例外の非常に最初の行に綴られる:

System.ArgumentExceptionの:画像形式が有効ではありません。画像ファイル が壊れている可能性があります。

は、あなたがロードしている画像が破損していない状態であることを確認され、カーソルクラス は色でアニメーションカーソルにまたはカーソルを(.ANIファイル)をサポートしていませんcompatible with the image format for cursors?

です白黒以外。

カーソルイメージをロードして動作する他の場所はありますか?あなたはここで何がうまくいかないのか判断するためにそれを処理することができます。

+0

はい、確信しています。カーソルに.curファイルを使用しています。私は何が間違っているのかわかりません...そして、私はカーソルをC#にロードしたことがありません。 – janj

+2

@janj:[MSDN](http://msdn.microsoft.com/en-us/library/system.windows.forms)。カーソル%28v = VS.80%29.aspx)、 "Cursorクラスはアニメーションカーソル(.aniファイル)または黒と白以外の色を持つカーソルをサポートしていません。それらはアニメーションか色か – user7116

+0

@sixlettervariablesそれは着色されています。だから私はそれを使用することはできません... – janj

3

何らかの理由により、カーソルクラスは読み込みにはあまりにも不安定です。あなたは、Windows APIを使用してハンドルを作成し、それをカーソルクラスに渡すことができます。

C#:

//(in a class) 
public static Cursor ActuallyLoadCursor(String path) { 
    return new Cursor(LoadCursorFromFile(path)) 
} 
[System.Runtime.InteropServices.DllImport("user32.dll")] 
private static extern IntPtr LoadCursorFromFile(string fileName); 

VB.Net:

'(in a class)' 
Public Shared Function ActuallyLoadCursor(path As String) As Cursor 
    Return New Cursor(LoadCursorFromFile(path)) 
End Function 
<System.Runtime.InteropServices.DllImport("user32.dll")> 
Private Shared Function LoadCursorFromFile(fileName As String) As IntPtr 
End Function 
6

実際には、.NETにカラーカーソルを読み込むことができます。あなたはちょうどwin32を使用する必要があります。

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
internal static extern IntPtr LoadImage(IntPtr hinst, string lpszName, uint uType, int cxDesired, int cyDesired, uint fuLoad); 

//........ 

const int IMAGE_CURSOR = 2; 
const uint LR_LOADFROMFILE = 0x00000010; 
IntPtr ipImage = LoadImage(IntPtr.Zero, 
    @"c:\mycolor.cur", 
    IMAGE_CURSOR, 
    0, 
    0, 
    LR_LOADFROMFILE); 

Cursor testCursor = new Cursor(ipImage); 

Cursor.Current = testCursor; 
+1

メモリストリームからどうすればいいですか?ストリームはassembly.GetManifestResourceStream(...から来ています – Pedro77

0

プロジェクトのリソースとしてカーソルを持っているので、あなたがこれを行うことができます:

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

public static Cursor LoadCursorFromResource(Icon icono) // Assuming that the resource is an Icon, but also could be a Image or a Bitmap 
{ 
    // Saving cursor icon in temp file, necessary for loading through Win API 
    string fileName = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".cur"; 
    using (var fileStream = File.Open(fileName, FileMode.Create)) 
    { 
     icono.Save(fileStream); 
    } 

    // Loading cursor from temp file, using Win API 
    Cursor result = new Cursor(LoadCursorFromFile(fileName)); 

    // Deleting temp file 
    File.Delete(fileName); 

    return result; 
} 

次に、カーソルを取得するために、あなただけの操作を行います。

Cursor myCursor = LoadCursorFromResource(WaterforMGC.Properties.Resources.waterspray); 

読書Win APIを使用してファイルからカーソルまでのカーソルは、MSDNのCursorクラスの制限にもかかわらず、アニメーションカーソルまたはカラーカーソルを処理できます。

私の回答はthis another SO answerに基づいています(.NET 4.0でうまくテストされています)。

関連する問題