Posicionamiento de objetos en varios monitores de visualización
Una ventana o un menú que se encuentra en más de un monitor provoca interrupciones visuales para un visor. Para minimizar este problema, el sistema muestra menús y ventanas nuevas y maximizadas en un monitor. En la tabla siguiente se muestra cómo se elige el monitor.
Object | Location |
---|---|
periodo |
CreateWindow(Ex) muestra una ventana en el monitor que contiene la parte más grande de la ventana. Maximiza en el monitor que contiene la parte más grande de la ventana antes de minimizarla. La combinación de teclas ALT-TAB muestra una ventana en el monitor que tiene la ventana activa actualmente. |
ventana propiedad | en el mismo monitor que su propietario. |
Submenú | Aparece en el monitor que contiene la parte más grande del elemento de menú correspondiente. |
menú contextual | Aparece en el monitor donde se produjo el clic derecho. |
lista desplegable | Aparece en el monitor que contiene el rectángulo del cuadro combinado. |
cuadro de diálogo | Aparece en el monitor de la ventana que la posee. Si se define con DS_CENTERMOUSE estilo, aparece en el monitor con el mouse. Si no tiene propietario y la ventana activa y el cuadro de diálogo están en la misma aplicación, el cuadro de diálogo aparece en el monitor de la ventana activa actualmente. Si el cuadro de diálogo no tiene propietario y la ventana activa no está en la misma aplicación que el cuadro de diálogo, el cuadro de diálogo aparece en el monitor principal. |
cuadro de mensaje | Aparece en el monitor de la ventana que la posee. |
Si se cambia la posición de dos monitores de ventana y uno de los monitores, el sistema coloca la ventana en el monitor que contiene la parte más grande de la ventana original.
Normalmente, una aplicación necesitará colocar objetos. Por ejemplo, es posible que sea necesario crear una ventana en el mismo monitor que otra ventana.
Para colocar un objeto en un sistema de supervisión múltiple
- Determine el monitor adecuado.
- Obtenga las coordenadas del monitor.
- Coloque el objeto mediante las coordenadas.
Normalmente, colocará un objeto en el monitor principal o en un monitor que ya tenga un objeto en él. Para identificar el monitor para un punto determinado, rectángulo o ventana, use MonitorFromPoint, MonitorFromRect y MonitorFromWindow.
Para obtener las coordenadas del monitor, use GetMonitorInfo, que proporciona el área de trabajo y todo el rectángulo del monitor. Tenga en cuenta que SM_CXSCREEN y SM_CYSCREEN siempre hacen referencia al monitor principal, no necesariamente al monitor que muestra la aplicación. Además, evite SM_xxVIRTUALSCREEN porque esto centra la ventana en la pantalla virtual, no en un monitor.
Para centrar los cuadros de diálogo en el área de trabajo de una ventana, use el estilo DS_CENTER. Para centrar el cuadro de diálogo en una ventana de aplicación, use GetWindowRect. Windows restringe automáticamente los menús y cuadros de diálogo a un monitor. Sin embargo, puede haber un problema para los menús personalizados, cuadros desplegables personalizados, paletas de herramientas personalizadas y la posición de la aplicación guardada.
Para obtener un ejemplo de cómo colocar correctamente los objetos, consulte Posicionamiento de objetos en una configuración de varias pantallas.
El uso de SM_CXSCREEN y SM_CYSCREEN para determinar la ubicación de una barra de herramientas de escritorio de la aplicación (también denominada barra de aplicaciones) restringe la barra de aplicaciones al monitor principal. Para permitir que una barra de aplicaciones esté en cualquier borde de cualquier monitor, use las métricas del sistema adecuadas para calcular los bordes de los monitores. Además, use las macros GET_X_LPARAM y GET_Y_LPARAM para extraer las coordenadas; de lo contrario, el signo de las coordenadas puede ser incorrecto. Estas macros se incluyen en Windowsx.h.
El tamaño de una ventana de pantalla completa debe cambiar a medida que se mueve entre monitores con diferentes resoluciones. Para ello, la aplicación debe comprobar en qué ventana está activada, mediante MonitorFromWindow o MonitorFromPoint y, a continuación, usar GetMonitorInfo para obtener el tamaño del monitor. Como alternativa, podría usar el HMONITOR de la función DirectDrawEnumerateEx de DirectX . A continuación, use SetWindowPos para colocar y ajustar el tamaño de la ventana para cubrir el monitor.
Una ventana maximizada no cubre una barra de tareas que tiene la propiedad "Always On Top". Sin embargo, una ventana de pantalla completa cubre la barra de tareas, por ejemplo, en las presentaciones y juegos de Microsoft PowerPoint.
Para guardar y restaurar posteriormente, la posición de una ventana cuando se cierra una aplicación, use las funciones GetWindowPlacement y SetWindowPlacement . Sin embargo, compruebe que la posición sigue siendo válida antes de usarla porque el monitor podría haberse movido o quitado del sistema. La aplicación muestra la ventana en el monitor principal si el HMONITOR de una ventana no es válido.
El sistema intenta iniciar una aplicación en el monitor que contiene su acceso directo. Por lo tanto, una manera de colocar una aplicación es tener su acceso directo en un monitor deseado.
Si usa ShellExecute o ShellExecuteEx , proporcione un hWnd para que el sistema abra las nuevas ventanas en el mismo monitor que la aplicación que realiza la llamada.
Tenga en cuenta que los valores de la estructura MINMAXINFO se modifican ligeramente para un sistema con varios monitores.