8 votes

C# : Comment charger un curseur à partir d'un fichier de ressources ?

J'ai importé un fichier "x.ani" dans le fichier de ressources Resources.resx. J'essaie maintenant de charger ce fichier en utilisant ResourceManager.GetObject("aero_busy.ani").

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

mais cela n'a pas fonctionné (certainement) :)

Comment puis-je changer le curseur actuel en utilisant un objet ressource ?

20voto

Greg Points 333

Je le fais en ajoutant le fichier curseur .cur dans la partie Ressources du projet (j'utilise Visual Studio). Je ne sais pas s'il doit s'agir d'un fichier .cur, du moment que le programme de développement peut le charger.

Après avoir fait cela dans la partie déclaration des variables de mon code, je crée un MemoryStream à partir du fichier curseur :

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

...et ensuite vous pouvez créer le curseur à partir du MemoryStream :

private Cursor newCursor = new Cursor(cursorMemoryStream);

Vous pouvez ensuite affecter le curseur comme vous le souhaitez dans le programme, par ex.

pictureBox1.Cursor = newCursor;

et le nouveau curseur est compilé comme faisant partie du programme.

8voto

Anders Forsgren Points 5513

Je n'ai pas trouvé de meilleur moyen que de vider un fichier temporaire et d'utiliser la méthode Win32 de chargement du curseur à partir du fichier. Le hack ressemble à ceci (j'ai supprimé un gros morceau de code passe-partout pour plus de clarté, dans lequel un fichier temporaire est écrit avec les données du flux). De même, toute la gestion des exceptions, etc. a été supprimée.

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

Vous pouvez l'utiliser comme suit (n'oubliez pas les espaces de noms lorsque vous chargez des ressources intégrées).

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

5voto

harveyt Points 150

Après quelques tours sur la question, je trouve que la solution élégante est :

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

3voto

Jethro Points 4522

Je pense que le problème est lié au fait que le curseur doit avoir une extension .cur pour pouvoir être utilisé comme curseur.

// Ce qui suit génère un curseur à partir d'une ressource intégrée.

// Pour ajouter un curseur personnalisé, créez ou utilisez un bitmap 16x16 existant. // 1. ajoutez un nouveau fichier curseur à votre projet : // Fichier->Ajouter un nouvel élément->Éléments locaux du projet->Fichier curseur // Sélectionnez le type d'image 16x16 : // Image->Types d'images d'icônes actuels->16x16

Ce qui précède est tiré de MSDN .

Mise à jour : J'ai trouvé la réponse.

"Note Note

La classe Cursor ne prend pas en charge les curseurs animés (fichiers .ani) ni les curseurs dont les couleurs ne sont pas en noir et blanc."

Trouvé Ici

1voto

Tony Points 11

Écrire un fichier sur le disque puis l'importer comme curseur n'est pas pratique, il existe une solution plus simple. Convertissez votre .cur en .ico et importez votre curseur comme une ressource d'icône. Ensuite, vous pouvez simplement faire :

Cursor c = new Cursor(Properties.Resources.mycursor.Handle);

Cela permettra de prendre en charge correctement les couleurs 32 bits.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X