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
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
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.
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
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.
"hMacc" est bien l'handle de la boîte de dialogue ?
hMacc est le Handle défini dans la fonction qui traite la boîte de dialogue.
La fonction est appellée par :
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 lpfnDialogProc = MakeProcInstance ((DLGPROC) main_accords,hinst) ; DialogBox (hinst, "main_accords", hwnd, lpfnDialogProc) ; FreeProcInstance (lpfnDialogProc) ; InvalidateRect (hwnd, NULL, TRUE); /* force paint */
la fonction qui traite la boîte de dialogue :
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".....
Je ne sais pas ce que c'est que spy++
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) {....
Gasp!
Mais cette déclaration de DialogProc doit avoir au moins qunze ans!
Elle est faite pour Win16!
La bonne déclaration est ceci:
Et retire le cast en (DLGPROC) après avoir corrigé: Ça devrait pouvoir compiler sans.
Code : Sélectionner tout - Visualiser dans une fenêtre à part INT_PTR CALLBACK main_accords (HWND hMacc, unsigned int iMessage, WPARAM wParam, LPARAM lParam)
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.
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 ?
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.
Au lieu de :
j'ai codé :
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 */
Mais cela plante le programme
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 */
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.
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.
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.
La fonction dans laquelle je fais le GetWindowRect :
La séquence du GetWindowRect qui ne marche pas :
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 définition de CONTROL AZONE_PAS dans mon fichier .rc :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 case WM_INITDIALOG : hZonePas=GetDlgItem(hMacc, AZONE_PAS) ; GetWindowRect(hZonePas, &rZonePas) ;
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
Sur mon VS2008, cela marche très bien.
Mais le designer a convertis:
en
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part RADIOBUTTON " notes+",AZONE_PAS,130,325,32,12,WS_GROUP | WS_TABSTOP
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.
J'ai remplacé les définitions des RADIOBUTTONs mais cela ne règle pas le problème.
Chez moi, ça marche.
Pouvez-vous nous envoyer un projet qui reproduit le problème ?
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 :
Définition de la fonction dans laquelle j'ai le problème :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 RADIOBUTTON " notes+", AZONE_PAS, 130, 325, 32, 12, WS_GROUP | WS_TABSTOP
Dans WM_INITDIALOG de cette fonction :
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_PAINT de cette fonction j'ai mis un RoundRect pour vérifier :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 hZonePas=GetDlgItem(hMacc, AZONE_PAS) ; GetWindowRect(hZonePas, &rZonePas) ;
Le rectangle n'est pas à la bonne place, j'obtiens les coordonnées suivantes :
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) ;
rZonePas.left=483,rZonePas.right=547,rZonePas.top=905,rZonePas.bottom=929
Merci pour les réponses
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.Utilisez au moins le même référentiel.RoundRect Function
...
nLeftRect [in]
The x-coordinate, in logical coordinates, of the upper-left corner of the rectangle.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager