Gérer le moniteur

 

Bon, maintenant, je pense que vous avez compris que tout est fenêtre dans Windows, est donc, votre écran est aussi une fenêtre !

Je m'explique: Quand je parle d'écran, il s'agit bien de la totalité de la surface de la dalle de l'écran, là où sont posées les icônes, ...

Pour obtenir le handle de cette fenêtre, utiliseez la fonction HWND GetDesktopWindow(VOID);

 

Obtenir un handle de contexte de périphérique

Vous pourrez ensuite dessiner sur toute la surface avec un code ressemblant à ceci:

hdesktop = GetDesktopWindow();
hdc= GetWindowDC (hdesktop);

for( i = 0; i < 200;i++ )
{
SetPixel (hdc, i, i, RGB (0,0,255));
}

ReleaseDC (hdesktop, hdc);

(Pour les fonctions GetWindowDC, ReleaseDC, voir chapitre GDI:Handle sur un contexte de périphérique)

Marrant pour faire une blague (Inverser l'écran par exemple)...

 

Pour dessiner sur l'écran, vous pouvez aussi faire ceci:

hdc = CreateDC ("DISPLAY", NULL, NULL, NULL);

for( i = 0; i < 200;i++ )
{
SetPixel (hdc, i, i, RGB (0,0,255));
}

DeleteDC (hdc);

Enfin n'oubliez pas quand même que vous n'êtes pas seule !!! Il y a d'autres fenêtres sur cet écran, ne les salissez pas !

 

Envoyer des messages

Comme il s'agit d'une fenêtre, vous pouvez évidemment lui envoyer des messages. Par exemple, pour lancer l'économiseur d'écran : PostMessage(GetDesktopWindow(),WM_SYSCOMMAND,SC_SCREENSAVE, 0);

Mais n'envoyez pas n'importe quoi !!!

 

Enumérer les résolutions disponibles

Il existe une fonction qui va récupérer toutes les informations sur les différents modes graphiques disponible.

BOOL EnumDisplaySettings(
LPCTSTR lpszDeviceName,
DWORD iModeNum,
LPDEVMODE lpDevMode
);

Les paramètres:

En entrée

lpszDeviceName: Nom du périphérique de sortie. NULL pour le périphérique par défaut (l'écran !)
iModeNum: avec une valeur de 1 à n, correspond à un index auquel est associé un mode graphique. Il existe deux valeurs particulières:

Valeur Désignation
ENUM_CURRENT_SETTINGS Pour récupérer le mode graphique actuel
ENUM_REGISTRY_SETTINGS Pour récupérer le mode graphique enregistré dans la registry.


lpDevMode: Pointeur sur une structure DEVMODE servant pour tous types de périphériques de sortie qui recevra les informations sur le mode iModeNum.

Les membres les plus intéressant à lire pour un écran étant:

Membre Désignation
dmBitsPerPel 4 bits pour 16 couleurs, 8 bits for 256 couleurs, 16 bits pour 65,536 couleurs et 32 bits pour true colors
dmPelsWidth largeur en pixel
dmPelsHeight hauteur toujours en pixel
dmDisplayFrequency Fréquence en hertz (nb. cycles par seconde)

En sortie:

En cas d'échec, la fonction retourne false, sinon vrai ! La fonction retournant false si le mode choisi n'existe pas.

Image non trouvée !Pour récupérer tous les modes graphiques, il suffira donc de faire varier le mode iModeNum de 0 à n jusqu'a ce que la fonction se plante !

Image non trouvée !Le membre dmSize de la structure DEVMODE devra être initialisé à la taille de la structure DEVMODE. Vous pouvez initialiser tous les autres membres de la structure à 0.

 

Changer de résolution et le nombre de couleurs

Il est possible de changer la résolution de l'écran. Généralement, pour passer un jeu en plein écran.

Utilisez pour cela la fonction ChangeDisplaySettings() qui permet de modifier ces paramètres de l'écran de sortie utilisé par défaut. (Si vous voulez changer ces paramètres sur un périphérique quelconque, vous utiliserez plutôt ChangeDisplaySettingsEx()).

LONG ChangeDisplaySettings(
LPDEVMODE lpDevMode,
DWORD dwflags
);

En entrée:

lpDevMode est un pointeur sur une structure qui va contenir les nouvelles caractéristiques du mode graphique. Si cette valeur est nulle, le système utilise les valeurs enregistrées dans la base de registres.

Image non trouvée !Bon à savoir: En passant NULL à lpDevMode et 0 dans dwFlags, le système va rétablir automatiquement la résolution qu'il y avait avant modification via cette fonction.

Image non trouvée !Le membre dmSize de la structure DEVMODE devra être initialisé à la taille de la structure DEVMODE. Initialisez tous les autres membres de la structure à 0.

Il faut ensuite indiquer dans le membre dmFields la liste des champs que vous allez modifier.

Les membres les plus intéressant à modifier étant:

Membre Désignation
dmBitsPerPel 4 bits pour 16 couleurs, 8 bits for 256 couleurs, 16 bits pour 65,536 couleurs et 32 bits pour true colors
dmPelsWidth largeur en pixel
dmPelsHeight hauteur toujours en pixel
dmDisplayFrequency Fréquence en hertz (nb. cycles par seconde)

 

dwflags Indique comment vous allez changer de mode de résolution:

Valeur Désignation
0 Changement dynamique de la résolution.
CDS_FULLSCREEN Change temporaire de la résolution.
CDS_GLOBAL Utilisé avec CDS_UPDATEREGISTRY Pour indiquer que la modification est valable pour tous les utilisateurs.
CDS_NORESET A utiliser avec CDS_UPDATEREGISTRY. Ne pas effectuer de changement immédiatement, mais stocke les valeurs dans la registry pour le prochain reboot.
CDS_RESET Change de résolution même si la résolution précédente était déjà la même que la nouvelle
CDS_SET_PRIMARY  
CDS_TEST Le système va vérifier que les valeurs sont admises par la carte.
CDS_UPDATEREGISTRY Changement de résolution pour l'utilisateur courant avec enregistrement dans la base de registres (si les valeurs sont permises). La fonction retournera alors la valeur DISP_CHANGE_RESTART, sinon, la fonction retournera DISP_CHANGE_NOTUPDATED sous Windows NT/2000/XP

 

En sortie:


DISP_CHANGE_SUCCESSFUL Changement effectué avec succès

DISP_CHANGE_BADFLAGS Flag invalide passé
DISP_CHANGE_BADMODE Mode non supporté
DISP_CHANGE_BADPARAM Paramètres invalides
DISP_CHANGE_FAILED Mode non accepté par la carte
DISP_CHANGE_NOTUPDATED Impossible d'écrire dans la registry
DISP_CHANGE_RESTART Il faut redémarrer le système pour que la résolution soit prise en compte

 

Image non trouvée !Un message est arrivé: WM_DISPLAYCHANGE va indiquer à toutes les applications qu'il y a un changement de mode.

wParam Nombre de bits par pixel
LOWORD(lParam) Nouvelle largeur en pixel
HIWORD(lParam) Nouvelle hauteur en pixel

 

Exemple de code avec EnumDisplaySettings() et ChangeDisplaySettings()

Là, j'avais un peu de mal à faire simple, il peut y avoir beaucoup de modes disponibles, afficher des messages seraient alors long et surtout pénible. Et pour tester le changement de mode, il faut connaître ceux disponibles. D'où ce petit programme qui affiche dans une fenêtre les différents modes disponibles. Par un double clique sur une ligne indiquant un mode, le programme bascule l'écran dans ce mode sélectionné pendant une dizaine de secondes, puis retourne au mode par défaut.

Image non trouvée !

 

Fullscreen - Travailler en plein écran

Nombreux sont les jeux qui occupent la totalité de l'écran, suite éventuellement à un changement de mode graphique (vu précédemment).

Mais il faut savoir que l'on ne dessinera pas (voire jamais) directement sur l'écran, mais toujours par l'intermédiaire d'une fenêtre ! Donc il s'agit ici plus d'un complément sur les fenêtres.