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

Image non trouvée !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é !