IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Ajouter un texte au curseur


Sujet :

Windows Presentation Foundation

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Points : 77
    Points
    77
    Par défaut Ajouter un texte au curseur
    Bonjour,

    J'aimerais customiser le curseur de la souris en ajoutant un texte en bas à droite du curseur courant.

    Pour ça, j'utilise l'API Win32 LoadCursor pour créer un objet bitmap à partir de l'id du curseur (IDC_):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IntPtr handle = LoadCursor(IntPtr.Zero, IDC_Arrow);
    Je construis alors mon propre curseur en créant un control graphique composé de la Bitmap et d'un texte (Textblock).

    Malheureusement, cela ne fonctionne que pour les curseurs system de base. Pour certains curseurs, cela ne fonctionne pas (ex. : ScrollNE).
    Est-ce qu'il faut fournir un autre handle que IntPtr.Zero pour certains curseurs ? Comment le trouver ?

    Merci d'avance.
    AL2000

  2. #2
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    le premier param de LoadCursor est le handle d'instance de module contenant le curseur.
    Si on peut mettre NULL pour les pointeurs "de base", il faut un hinst valide vers le module contenant le curseur pour un pointeur "custom".
    Par exemple, si ton appli contient son propre cursor tu lui passeras le handle de l'instance de ton programme.
    Je ne connais pas le curseur ScrollNE, du coup aucune idée d'où tu peux le trouver.
    Plus je connais de langages, plus j'aime le C.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Points : 77
    Points
    77
    Par défaut
    En fait, le curseur que j'ai cité fait partie de la liste des curseurs proposés par WPF (peut-être présent dans PresentationCore.dll).
    Donc si je comprend bien, si je lui passe le handle de l'instance de mon appli, cela devrait fonctionner ?

  4. #4
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Tu peux essayer, ça mange pas de pain
    Sinon, si t'es sûr du module contenant le cursor, tu dois pouvoir obtenir une instance dessus avec GetModuleHandle.
    Plus je connais de langages, plus j'aime le C.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Points : 77
    Points
    77
    Par défaut
    J'ai essayé avec le handle de l'application mais cela ne fonctionne pas.
    J'ai également essayé avec le handle sur le module PresentationCore.dll mais ça ne fonctionne pas non plus.

  6. #6
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    J'ai scanné le répertoire contenant PresentationCore.dll (C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.0), et je n'ai trouvé qu'une icone dans PresentationBuildTasks.dll. J'ai également demandé à google des info pour pister ce ScrollNE, mais rien de probant jusque là.
    Plus je connais de langages, plus j'aime le C.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Points : 77
    Points
    77
    Par défaut
    En fait, il s'agit des curseurs dont le IDC n'est pas présent dans la liste des curseurs système:
    http://pinvoke.net/default.aspx/Constants/IDC_.html

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Points : 77
    Points
    77
    Par défaut
    J'ai regardé le code source des classes WPF concernant les curseurs.
    On retrouve bien les IDC de base et ceux spécifiques à WPF:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    private static readonly int[] CursorTypes = {
                0, // None
                NativeMethods.IDC_NO,
                NativeMethods.IDC_ARROW,
                NativeMethods.IDC_APPSTARTING,
                NativeMethods.IDC_CROSS,
                NativeMethods.IDC_HELP,
                NativeMethods.IDC_IBEAM,
                NativeMethods.IDC_SIZEALL,
                NativeMethods.IDC_SIZENESW,
                NativeMethods.IDC_SIZENS,
                NativeMethods.IDC_SIZENWSE,
                NativeMethods.IDC_SIZEWE,
                NativeMethods.IDC_UPARROW,
                NativeMethods.IDC_WAIT,
                NativeMethods.IDC_HAND,
                NativeMethods.IDC_ARROW + 119, // PenCursor
                NativeMethods.IDC_ARROW + 140, // ScrollNSCursor
                NativeMethods.IDC_ARROW + 141, // ScrollWECursor
                NativeMethods.IDC_ARROW + 142, // ScrollAllCursor
                NativeMethods.IDC_ARROW + 143, // ScrollNCursor
                NativeMethods.IDC_ARROW + 144, // ScrollSCursor
                NativeMethods.IDC_ARROW + 145, // ScrollWCursor
                NativeMethods.IDC_ARROW + 146, // ScrollECursor
                NativeMethods.IDC_ARROW + 147, // ScrollNWCursor
                NativeMethods.IDC_ARROW + 148, // ScrollNECursor
                NativeMethods.IDC_ARROW + 149, // ScrollSWCursor
                NativeMethods.IDC_ARROW + 150, // ScrollSECursor
                NativeMethods.IDC_ARROW + 151 // ArrowCDCursor
           };
    Ce tableau est utilisé pour charger le curseur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _cursorHandle = SafeNativeMethods.LoadCursor(new HandleRef(this,IntPtr.Zero), (IntPtr)(CursorTypes[(int)cursorType]));
    Cette méthode LoadCursor appelle alors l'API Win32:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [DllImport(ExternDll.User32, CharSet=System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
    public static extern NativeMethods.CursorHandle LoadCursor(HandleRef hInst, IntPtr iconId);
    J'ai essayé de faire la même chose mais ce ne fonctionne pas

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 025
    Points : 5 462
    Points
    5 462
    Par défaut
    C'est pas plus simple d'avoir un control qui suit ta souris?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Points : 77
    Points
    77
    Par défaut
    J'ai également essayé avec un Tooltip ou une Popup. Ça fonctionne bien mais on ne peut pas facilement le/la positionner par rapport au curseur.
    J'aimerais le/la positionner en bas à droite du curseur mais je n'arrive pas à récupérer la taille réelle de l'image du curseur.
    J'ai voulu utiliser SystemParameters.CursorWidth / SystemParameters.CursorHeight mais ça retourne toujours 32x32.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 163
    Points : 77
    Points
    77
    Par défaut
    Au final, je vais rester sur la solution du Popup en utilisant SystemParameters.CursorWidth / SystemParameters.CursorHeight converties en dpi.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajouter du texte dans une edit box
    Par raf_gug dans le forum MFC
    Réponses: 10
    Dernier message: 23/05/2013, 10h00
  2. Ajouter du texte après le curseur
    Par CodeMikiman dans le forum Windows Forms
    Réponses: 5
    Dernier message: 21/01/2008, 16h55
  3. TextArea: ajouter un texte là ou il y a le curseur
    Par Terminator dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 07/04/2006, 00h32
  4. Ajout de texte dans un fichier
    Par willowII dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 24/08/2004, 19h30
  5. [TWebBrowser] Comment ajouter du texte ?
    Par el_diablos dans le forum Composants VCL
    Réponses: 18
    Dernier message: 06/07/2004, 09h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo