2010-12-30 1 views
1

J'ai des problèmes pour déterminer le (ce que je crois être le) coordonnées du client d'un contrôle (bouton radio) dans le message WM_INITDIALOG d'un DlgProc.Comment déterminer les coordonnées des contrôles dans un message WM_INITDIALOG?

Voici ce que je cherche:

// Retrieve coordinates of Control with respect to the screen. 
RECT rectOrthoButton; 
GetWindowRect(GetDlgItem(hWnd, IDC_ORTHO), &rectOrthoButton); 

// Translate coordinates to more useful coordinates: those that 
// are used on the dialog. 
// In order to do the translation we have to find the top left 
// point (coordinates) of the dialog's client: 
POINT dlgTopLeft; 
ClientToScreen(hWnd, &dlgTopLeft); 

// With these coordinates we can do the translation. 
// We're only interested in top and left, so we skip 
// bottom and right: 
rectOrthoButton.top -= dlgTopLeft.y; 
rectOrthoButton.left -= dlgTopLeft.x; 

use_top_and_left(rectOrthoButton.top, rectOrthoButton.left); 

Je me attendais rectOrthoButton.top et .left être les coordonnées en haut à gauche de mon contrôle par rapport à la zone client de la boîte de dialogue. Il se trouve qu'ils ne sont pas et je ne suis pas sûr ce qu'ils pointent comme rectOrthoButton.left est égal à -40.

Modifier: Maintenant que je dirigeais pour initialiser le POINT avec

POINT dlgTopLeft = {0, 0}; 

(que je bêtement oublié): Y at-il un chemin plus court pour accomplir ce que je veux?

+1

Ne devez-vous pas mettre '0' sur dlgTopLeft.x/y avant d'appeler ClientToScreen? –

+0

Oui, ça l'a fait! Maintenant, si vous avez répondu, je pourrais cocher votre réponse comme étant * correcte * (ou quelle que soit la désignation de cette coche). Merci quand même. –

Répondre

1

Pour convertir un point en coordonnées d'écran, le point doit contenir les coordonnées du client (0, 0 en cas d'origine du client) avant de passer à ClientToScreen.

Questions connexes