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
Version imprimable
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
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++?
"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:
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:
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:
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! 8O
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:INT_PTR CALLBACK main_accords (HWND hMacc, unsigned int iMessage, WPARAM wParam, LPARAM lParam)
Edit: De plus, MakeProcInstance() est également obsolète.
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é).
Au lieu de :
j'ai codé :Code:
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 programmeCode:
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:
1
2 DialogBox (hinst, "main_accords", hwnd, main_accords) ; InvalidateRect (hwnd, NULL, TRUE); /* force paint */
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?
La fonction dans laquelle je fais le GetWindowRect :
La séquence du GetWindowRect qui ne marche pas :Code:
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:
1
2
3 case WM_INITDIALOG : hZonePas=GetDlgItem(hMacc, AZONE_PAS) ; GetWindowRect(hZonePas, &rZonePas) ;
Code:
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:
enCode:CONTROL " notes+" , AZONE_PAS, "BUTTON", BS_RADIOBUTTON | WS_CHILD | WS_VISIBLE | WS_GROUP | WS_TABSTOP, 130, 325, 32, 12
Code:RADIOBUTTON " notes+",AZONE_PAS,130,325,32,12,WS_GROUP | WS_TABSTOP
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:
1
2 RADIOBUTTON " notes+", AZONE_PAS, 130, 325, 32, 12, WS_GROUP | WS_TABSTOP
Dans WM_INITDIALOG de cette fonction :Code:
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:
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:
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
Citation:
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.Citation:
RoundRect Function
...
nLeftRect [in]
The x-coordinate, in logical coordinates, of the upper-left corner of the rectangle.