2011-08-01 14 views
6

He importado un archivo "x.ani" en Resource file Resources.resx. Ahora intentar cargar ese archivo usando ResourceManager.GetObject ("aero_busy.ani")C#: ¿Cómo cargar el Cursor del archivo de recursos?

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

pero no funcionó .. (sin duda) :)

¿Cómo puedo cambiar el cursor actual utilizando recursos ¿objeto?

+1

clase el cursor no admite cursores animados. Como en mi respuesta a continuación. – Jethro

+0

@Jethro gracias entendido :) –

Respuesta

6

No he encontrado ninguna manera mejor que descargar a un archivo temporal y usar el cursor de carga Win32 desde el método de archivo. El truco es algo así (eliminé una gran parte del código repetitivo para mayor claridad, en el que un archivo temporal se escribe con los datos de la transmisión). Además, se eliminó todo el manejo de excepciones, etc.

[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. 
} 

Lo utilizará como (recuerde los espacios de nombres al cargar recursos incrustados).

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

Con respecto al comentario y respuesta de Jethro, solo he usado cursores .cur (no animados) con este método. Este método debería permitir cursores de colores. –

+0

gracias por la valiosa respuesta :) Solo quería que mi programa fuera portátil (llame también a un programa de código auxiliar) Quiero decir que solo se debe copiar un archivo Exe. Sin embargo, vale la pena implementar sus sugerencias :) gracias de nuevo. –

3

Creo que el problema tiene que ver con el hecho de que el cursor debe tener .cur extensión con el fin de ser utilizado como cursor.

// Lo siguiente genera un cursor desde un recurso incrustado.

// Para añadir un cursor personalizado, crear o utilizar un mapa de bits de 16x16 existente // 1. Añadir un nuevo archivo de cursor a su proyecto: // Archivo-> Añadir nuevo Item-> Local Proyecto de los items> Cursor presentar // 2. Seleccione el tipo de imagen de 16x16: // Imagen-> actual imagen de icono tipos-> 16x16

Lo anterior fue tomada del MSDN.

Actualización: Encontré la respuesta por qué.

"Nota Nota

La clase cursor no admite cursores animados (archivos .ani) o cursores con colores distintos del blanco y negro."

encontrado Here

+0

Gracias por el valioso tiempo y Respuesta :) +1 para consejos importantes :) –

17

lo hago añadiendo el archivo .cur cursor en la parte de recursos del proyecto (estoy usando Visual Studio). No estoy seguro de si debería ser .cur, siempre y cuando el programa de desarrollo pueda cargarlo.

Habiendo hecho de que en la parte de declaración de variables de mi código se crea un MemoryStream del archivo de cursor:

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

... y entonces usted puede crear el cursor desde la MemoryStream:

private Cursor newCursor = new Cursor(cursorMemoryStream); 

A continuación, puede asignar el cursor como desee dentro del programa, por ejemplo

pictureBox1.Cursor = newCursor; 

y el cursor nuevo se compila como parte del programa.

+4

¡Creo que esta manera es mejor que otras! – moorara

+1

pero no funciona con cursores de profundidad de 32 bits – GorillaApe

4

después de unas cuantas vueltas al tema, creo que la solución elegante es:

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); 
     } 
    } 
Cuestiones relacionadas