winapi - texto - ¿Cómo vincular las ventanas secundarias a la ventana principal en posiciones relativas?
tkinter texto (3)
Intente seleccionar el control y jugar con su propiedad "Dock". Con eso, puede acoplar el control en algunos lados o incluso en todos los lados del control principal.
¿Cuáles son las mejores prácticas para diseñar ventanas secundarias (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 esto:
Como puede ver en las líneas rojas, no se ve bien cuando estoy cambiando el tamaño de la ventana principal 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 con las funciones GetWindowRect, GetClientRect y MoveWindow. Pero, ¿es esta la manera correcta?
Actualmente estoy trabajando con Win32 Api puro sin MFC.
Si bien es un proceso manual, me resulta útil trabajar en coordenadas relativas a la ventana principal de cada control.
Utilizo la siguiente función para devolver la posición actual de un control relativo a su elemento principal, de modo que pueda moverse / 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
relativo a la ventana / control principal. 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 los controles de posición 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, es probable que todas requieran ajustes para sus necesidades, pero le da una idea de algunas de las herramientas que otros han creado para resolver este problema.
- Box Planner - Proyecto de código
- Easy Dialog Resizer - Proyecto de código
- EvaLayout - Proyecto de código
- CResizableDialog (MFC) - Proyecto de código
- RPResizeDialog (MFC) - Proyecto de código
- EasySize (MFC) - Proyecto de código
- Cambiar tamaño de diálogo - Proyecto de código
- Ventanas hijas dinámicas - Proyecto de código
- Administrador de diseño (MFC) - Proyecto de código
- ResizableLib (MFC) - Proyecto de código
Si solo está utilizando la API de 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 que llenen el elemento primario apropiadamente.
Si lo desea lo suficiente, puede (por supuesto) implementar un administrador de diseño, por lo que el resto del programa no necesita manejar cosas como esta 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.