Le contrôle ProgressBar

 

 

Les différents styles de la classe:

4 styles sont disponibles:

- La barre de progression horizontale, où la progression se fait bloc de carré par bloc de carré (Style par défaut, rien à mettre).

Image non trouvée !

- La barre de progression horizontale, où la progression se fait en continue (Style = PBS_SMOOTH).

Image non trouvée !

- La barre de progression verticale (Style = PBS_VERTICAL) (Attention, dans ce cas, la progression de fait de bas en haut)

- Enfin, le style XP (Style = PBS_MARQUEE)

On pourra bien entendu combiner les tyles (via le |, si vous ne le savez pas encore...) .

 

Création de l'objet:

Avant de créer 1 ou n objets, il faudra s'assurer que la DLL COMCTL32 est chargée. Pour cela, il faudra exécuter une seule fois dans votre code la fonction InitCommonControls() ou InitCommonControlsEx().

Nous pourrons donc taper:

- Soit InitCommonControls();

Mais cette commande ne devrait plus être utilisée pour les nouvelles applications

- Soit

INITCOMMONCONTROLSEX iccInit;

//Initialisation et chargement du control ProgressBar
iccInit.dwSize = sizeof ( iccInit ) ;
iccInit.dwICC = ICC_PROGRESS_CLASS ;
InitCommonControlsEx ( &iccInit ) ;

qui est donc à préférer à la commande précédente...

Image non trouvée ! InitCommonControls() nécessitera l'ajout de la librairie COMCTL32.LIB dans votre projet (voir à la fin de ce chapitre).

Ensuite, nous pouvons créer un objet Barre de progression en utilisant la fonction CreateWindowEx().

hwndC1 = CreateWindowEx(0,
   PROGRESS_CLASS,
   (LPSTR) NULL,
   WS_CHILD | WS_VISIBLE | style de la barre de progression ou rien (par ex. PBS_SMOOTH),
   x,
   y,
   largeur,
   hauteur, //(Là hauteur ne devant pas être inférieure à 10)
   hwndParent,
   (HMENU) n° ID,
   hInstance,
   NULL); 


En général, on initialisera les valeurs mini et maxi, la position courante et le pas suite à la création de l'objet (et pourquoi aussi, les couleurs...)

 

Pour détruire l'objet:

Simplement par la fonction CloseWindow (hwndButton); ou DestroyWindow(hwndButton);

 

Lire ou paramétrer le contrôle:

On lira ou paramétrera le contrôle via la fonction SendMessage () de la manière suivante:

resultat = SendMessage (Handle de l'objet "Progress Bar", message commençant par PBM_ (Voir paragraphe Les messages), option dans wParam, option dans lParam);

 

Les messages:

PBM_SETPOS : Permet de positionner l'indicateur de la barre de progression.

PBM_DELTAPOS : Permet de déplacer l'indicateur de la barre de progression de n par rapport à sa position actuelle. wParam contenant le delta, lParam devra être à 0.

PBM_GETPOS : Récupère la position courante de l'indicateur de la barre de progression. (Ce qui permet de ne pas avoir à créer une variable dans votre code et de gérer cela comme un vrai objet avec ces méthodes). wParam et lParam doivent être à 0. Le résultat est de type UINT.

PBM_GETRANGE : Permet de récupérer les valeurs mini et maxi de la barre de progression.

Il y a deux manière de récupérer les valeurs:

Soit lParam = NULL. Dans ce cas, si wParam = TRUE, la fonction SendMessage retournera la valeur mini Sinon (wParam = FALSE), elle retournera la valeur maxi.

Soit lParam est un pointeur sur une structure de type PBRANGE. Dans ce cas, nous récupérerons les valeurs dans cette structure.

Structure:

typedef struct {
int iLow; // Nombre entier signé
int iHigh; // Nombre entier signé
} PBRANGE, *PPBRANGE;

PBM_SETBARCOLOR : Permet de positionner la couleur de l'indicateur de progression.wParam doit être à 0, lParam est la couleur au format COLORREF (N'oubliez pas la macro pour convertir du RGB en COLORREF bien pratique). La couleur par défaut pourra être remise en positionnant CLR_DEFAULT dans lParam. Enfin, SendMessage() retournera la valeur de la couleur précédente. Par exemple pour une barre de progression en rouge: SendMessage(hwndBarProg, PBM_SETBARCOLOR, 0, (LPARAM) RGB (255, 0, 0));

PBM_SETBKCOLOR : Permet de positionner la couleur de fond de la barre de progression. Pour le reste, c'est 100% la même chose que PBM_SETBARCOLOR.

PBM_SETRANGE : Pour positionner le minimum et le maximum (sur 16 bits chacun) de la barre de progression (Ceci provoquera le réaffichage de la boîte de dialogue).

Les valeurs minimum et maximum sont à passer dans lParam. On pourra utiliser la macro MAKELPARAM(min, max) pour convertir nos valeurs sur 32 bits pour lParam.(Remarque, la fonction nous retournera un word avec sa partie basse contenant la valeur mini, la partie haute contenant la valeur maxi)

PBM_SETSTEP : Permet d'indiquer la valeur du pas (Par défaut 10). Cette valeur pourra être positive ou négative et sera automatiquement ajouter à la position courante de la barre de progression lors de l'utilisation du message PBM_STEPIT. La valeur du pas étant à passer dans wParam (Par exemple, pour un pas = 1 : SendMessage(hwndBarProg, PBM_SETSTEP, (WPARAM) 1, 0);)

(Dommage, il n'y a pas de PBM_GETSTEP...)

Image non trouvée !La valeur du pas doit être inférieure à la valeur maxi de la barre de progression, sinon, il n'y aura aucun affichage lorsque vous demanderez le déplacement via PBM_STEPIT.

PBM_STEPIT : Permet de faire avancer (ou reculer) l'indiquateur de la barre de progression suivant la valeur du pas (Voir PBM_SETSTEP).

Des messages peu utiles selon moi:

PBM_SETMARQUEE : A partir de XP. Lorsque l'on neconnait pas la durée d'un traitement, ou les limites, on peut utiliser ce mode qui affichera une barre en progression automatique, qui permet à l'utilisateur de savoir que sa machine n'est pas plantée.wParam indiquant alors ON ou OFF sur le déplacement automatique. lParam représentant la durée en milliseconde entre deux animations. (Il est facile de reproduire un équivalent sous les autres versions en utilisant soit un thread, soit un timer par exemple...)

PBM_SETRANGE32 : Pour positionner le minimum (sur 16 bits dans wParam) et la valeur maximum (sur 32 bits dans lParam). La fonction retournera un DWORD correspondant aux précédentes valeurs.

 

Exemple:

Voici un exemple. Vous constaterez que pour faire avancer la barre de progression, j'utilise un timer...Si vous ne connaissez pas, il s'agit dans cet exemple de recevoir tout les 10 ms (théoriquement) un message WM_TIMER qui me permettra d'incrémenter ou de décrémenter la barre de progression.

Image non trouvée !

Image non trouvée ! Si vous avez une erreur de compilation sur InitCommonControls(), c'est certainement parce que vous n'avez pas la librairie COMCTL32.LIB dans votre projet (C'est le cas par défaut).

Sous Visual C++ le menu Project/settings et dans l'onglet link, ajoutez COMCTL32.LIB

Sous Dev-C++, le menu Project/Project options et dans le champ Further object files or linker options blablabla, ajoutez C:\Dev-C++\Lib\libcomctl32.a via le bouton (Le chemin peut varier suivant votre installation de Dev-C++. Mais dans tous les cas, cette librairie se trouve dans le répertoire Lib de Dev-C++).