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 ?

0voto

huncutharcos Points 11
    [DllImport("User32.dll")]
    private static extern IntPtr LoadCursorFromFile(string str);

    Cursor SetCursor(byte[] resourceName)
    {
        string tempPath = @"C:\Users\Public\Documents\temp.cur";
        File.WriteAllBytes(tempPath, resourceName);
        Cursor result = new Cursor(LoadCursorFromFile(tempPath));
        File.Delete(tempPath);
        return result;
    }

0voto

entiat Points 370

Rassembler tout ça...

Il s'agit d'une combinaison des ressources fortement typées que Visual Studio fournit maintenant, ainsi que de Win32 LoadCursorFromFile (par l'intermédiaire de Réponse originale d'Anders en utilisant des charges de ressources manifestes).

J'ai également ajouté un cache des curseurs instanciés, parce que c'est approprié pour mon application. Supprimez cela si vous n'en avez pas besoin.

namespace Draw
{
/// <summary>
/// Controls use of all the cursors in the app, supports loading from strongly typed resources, and caches all references for the lifetime of the app.
/// </summary>
public static class Cursors
{
    // Cache of already loaded cursors
    private static ConcurrentDictionary<byte[], Cursor> cache = new ConcurrentDictionary<byte[], Cursor>();

    /// <summary>
    /// Returns a cursor given the appropriate id from Resources.Designer.cs (auto-generated from Resources.resx). All cursors are
    /// cached, so do not Dispose of the cursor returned from this function.
    /// </summary>
    /// <param name="cursorResource">The resource of the cursor to load. e.g. Properties.Resources.MyCursor (or byte array from .cur or .ani file)</param>
    /// <returns>The cursor. Do not Dispose this returned cursor as it is cached for the app's lifetime.</returns>
    public static Cursor GetCursor(byte[] cursorResource)
    {
        // Have we already loaded this cursor? Use that.
        if (cache.TryGetValue(cursorResource, out Cursor cursor))
            return cursor;

        // Get a temporary file
        var tmpFile = Utils.GetTempFile();

        try
        {
            // Write the cursor resource to temp file
            File.WriteAllBytes(tmpFile, cursorResource);

            // Read back in from temp file as a cursor. Unlike Cursor(MemoryStream(byte[])) constructor, 
            // the Cursor(Int32 handle) version deals correctly with all cursor types.
            cursor = new Cursor(Win32.LoadCursorFromFile(tmpFile));

            // Update dictionary and return
            cache.AddOrUpdate(cursorResource, cursor, (key, old) => cursor);
            return cursor;
        }
        finally
        {
            // Remove the temp file
            Utils.TryDeleteFile(tmpFile);
        }
    }
}
}

Exemple d'appel :

Cursor = Draw.Cursors.GetCursor(Properties.Resources.Cursor_ArrowBoundary);

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