2011-11-28 6 views
10

Cuál es la mejor práctica para la colocación de ventanas hijas (controles comunes) en un cuadro de diálogo o ventana principal? Quiero decir que hay un mecanismo de enlace que fijaría una posición relativa del control al borde de la ventana primaria como en WPF. Y durante el cambio de tamaño de la ventana, el control infantil se redimensionaría junto con la ventana principal. Actualmente tengo unas pocas cosas: List view dialogCómo vincular las ventanas secundarias a la ventana primaria en posiciones relativas?

Como se puede ver en las líneas rojas que no se ve bonita cuando estoy Cambiar el tamaño de la ventana padre de un control de vista de lista. Me gustaría vincular, por ejemplo, el lado derecho de ListView al borde derecho de DialogBox y, de manera similar, otros controles.

sé que puedo jugar un poco con funciones MoveWindow GetWindowRect, y GetClientRect. Pero, ¿es esta la manera correcta?

Actualmente estoy trabajando con la API de Win32 pura y sin MFC.

Respuesta

9

Si solo está utilizando la API Win32, normalmente maneja esto manejando el mensaje WM_SIZE, y responde llamando a GetClientRect en la ventana primaria y MoveWindow en los elementos secundarios para mover/cambiar el tamaño de los elementos secundarios para llenar el elemento primario apropiadamente.

Si quieres lo suficiente, puede (por supuesto) implementar un controlador de distribución, por lo que el resto del programa no necesita para manejar este tipo de cosas directamente. Al menos IME, hacer esto bien es lo suficientemente difícil que rara vez vale la pena el problema a menos que puedas hacer un gran uso de ese código de diseño.

+0

Creo que se refería a WM_SIZE en la primera oración. –

+0

@AdrianMcCarthy: Vaya, está bien. Gracias. Fijo. –

2

intente seleccionar el control y jugando con su propiedad "muelle". Con eso, puede acoplar el control en algunos lados o incluso en todos los lados del control principal.

+3

no hay ninguna característica "muelle" en Win32 puro, pero encontraron esta [thread] (http://stackoverflow.com/questions/7058564/dock-window-in -win32-c) que básicamente responde mi pregunta, así que gracias por la palabra clave "Dock" :) – Robertas

+0

Ok, disculpa eso, pero me alegro de que aún así me haya ayudado. – Katu

9

Si bien es un proceso manual, me resulta útil para trabajar en coordenadas relativas a la ventana padre de cada control.

Utilizo la siguiente función para devolver la posición actual de un control en relación con su elemento principal, por lo que se puede mover/cambiar de tamaño fácilmente con SetWindowPos().

void GetRelativeCtrlRect(HWND hWnd, RECT *rc) { 
    // Get the position of the window relative to the entire screen 
    GetWindowRect(hWnd, rc); 

    // Now convert those with regards to the control's parent 
    ScreenToClient(GetParent(hWnd), (LPPOINT) &((LPPOINT)rc)[0]); 
    ScreenToClient(GetParent(hWnd), (LPPOINT) &((LPPOINT)rc)[1]); 
} 

Esto devuelve un tamaño RECT relativa a los padres de la ventana/de control. Como ejemplo, si desea cambiar el tamaño del control secundario al borde inferior "cercano" del elemento primario, simplemente elimine algunos píxeles de rc.bottom antes de llamar a SetWindowPos (childHWND, ...)

También tengo algunas funciones de "anclaje" que ayudan a colocar controles en relación con otros puntos de referencia. Sin embargo, sigue siendo un proceso manual en tiempo de código, pero ofrece excelentes resultados ajustados a mano.

Algunas otras opciones que he marcado, todas requieren ajustes para sus necesidades pero le da una idea de algunas de las herramientas que otros han creado para resolver este problema.

Cuestiones relacionadas