Repère sous Windows
La fonction SetMapMode permet de définir le repère (orientation des axes x et y) et l'unité de mesure à utiliser pour les opérations graphiques
int SetMapMode(
HDC hdc, // handle sur le contexte de périphérique
int fnMapMode // nouveau mode de mapping
);
Les Paramètres:
hdc: handle sur le contexte de périphérique...
fnMapMode : Peut prendre les valeurs suivantes:
Valeur | Description |
MM_ANISOTROPIC | Des valeurs par défaut sont positionnées, il faut utiliser les fonctions SetWindowExtEx() et SetViewportExtEx pour préciser l'orientation et l'échelle |
MM_HIENGLISH | l'unité est 0.001 inch, x est positive à droite de l'axe, y est positif en haut |
MM_HIMETRIC | l'unité est 0.01 millimeter, x est positive à droite de l'axe, y est positif en haut |
MM_ISOTROPIC | Des valeurs par défaut sont positionnées, mais 1 unité en x est égal à une unité en y. Cette valeur est très intéressante pour dessiner facilement un cercle car GDI se débrouille pour faire en sorte que quelque soit la résolution, 1 unité en x aura la même taille en y. Il faut utiliser les fonctions SetWindowExtEx() et SetViewportExtEx pour préciser l'orientation et l'échelle |
MM_LOENGLISH | l'unité est 0.01 inch, x est positive à droite de l'axe, y est positif en haut |
MM_LOMETRIC | l'unité est 0.1 millimeter, x est positive à droite de l'axe, y est positif en haut |
MM_TEXT | C'est la valeur par défaut, une unité equivaut à la taille d'un pixel.x est positive à droite de l'axe, y est positif en bas. |
MM_TWIPS | x est positive à droite de l'axe, y est positif en haut, l'unité est à 1/1440 inch |
La fonction retourne 0 si problème, sinon l'ancien mode qui avait été choisi.
Pour connaître le mode de mapping:
int GetMapMode(
HDC hdc // handle sur le contexte de périphérique
);
En sortie, la fonction retournera 0 si problème, sinon une des valeurs du tableau ci-dessus.
Lorsque l'option ISOTROPIC est choisie par une fonction SetMapMode, il faut d'abord définir la valeur maximum du repère de la zone de travail de la fenêtre:
BOOL SetWindowExtEx(
HDC hdc, // handle sur le contexte de périphérique
int nXExtent, // Valeur maximum en x
int nYExtent, // Valeur maximum en y
LPSIZE lpSize // Pointeur sur une structure de type SIZE
);
lpSize pointe sur une structure de type SIZE qui contiendra les anciennes valeurs du repère.
La fonction retourne 0 si erreur.
Enfin, définir la valeur maximum du repère de la zone d'affichage (viewport):
BOOL SetViewportExtEx(
HDC hdc, // handle sur le contexte de périphérique
int nXExtent, // Valeur maximum en x
int nYExtent, // Valeur maximum en y
LPSIZE lpSize // Pointeur sur une structure de type SIZE
);
La fonction est identique à la précédente...
Pour définir les origines des axes (càd le (0,0)) dans le viewport:
BOOL SetViewportOrgEx(
HDC hdc, // handle sur le contexte de périphérique
int X, // x dans le viewport
int Y, // y dans le viewport
LPPOINT lpPoint // Pointeur sur structure de type POINT
qui recevra les anciennes coordonnées de l'origine
);
et dans la fenêtre:
BOOL SetWindowOrgEx(
HDC hdc, // handle sur le contexte de périphérique
int X, // x dans le viewport
int Y, // y dans le viewport
LPPOINT lpPoint // Pointeur sur structure de type POINT
qui recevra les anciennes coordonnées de l'origine
);
Pour lire les valeurs:
de la zone de travail de la fenêtre:
BOOL GetWindowExtEx(
HDC hdc, // handle sur le contexte de périphérique
LPSIZE lpSize // Pointeur sur une structure de type SIZE
);
retourne 0 si problème
de la zone d'affichage:
BOOL GetViewportExtEx(
HDC hdc, // handle sur le contexte de périphérique
LPSIZE lpSize // dimensions du viewport
);
Pour lire les coordonnées de l'origine:
Dans le viewport
BOOL GetViewportOrgEx(
HDC hdc, // handle sur le contexte de périphérique
LPPOINT lpPoint // les coordonnées
de l'origine dans le viewport
);
et dans la fenêtre:
BOOL GetWindowOrgEx(
HDC hdc, // handle sur le contexte de périphérique
LPPOINT lpPoint // les coordonnées
de l'origine dans la window
);
Si les unités diffèrent entre la window et le viewport, il faut faire des conversions:
BOOL LPtoDP(
HDC hdc, // handle sur le contexte de périphérique
LPPOINT lpPoints, // Tableau de coordonnées de points
int nCount // Nombre de points dans le tableau
);
En entrée, le pointeur est sur un tableau de structure de type POINT, contenant les coordonnées logiques qui doivent être converties en coordonnées sur le périphérique.
En sortie, le tableau est mis à jour, ou la fonction retourne 0 si erreur.
Conversion de coordonnées du viewport vers la window:
BOOL DPtoLP(
HDC hdc, // handle sur le contexte de périphérique
LPPOINT lpPoints, // Tableau de coordonnées de points
int nCount // Nombre de points dans le tableau
);
Remarque:
Il existe aussi deux fonctions hors GDI: ClientToScreen et ScreenToClient qui permettent de convertir des coordonnées de la zone client en coordonnées sur l'écran et inversement. Ces fonctions sont expliquées dans le chapitre sur la souris, c'est en effet dans ce chapitre que je vois le mieux l'utilité de ces deux fonctions.