Partilhar via


Posicionando objetos em vários monitores de exibição

Uma janela ou menu que está em mais de um monitor causa interrupção visual para um visualizador. Para minimizar esse problema, o sistema exibe menus e janelas novas e maximizadas em um monitor. A tabela a seguir mostra como o monitor é escolhido.

Objeto Localização
janela CreateWindow(Ex) exibe uma janela no monitor que contém a maior parte da janela. Maximiza no monitor que contém a maior parte da janela antes de ser minimizada.
A combinação de teclas ALT-TAB exibe uma janela no monitor que tem a janela ativa no momento.
janela de propriedade no mesmo monitor que seu proprietário.
Submenu Aparece no monitor que contém a maior parte do item de menu correspondente.
menu de contexto Aparece no monitor onde ocorreu o clique com o botão direito do mouse.
lista suspensa Aparece no monitor que contém o retângulo da caixa de combinação.
(caixa de diálogo) Aparece no monitor da janela que a possui. Se for definido com DS_CENTERMOUSE estilo, ele aparecerá no monitor com o mouse.
Se ele não tiver proprietário e a janela ativa e a caixa de diálogo estiverem no mesmo aplicativo, a caixa de diálogo será exibida no monitor da janela ativa no momento.
Se a caixa de diálogo não tiver proprietário e a janela ativa não estiver no mesmo aplicativo que a caixa de diálogo, a caixa de diálogo será exibida no monitor primário.
caixa de mensagem Aparece no monitor da janela que a possui.

 

Se uma janela ultrapassar dois monitores e um dos monitores for reposicionado, o sistema posicionará a janela no monitor que contém a maior parte da janela original.

Normalmente, um aplicativo também precisará posicionar objetos . Por exemplo, uma janela pode precisar ser criada no mesmo monitor que outra janela.

Para posicionar um objeto em um sistema de vários monitores

  1. Determine o monitor apropriado.
  2. Obtenha as coordenadas para o monitor.
  3. Posicione o objeto usando as coordenadas.

Normalmente, você posicionará um objeto no monitor primário ou em um monitor que já tenha um objeto nele. Para identificar o monitor de um determinado ponto, retângulo ou janela, use MonitorFromPoint, MonitorFromRect e MonitorFromWindow.

Para obter as coordenadas do monitor, use GetMonitorInfo, que fornece a área de trabalho e todo o retângulo do monitor. Observe que SM_CXSCREEN e SM_CYSCREEN sempre se referem ao monitor primário, não necessariamente ao monitor que exibe seu aplicativo. Além disso, evite SM_xxVIRTUALSCREEN porque isso centraliza sua janela na tela virtual, não um monitor.

Para centralizar caixas de diálogo na área de trabalho de uma janela, use o estilo DS_CENTER. Para centralizar a caixa de diálogo para uma janela do aplicativo, use GetWindowRect. O Windows restringe automaticamente menus e caixas de diálogo a um monitor. No entanto, pode haver um problema para menus personalizados, caixas suspensas personalizadas, paletas de ferramentas personalizadas e a posição salva do aplicativo.

Para obter um exemplo de como posicionar objetos corretamente, consulte Posicionando objetos em uma instalação de exibição múltipla.

Usar SM_CXSCREEN e SM_CYSCREEN para determinar o local de uma barra de ferramentas da área de trabalho do aplicativo (também chamada de appbar) restringe a barra de aplicativos ao monitor primário. Para permitir que uma barra de aplicativos esteja em qualquer borda de qualquer monitor, use as métricas do sistema apropriadas para calcular as bordas dos monitores. Além disso, use as macros GET_X_LPARAM e GET_Y_LPARAM para extrair as coordenadas; caso contrário, o sinal das coordenadas pode estar errado. Essas macros estão incluídas no Windowsx.h.

O tamanho de uma janela de tela inteira precisa ser alterado à medida que se move entre monitores com resoluções diferentes. Para fazer isso, o aplicativo deve marcar em qual janela ele está, usando MonitorFromWindow ou MonitorFromPoint e, em seguida, usar GetMonitorInfo para obter o tamanho do monitor. Como alternativa, você pode usar o HMONITOR da função DirectDrawEnumerateEx do DirectX. Em seguida, use SetWindowPos para posicionar e dimensionar a janela para cobrir o monitor.

Uma janela maximizada não abrange uma barra de tarefas que tem a propriedade "Always on top". No entanto, uma janela de tela inteira cobre a barra de tarefas, por exemplo, em apresentações de slides e jogos do Microsoft PowerPoint.

Para salvar e restaurar posteriormente, a posição de uma janela quando um aplicativo for encerrado, use as funções GetWindowPlacement e SetWindowPlacement . No entanto, marcar que a posição ainda é válida antes de usá-la porque o monitor pode ter sido movido ou removido do sistema. O aplicativo exibirá a janela no monitor primário se o HMONITOR de uma janela for inválido.

O sistema tenta iniciar um aplicativo no monitor que contém seu atalho. Portanto, uma maneira de posicionar um aplicativo é ter seu atalho em um monitor desejado.

Se você usar ShellExecute ou ShellExecuteEx , forneça um hWnd para que o sistema abra novas janelas no mesmo monitor que o aplicativo de chamada.

Observe que os valores da estrutura MINMAXINFO são ligeiramente alterados para um sistema com vários monitores.