web-dev-qa-db-fra.com

Comment obtenir la taille et l'emplacement d'un contrôle placé sur une boîte de dialogue dans MFC?

J'ai le pointeur sur le contrôle avec fonction

CWnd* CWnd::GetDlgItem(int ITEM_ID)

donc j'ai CWnd* pointeur qui pointe vers le contrôle, mais ne peut tout simplement pas trouver de méthode dans la classe CWnd qui récupérera la taille et l'emplacement d'un contrôle donné. De l'aide?

21
dragan.stepanovic
CRect rect;
CWnd *pWnd = pDlg->GetDlgItem(YOUR_CONTROL_ID);
pWnd->GetWindowRect(&rect);
pDlg->ScreenToClient(&rect); //optional step - see below

//position:  rect.left, rect.top
//size: rect.Width(), rect.Height()

GetWindowRect donne les coordonnées d'écran du contrôle. pDlg->ScreenToClient les convertira ensuite par rapport à la zone client de la boîte de dialogue, qui est généralement ce dont vous avez besoin.

Remarque: pDlg ci-dessus est la boîte de dialogue. Si vous êtes dans une fonction membre de la classe dialog, supprimez simplement le pDlg->.

47
interjay

En MFC/Win32 direct: (Exemple de WM_INITDIALOG)

RECT r;
HWND h = GetDlgItem(hwndDlg, IDC_YOURCTLID);
GetWindowRect(h, &r); //get window rect of control relative to screen
POINT pt = { r.left, r.top }; //new point object using rect x, y
ScreenToClient(hwndDlg, &pt); //convert screen co-ords to client based points

//example if I wanted to move said control
MoveWindow(h, pt.x, pt.y + 15, r.right - r.left, r.bottom - r.top, TRUE); //r.right - r.left, r.bottom - r.top to keep control at its current size

J'espère que cela t'aides! Bon codage :)

6
Jason Newland