web-dev-qa-db-fra.com

Comment changer le curseur de la souris en un curseur personnalisé lorsque vous travaillez avec des applications Windows Forms?

Dans une UserControl, je souhaite remplacer le curseur de la souris par une flèche en une icône représentant une main.
Ce que je fais actuellement est la suivante:

this.Cursor = Cursors.Hand;

C'est très gentil, cela me donne un curseur de souris ressemblant à ceci:

enter image description here

Mais voici mon problème ... cela montre une main avec un doigt pointé.
Ce dont j'ai besoin, c'est d'une main "agrippante", plus semblable à celle-ci:

enter image description here

Comment puis-je faire cela?, Comment puis-je charger un fichier d'icône (.ico), un fichier de curseur (.cur) ou un fichier d'image (.png) et l'utiliser comme curseur de souris? 

37
Bart Gijssens

Si vous avez un fichier de curseur:

Cursor myCursor = new Cursor("myCursor.cur");
myControl.Cursor = myCursor;

sinon vous devez en créer un:

quelques informations supplémentaires sur curseurs personnalisés

19
fixagon

Avez-vous essayé System.Windows.Forms.Cursor curs = new System.Windows.Forms.Cursor(file_name);?

2
Djole

L'utilisation des curseurs personnalisés avec la classe WinForms Cursor implique que, lorsque le constructeur de flux, de nom de fichier et de ressources est surchargé, le fichier .cur fourni doit être noir et blanc en couleur. 

Cela signifie que cela ne fonctionnera pas si les fichiers .cur contiennent des couleurs autres que le noir et le blanc.

Cursor myCursor = new Cursor("myCursor.cur");
myControl.Cursor = myCursor;

Il existe un moyen de contourner cette limitation en utilisant la surcharge du constructeur de descripteurs Windows:

Créez le handle en utilisant l'API Windows:

[System.Runtime.InteropServices.DllImport("user32.dll")]
public static extern IntPtr LoadCursorFromFile(string fileName);

Ensuite, transmettez-le au constructeur Cursor approprié, comme ceci: 

IntPtr handle = LoadCursorFromFile("myCursor.cur");
Cursor myCursor = new Cursor(handle);
myControl.Cursor = myCursor;

J'espère que cela empêchera d'autres personnes de se gratter la tête en jetant un ArgumentException indiquant: Image format is not valid. The image file may be corrupted. lors de l'utilisation de l'autre constructeur Cursor avec un fichier .cur contenant de la couleur. 

1
Derek W

J'ai testé cette méthode. C'est bon. Ceci est mon application:

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    public static extern IntPtr LoadCursorFromFile(string fileName);
    Cursor myCursor;
    private void tsbtn_ZoomIn_Click(object sender, EventArgs e)
    {
        IntPtr handle = LoadCursorFromFile("view_zoom_in.cur");
        myCursor = new Cursor(handle);
        zg1.Cursor = myCursor;
    }
0
nult2003