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.
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 !
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.
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.
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
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.
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.