Partager via


Positionnement d’objets sur plusieurs moniteurs d’affichage

Une fenêtre ou un menu qui se trouve sur plusieurs moniteurs provoque une interruption visuelle pour une visionneuse. Pour réduire ce problème, le système affiche des menus et des fenêtres nouvelles et agrandies sur un seul moniteur. Le tableau suivant montre comment le moniteur est choisi.

Object Emplacement
window CreateWindow(Ex) affiche une fenêtre sur le moniteur qui contient la plus grande partie de la fenêtre. Agrandit le moniteur qui contient la plus grande partie de la fenêtre avant sa réduction.
La combinaison de touches ALT-TAB affiche une fenêtre sur le moniteur qui a la fenêtre active.
fenêtre propriétaire sur le même moniteur que son propriétaire.
Sous-menu Apparaît sur le moniteur qui contient la plus grande partie de l’élément de menu correspondant.
menu contextuel Apparaît sur le moniteur où le clic droit s’est produit.
liste déroulante Apparaît sur le moniteur qui contient le rectangle de la zone de liste déroulante.
boîte de dialogue Apparaît sur l’écran de la fenêtre qui en est propriétaire. S’il est défini avec DS_CENTERMOUSE style, il apparaît sur le moniteur avec la souris.
S’il n’a pas de propriétaire et que la fenêtre active et la boîte de dialogue se trouvent dans la même application, la boîte de dialogue s’affiche sur le moniteur de la fenêtre actuellement active.
Si la boîte de dialogue n’a pas de propriétaire et que la fenêtre active n’est pas dans la même application que la boîte de dialogue, la boîte de dialogue s’affiche sur le moniteur principal.
boîte de message Apparaît sur l’écran de la fenêtre qui en est propriétaire.

 

Si une fenêtre est à cheval sur deux moniteurs et que l’un des moniteurs est repositionné, le système positionne la fenêtre sur le moniteur qui contient la plus grande partie de la fenêtre d’origine.

Une application doit également généralement positionner des objets. Par exemple, une fenêtre peut avoir besoin d’être créée sur le même moniteur qu’une autre fenêtre.

Pour positionner un objet sur un système à plusieurs moniteurs

  1. Déterminez le moniteur approprié.
  2. Obtenez les coordonnées du moniteur.
  3. Positionnez l’objet à l’aide des coordonnées.

En règle générale, vous placez un objet sur le moniteur principal ou sur un moniteur qui a déjà un objet. Pour identifier le moniteur pour un point, un rectangle ou une fenêtre donnés, utilisez MonitorFromPoint, MonitorFromRect et MonitorFromWindow.

Pour obtenir les coordonnées du moniteur, utilisez GetMonitorInfo, qui fournit à la fois la zone de travail et l’intégralité du rectangle du moniteur. Notez que SM_CXSCREEN et SM_CYSCREEN font toujours référence au moniteur principal, pas nécessairement au moniteur qui affiche votre application. En outre, évitez SM_xxVIRTUALSCREEN, car cela centre votre fenêtre sur l’écran virtuel, et non sur un moniteur.

Pour centrer les boîtes de dialogue dans la zone de travail d’une fenêtre, utilisez le style DS_CENTER. Pour centrer la boîte de dialogue sur une fenêtre d’application, utilisez GetWindowRect. Windows limite automatiquement les menus et les boîtes de dialogue à un moniteur. Toutefois, il peut y avoir un problème pour les menus personnalisés, les zones déroulantes personnalisées, les palettes d’outils personnalisées et la position de l’application enregistrée.

Pour obtenir un exemple de positionnement correct des objets, consultez Positionnement d’objets sur une configuration d’affichage multiple.

L’utilisation de SM_CXSCREEN et de SM_CYSCREEN pour déterminer l’emplacement d’une barre d’outils de bureau d’application (également appelée barre d’applications) limite la barre d’application au moniteur principal. Pour permettre à une barre d’application de se trouver sur n’importe quel bord d’un moniteur, utilisez les métriques système appropriées pour calculer les bords des moniteurs. Utilisez également les macros GET_X_LPARAM et GET_Y_LPARAM pour extraire les coordonnées. Sinon, le signe des coordonnées peut être incorrect. Ces macros sont incluses dans Windowsx.h.

La taille d’une fenêtre plein écran doit changer à mesure qu’elle se déplace entre les moniteurs avec différentes résolutions. Pour ce faire, l’application doit case activée la fenêtre dans laquelle elle se trouve, en utilisant MonitorFromWindow ou MonitorFromPoint , puis utiliser GetMonitorInfo pour obtenir la taille du moniteur. Vous pouvez également utiliser le HMONITOR à partir de la fonction DirectX DirectDrawEnumerateEx . Utilisez ensuite SetWindowPos pour positionner et dimensionner la fenêtre afin de couvrir le moniteur.

Une fenêtre agrandie ne couvre pas une barre des tâches qui a la propriété « Always on top ». Toutefois, une fenêtre plein écran couvre la barre des tâches, par exemple dans les diaporamas et les jeux Microsoft PowerPoint.

Pour enregistrer, puis restaurer ultérieurement, la position d’une fenêtre à la fermeture d’une application, utilisez les fonctions GetWindowPlacement et SetWindowPlacement . Toutefois, case activée que la position est toujours valide avant de l’utiliser, car le moniteur a pu être déplacé ou supprimé du système. L’application affiche la fenêtre sur le moniteur principal si le HMONITOR d’une fenêtre n’est pas valide.

Le système tente de démarrer une application sur le moniteur qui contient son raccourci. Ainsi, une façon de positionner une application consiste à avoir son raccourci sur un moniteur souhaité.

Si vous utilisez ShellExecute ou ShellExecuteEx , fournissez un hWnd afin que le système ouvre toutes les nouvelles fenêtres sur le même moniteur que l’application appelante.

Notez que les valeurs de la structure MINMAXINFO sont légèrement modifiées pour un système avec plusieurs moniteurs.