CARET
L'application a son icone, la souris a son pointeur, alors pourquoi le clavier n'aurait pas son curseur ?
Aïlle voilà bien le problème ! Curseur est un nom réservé à la souris et correspond au pointeur de la souris. Vous utiliserez donc un autre terme:
le caret...
Le caret est un objet un peu particulier, il n'y en a qu'un...
Normal en fait, seule la fenêtre qui a le focus aura aussi le focus du clavier. De là, comme une seule application peut avoir le focus sur le clavier, on ne voit pas bien l'intérêt d'afficher plusieurs carets. Cela serait plutôt difficile pour l'utilisateur de s'y retrouver si plusieurs applications affichaient simultanément un caret.
Ce qui va se traduire par:
- Une fenêtre qui a le focus peut demander l'affichage du caret.
- Une fenêtre qui perd le focus doit demander la fin de l'utilisation du caret (s'il avait un caret en cours).
Pour savoir si une fenêtre a le focus clavier, vous utiliserez le message WM_SETFOCUS.
Par contre, pour savoir qu'une fenêtre perd le focus, vous utiliserez le message WM_KILLFOCUS.
Les fonctions de gestion du caret sont les suivantes:
Création du caret:
BOOL CreateCaret(
HWND hWnd,
HBITMAP hBitmap,
int nWidth,
int nHeight
);
Les paramètres:
hWnd pour le handle de la window qui va utiliser le caret.
hBitmap pour le dessin du curseur avec NULL pour un curseur solide, (HBITMAP) 1 pour un curseur grisé, toutes autres valeurs est un handle d'un bitmap (Utilisez les fonctions CreateBitmap, CreateDIBitmap ou LoadBitmap, ces fonctions sont vues ici).
nWidth et nHeight qui sont la largeur et la hauteur du curseur. Ces valeurs seront ignorées si l'image du caret est un bitmap. Il est préférable que ces valeurs soient positionnées en utilisant celles retournées par la fonction GetSystemMetrics en spécifiant les paramètres SM_CXBORDER et SM_CYBORDER.
La fonction retourne 0 si erreur...
Remarque : Comme les polices de caractères ont généralements des tailles variables pour chacunes de leurs lettres, on évitera d'utiliser un caret plein, ou horizontal. On préférera un caret vertical.
Mettre un terme à l'utilisation du caret:
BOOL DestroyCaret(VOID);
Pas de paramètres. Cette fonction va détruire le curseur que si votre fenêtre a le focus. Sinon elle est sans effet évidemment !
Là aussi, comme toujours, la fonction retourne 0 si erreur...
Afficher le caret:
BOOL ShowCaret(
HWND hWnd
);
Trop simple donc sans commentaire...sauf peut évident: le caret ne sera affiché qui si vous en êtes propriétaire, sinon la fonction ne fait rien et retourne false !
Cacher le caret:
BOOL HideCaret(
HWND hWnd
);
Tout pareil que ShowCaret...
Demander la vitesse de clignotement:
UINT GetCaretBlinkTime(VOID);
Si zéro alors erreur, sinon valeur en milliseconde.
Positionner la valeur de clignotement:
BOOL SetCaretBlinkTime(
UINT uMSeconds
);
avec uMSeconds en milliseconde...
Demander la position du curseur:
BOOL GetCaretPos(
LPPOINT lpPoint
);
Avec lpPoint pointeur sur une structure de type POINT
typedef struct tagPOINT {
LONG x;
LONG y;
} POINT, *PPOINT;
x et y étant les coordonnées...
Positionner le caret (qu'il soit caché ou non):
BOOL SetCaretPos(
int X,
int Y
);
avec X et Y les coordonnées en pixel du caret.
Voici une exemple très simple d'affichage ou de destruction du caret: