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 Discussion :

API Windows C récupérer les coordonnées d'un bouton


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Points : 18
    Points
    18
    Par défaut API Windows C récupérer les coordonnées d'un bouton
    Bonjour,

    Existe-t-il une fonction qui permette de récupérer les coordonnées d'un bouton. J'ai vu qu'il existe GetWindowRect pour récupérer les coordonnées d'une fenêtre mais j'ai pas trouvé pour un bouton.
    Merci pour votre aide

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    tu récupères le handle de ton bouton avec GetDlgItem() et tu appelles GetWindowRect() avec ce handle.

    Si tu travaille en MFC, tu peux utiliser les classes CWnd
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Points : 18
    Points
    18
    Par défaut API Windows C récupérer les coordonnées d'un bouton
    J'ai essayé de récupérer le handle avec GetDlgItem() et j'ai appelé GetWindowRect() avec ce handle, mais cela me donne des coordonnées qui ne correspondent pas au bouton. Le bouton n'est pas défini par CreateWindow mais directement par CONTROL dans le fichier .rc

    HWND hZonePas ;
    RECT rZonePas ;

    hZonePas=GetDlgItem(hMacc, AZONE_PAS) ;
    GetWindowRect(hZonePas, &rZonePas) ;


    CONTROL " notes+" , AZONE_PAS, "BUTTON", BS_RADIOBUTTON | WS_CHILD |
    WS_VISIBLE | WS_GROUP | WS_TABSTOP, 130, 325, 32, 12

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Que dit spy++?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 059
    Points : 12 095
    Points
    12 095
    Par défaut
    "hMacc" est bien l'handle de la boîte de dialogue ?

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    hMacc est le Handle défini dans la fonction qui traite la boîte de dialogue.

    La fonction est appellée par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    lpfnDialogProc = MakeProcInstance ((DLGPROC) main_accords,hinst) ;
    DialogBox (hinst, "main_accords", hwnd, lpfnDialogProc) ;
    FreeProcInstance (lpfnDialogProc) ;
    InvalidateRect (hwnd, NULL, TRUE); /* force paint */
    et la boîte de dialogue est définie dans le fichier .rc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    main_accords DIALOG 20, 20, 460, 366
                 STYLE WS_POPUP | WS_CAPTION | WS_VISIBLE | WS_SYSMENU
                 CAPTION "  Accords GUITARE"
                 FONT 10, "Helv".....
    la fonction qui traite la boîte de dialogue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BOOL FAR PASCAL main_accords (HWND hMacc, unsigned iMessage, WORD wParam, LONG lParam)
    
    {....
    Je ne sais pas ce que c'est que spy++

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Gasp!
    Mais cette déclaration de DialogProc doit avoir au moins qunze ans!
    Elle est faite pour Win16!

    La bonne déclaration est ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INT_PTR CALLBACK main_accords (HWND hMacc, unsigned int iMessage, WPARAM wParam, LPARAM lParam)
    Et retire le cast en (DLGPROC) après avoir corrigé: Ça devrait pouvoir compiler sans.

    Edit: De plus, MakeProcInstance() est également obsolète.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Points : 18
    Points
    18
    Par défaut Je suis trop vieux
    C'est un vieux programme que j'ai repris et ma doc ce sont les bouquins de Jim Conger sur L'API Windows.

    Par quoi je peux remplacer MakeProcInstance stp ?

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Le MakeProcInstance, tu peux désormais le supprimer et utiliser directement le pointeur de fonction (sans cast, une fois corrigé).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    lpfnDialogProc = MakeProcInstance ((DLGPROC) main_accords,hinst) ;
    DialogBox (hinst, "main_accords", hwnd, lpfnDialogProc) ;
    FreeProcInstance (lpfnDialogProc) ;
    InvalidateRect (hwnd, NULL, TRUE); /* force paint */
    j'ai codé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    lpfnDialogProc =  (main_accords,hinst) ;
    DialogBox (hinst, "main_accords", hwnd, lpfnDialogProc) ;
    FreeProcInstance (lpfnDialogProc) ;
    InvalidateRect (hwnd, NULL, TRUE); /* force paint */
    Mais cela plante le programme

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Ceci devrait suffire:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DialogBox (hinst, "main_accords", hwnd, main_accords) ;
    InvalidateRect (hwnd, NULL, TRUE); /* force paint */
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Un grand merci pour tes précieux conseils, je rajeunis de 40 ans.
    Une bonne chose de faite, mais cela ne règle pas le problème initial de GetWindowRect.

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Peux-tu montrer le code où tu appelles GetWindowRect(), et décrire le problème?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    La fonction dans laquelle je fais le GetWindowRect :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    HWND hZonePas ;
    RECT rZonePas;
    INT_PTR CALLBACK main_accords (HWND hMacc, unsigned iMessage, WORD wParam, LONG lParam)
    La séquence du GetWindowRect qui ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    case WM_INITDIALOG :
    hZonePas=GetDlgItem(hMacc, AZONE_PAS) ;
    GetWindowRect(hZonePas, &rZonePas) ;
    La définition de CONTROL AZONE_PAS dans mon fichier .rc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CONTROL " notes+" , AZONE_PAS, "BUTTON", BS_RADIOBUTTON | WS_CHILD |
    	 WS_VISIBLE | WS_GROUP | WS_TABSTOP,  130,  325, 32, 12

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 059
    Points : 12 095
    Points
    12 095
    Par défaut
    Sur mon VS2008, cela marche très bien.
    Mais le designer a convertis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONTROL " notes+" , AZONE_PAS, "BUTTON", BS_RADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP,  130,  325, 32, 12
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        RADIOBUTTON     " notes+",AZONE_PAS,130,325,32,12,WS_GROUP | WS_TABSTOP

  16. #16
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Peux-tu montrer le code où tu appelles GetWindowRect(), et décrire le problème?
    En tenant compte des derniers développements, bien sûr. En clair, après les corrections, qu'est-ce qui ne marche toujours pas, et quels sont les symptômes?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    J'ai remplacé les définitions des RADIOBUTTONs mais cela ne règle pas le problème.

  18. #18
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 059
    Points : 12 095
    Points
    12 095
    Par défaut
    Chez moi, ça marche.
    Pouvez-vous nous envoyer un projet qui reproduit le problème ?

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 23
    Points : 18
    Points
    18
    Par défaut
    Le problème est expliqué dans mon premier message.
    J'essaie de récupérer les coordonnées d'un RADIOBUTTON défini dans le fichier .rc pour afficher un commentaire en bas de la fenêtre quand je passe la souris sur ce RADIOBUTTON.
    Pour vérifier les coordonnées obtenues je dessine un rectangle avec ces coordonnées et c'est comme cela que je constate que cela ne le fait pas bien.

    Dans le fichier .rc définition du RADIOBUTTON :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RADIOBUTTON  " notes+", AZONE_PAS,  130, 325, 32, 12, WS_GROUP | WS_TABSTOP
    Définition de la fonction dans laquelle j'ai le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    RECT rZonePas;
    HWND hZonePas ;
    INT_PTR CALLBACK main_accords (HWND hMacc, unsigned iMessage, WORD wParam, LONG lParam)
    Dans WM_INITDIALOG de cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    hZonePas=GetDlgItem(hMacc, AZONE_PAS) ;
    GetWindowRect(hZonePas, &rZonePas) ;
    Dans WM_PAINT de cette fonction j'ai mis un RoundRect pour vérifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RoundRect (ps.hdc, rZonePas.left, rZonePas.top, rZonePas.right, rZonePas.bottom , 20, 20) ;
    Le rectangle n'est pas à la bonne place, j'obtiens les coordonnées suivantes :
    rZonePas.left=483,rZonePas.right=547,rZonePas.top=905,rZonePas.bottom=929

    Merci pour les réponses

  20. #20
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 059
    Points : 12 095
    Points
    12 095
    Par défaut
    GetWindowRect Function
    The GetWindowRect function retrieves the dimensions of the bounding rectangle of the specified window. The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen.
    RoundRect Function
    ...
    nLeftRect [in]
    The x-coordinate, in logical coordinates, of the upper-left corner of the rectangle.
    Utilisez au moins le même référentiel.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Récupérer les coordonnées de l'API
    Par shyfu dans le forum IGN API Géoportail
    Réponses: 9
    Dernier message: 22/06/2015, 13h33
  2. Comment récupérer les coordonnées d’un clique sur une image ?
    Par da_sys dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/11/2006, 13h34
  3. Comment récupérer les coordonnées sur le bureau d'une form ?
    Par fma2112 dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 23/02/2006, 00h43
  4. récupérer les coordonnées d'un rectangle
    Par robocop2776 dans le forum MFC
    Réponses: 3
    Dernier message: 01/11/2005, 20h31
  5. [GRAPHIQUE] Récupérer les coordonnées d'un point
    Par freud dans le forum Composants VCL
    Réponses: 6
    Dernier message: 29/09/2005, 13h31

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