Fonction graphique hors GDI
Quoi, il existe des fonctions graphiques hors GDI !!!
En fait, il s'agit de fonctions un peu spéciales, car seules les fenêtres peuvent effectuer ce genre d'opérations:
Comme la fonction ScrollWindow(): Cette fonction va permettre de déplacer une partie de la zone client de la fenêtre soit de haut en bas, soit de gauche à droite. Plus simplement, de faire un scrolling. On imagine mal pouvoir faire cette opération sur une imprimante...C'est pour cette raison que cette fonction n'est pas une fonction GDI.
Attention ScrollWindow est devenue obsolète. Il faut utiliser la fonction suivante pour toutes nouvelles applications : ScrollWindowEx()
BOOL ScrollWindow(
HWND hWnd,
int XAmount,
int YAmount,
const RECT *lpRect,
const RECT *lpClipRect
);
Les paramètres sont:
hWnd : Handle d'une fenêtre de la zone
client à scroller.
XAmount : Déplacement à droite (valeur positive) ou à gauche
(valeur négative). Par défaut, l'unité est le pixel.
YAmount : Déplacement en bas (valeur positive) ou en haut (valeur négative).
Par défaut, l'unité est le pixel.
lpRect : Pointeur sur une structure de type RECT
indiquant la portion de la zone client à scroller. Si le paramètre
est NULL, alors toute la zone client
sera intégralement scrollée.
lpClipRect : Pointeur sur une structure de type RECT
pour définir une zone de clipping.
La fonction retourne 0 si une erreur.
Cette fonction va rendre invalide la portion de la zone client qui sera découverte suite au scrolling. Lors de la réception du message WM_PAINT, il n'y aura donc que cette zone à redessiner.
Il est donc inutile d'utiliser la fonction InvalidateRect();
Afin de repaindre immédiatement la zone découverte juste après le scrolling, il est préférable de faire suivre la commande de la fonction UpdateWindow(hwnd). Cet appel va envoyer à la procédure de la fenêtre (WndProc) le message WM_PAINT.
La fonction ScrollWindowEx: va permettre aussi un scrolling:
int ScrollWindowEx(
HWND hWnd,
int dx,
int dy,
const RECT *prcScroll,
const RECT *prcClip,
HRGN hrgnUpdate,
LPRECT prcUpdate,
UINT flags
);
Les paramètres sont:
hWnd : Handle d'une fenêtre de
la zone client à scroller.
dx : Déplacement à droite (valeur positive) ou à gauche
(valeur négative). Par défaut, l'unité est le pixel.
dy : Déplacement en bas (valeur positive) ou en haut (valeur négative).
Par défaut, l'unité est le pixel.
prcScroll : Pointeur sur une structure de type RECT
indiquant la portion de la zone client
à scroller. Si la paramètre est NULL, alors se sera la zone
client complète qui sera scrollée.
prcClip : Pointeur sur une structure de type RECT
pour définir une zone de clipping.
hrgnUpdate : Handle sur la région modifiée pour maintenir la région
découverte. Peut-être positionné à NULL.
prcUpdate : Pointeur sur une structure RECT
qui recevra les coordonnées de la zone
client invalidée. Ce paramètre peut-être NULL.
flags : Spécifier le flag pour le effectuer le scrolling:
Valeur | Désignation |
SW_ERASE | Va envoyer le message WM_ERASEBKGND pour effacer la région invalidée à la fenêtre lorsque le flag SW_INVALIDATE est spécifié. |
SW_INVALIDATE | Invalide la région identifiée par la paramètre hrgnUpdate après le scrolling |
SW_SCROLLCHILDREN | Scroller toutes les fenêtres filles qui sont dans la zone à scroller. Le système va envoyer le message WM_MOVE à toutes ces fenêtres filles. |
SW_SMOOTHSCROLL | Scrolling utilisant le "smooth scrolling". Il faut utiliser la partie haute du flag pour indiquer combien de fois il faut faire le smooth-scrolling. |
En sortie
En cas d'échec, la fonction retourne ERROR. GetLastError pour déterminer l'erreur.
Sinon la valeur SIMPLEREGION (région de forme rectangulaire), COMPLEXREGION (région non rectangulaire:plusieurs rectangles se superposant par exemple), ou NULLREGION (Aucune région invalide !).
si SW_INVALIDATE
et SW_ERASEne sont pas spécifiés, ScrollWindowEx ne va pas invalider
la zone scrollée. A l'inverse, si l'un des deux flags est positionné,
ScrollWindowEx invalidera la zone. La maj de la zone ne se fera que suite à
un appel à UpdateWindow(),
si vous avez les flags RDW_UPDATENOW ou RDW_ERASENOW ou enfin lorsque le message
WM_PAINT sera traité !