2010-04-16 8 views

Respuesta

44
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 da las coordenadas de pantalla del control. pDlg->ScreenToClient los convertirá en relativos al área del cliente del diálogo, que generalmente es lo que necesita.

Nota: pDlg anterior es el cuadro de diálogo. Si está en una función miembro de la clase de diálogo, simplemente elimine el pDlg->.

+0

En la documentación oficial dice que GetClientRect devuelve nulo, por lo que no puedo usar pWnd-> GetClientRect (y rect). Si lo hago, obtengo un error de tiempo de ejecución. Si usa GetClientRect (y rect), entonces siempre obtengo rect.left = 0 y rect.top = 0, ¡sin importar dónde coloque mi control en un diálogo! También está escrito en la documentación. –

+1

@kobac: tienes razón al regresar (0,0) - Lo arreglé ahora. En cuanto al error de tiempo de ejecución, el puntero 'pWnd' probablemente no era válido. El valor de retorno nulo no es un problema ya que no estoy usando el valor de retorno en ninguna parte. – interjay

5

En recta MFC/Win32: (Ejemplo 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 

Espero que esto ayude! Feliz codificación :)

Cuestiones relacionadas