Posizionamento di oggetti su più monitor display
Una finestra o un menu che si trova in più monitor causa un'interruzione visiva per un visualizzatore. Per ridurre al minimo questo problema, il sistema visualizza i menu e le finestre nuove e ingrandite in un unico monitor. Nella tabella seguente viene illustrato come viene scelto il monitoraggio.
Oggetto | Posizione |
---|---|
Finestra |
CreateWindow(Ex) visualizza una finestra nel monitor che contiene la parte più grande della finestra. Ingrandisce il monitor che contiene la parte più grande della finestra prima che sia stata ridotta a icona. La combinazione di tasti ALT-TAB visualizza una finestra sul monitor con la finestra attualmente attiva. |
finestra di proprietà | nello stesso monitor del proprietario. |
Sottomenu | Viene visualizzato nel monitor contenente la parte più grande della voce di menu corrispondente. |
menu di scelta rapida | Viene visualizzato nel monitor in cui si è verificato il clic con il pulsante destro del mouse. |
elenco a discesa | Viene visualizzato nel monitor che contiene il rettangolo della casella combinata. |
finestra di dialogo | Viene visualizzato nel monitor della finestra proprietaria. Se è definito con DS_CENTERMOUSE stile, viene visualizzato sul monitor con il mouse. Se non ha proprietario e la finestra attiva e la finestra di dialogo si trovano nella stessa applicazione, la finestra di dialogo viene visualizzata nel monitor della finestra attualmente attiva. Se la finestra di dialogo non ha proprietario e la finestra attiva non si trova nella stessa applicazione della finestra di dialogo, la finestra di dialogo viene visualizzata nel monitoraggio primario. |
finestra di messaggio | Viene visualizzato nel monitor della finestra proprietaria. |
Se una finestra si allontana da due monitor e uno dei monitor viene riposizionato, il sistema posiziona la finestra sul monitor che contiene la parte più grande della finestra originale.
In genere, un'applicazione dovrà posizionare gli oggetti. Ad esempio, potrebbe essere necessario creare una finestra nello stesso monitor di un'altra finestra.
Per posizionare un oggetto in un sistema di monitoraggio multiplo
- Determinare il monitoraggio appropriato.
- Ottenere le coordinate per il monitoraggio.
- Posizionare l'oggetto usando le coordinate.
In genere, si posiziona un oggetto sul monitor primario o su un monitor che dispone già di un oggetto su di esso. Per identificare il monitoraggio per un determinato punto, rettangolo o finestra, usare MonitorFromPoint, MonitorFromRect e MonitorFromWindow.
Per ottenere le coordinate per il monitoraggio, usare GetMonitorInfo, che fornisce sia l'area di lavoro che l'intero rettangolo di monitoraggio. Si noti che SM_CXSCREEN e SM_CYSCREEN sempre fare riferimento al monitoraggio primario, non necessariamente al monitoraggio che visualizza l'applicazione. Evitare inoltre di SM_xxVIRTUALSCREEN perché questa finestra viene allineata al centro sullo schermo virtuale, non un monitor.
Per centrare le finestre di dialogo nell'area di lavoro di una finestra, usare lo stile DS_CENTER. Per centrare la finestra di dialogo in una finestra dell'applicazione, usare GetWindowRect. Windows limita automaticamente menu e finestre di dialogo a un monitor. Tuttavia, può verificarsi un problema per i menu personalizzati, le caselle a discesa personalizzate, le tavolozze degli strumenti personalizzate e la posizione dell'applicazione salvata.
Per un esempio di come posizionare correttamente gli oggetti, vedere Posizionamento di oggetti in un'installazione a più display.
L'uso di SM_CXSCREEN e SM_CYSCREEN per determinare la posizione di una barra degli strumenti desktop dell'applicazione (detta anche barra delle app) limita la barra delle app al monitoraggio primario. Per consentire a una barra delle app di trovarsi su qualsiasi bordo di qualsiasi monitor, usare le metriche di sistema appropriate per calcolare i bordi dei monitor. Utilizzare inoltre le macro GET_X_LPARAM e GET_Y_LPARAM per estrarre le coordinate; in caso contrario, il segno delle coordinate potrebbe non essere corretto. Queste macro sono incluse in Windowsx.h.
Le dimensioni di una finestra a schermo intero devono cambiare man mano che si sposta tra monitor con risoluzioni diverse. A tale scopo, l'applicazione deve controllare la finestra in cui si trova, usando MonitorFromWindow o MonitorFromPoint e quindi usare GetMonitorInfo per ottenere le dimensioni del monitoraggio. In alternativa, è possibile usare HMONITOR dalla funzione DirectX DirectDrawEnumerateEx . Usare quindi SetWindowPos per posizionare e ridimensionare la finestra per coprire il monitor.
Una finestra ingrandita non copre una barra delle applicazioni con la proprietà "Always On top". Tuttavia, una finestra a schermo intero copre la barra delle applicazioni, ad esempio nelle presentazioni e nei giochi di Microsoft PowerPoint.
Per salvare e ripristinare in seguito, la posizione di una finestra quando un'applicazione viene chiusa, usare le funzioni GetWindowPlacement e SetWindowPlacement . Tuttavia, verificare che la posizione sia ancora valida prima di usarla perché il monitor potrebbe essere stato spostato o rimosso dal sistema. L'applicazione visualizza la finestra del monitoraggio primario se HMONITOR di una finestra non è valida.
Il sistema tenta di avviare un'applicazione nel monitor che contiene il collegamento. Quindi, un modo per posizionare un'applicazione consiste nell'avere il collegamento su un monitor desiderato.
Se si usa ShellExecute o ShellExecuteEx, specificare un hWnd in modo che il sistema apra tutte le nuove finestre nello stesso monitor dell'applicazione chiamante.
Si noti che i valori per la struttura MINMAXINFO vengono leggermente modificati per un sistema con più monitor.