IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

API Windows en C

Les contrôles supplémentaires de Windows

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Introduction

Windows permet d'utiliser des contrôles supplémentaires gérés par une bibliothèque dynamique appelée : "Common control library" (comctrl32.dll)
Nous allons commencer par le plus simple : la barre de progression. Vous connaissez la barre de progression, celle qui nous fait patienter le temps d'un traitement long.
Nous allons pour cet exemple créer une boîte de dialogue appelée directement depuis la fonction d'entrée WinMain. Elle comportera : une barre de progression et un bouton qui la fera avancer d'une unité à chaque appui.

Image non disponible

II. Mise en œuvre

Les compilateurs de ressources ne connaissant pas ce contrôle nous utiliserons le type générique CONTROL pour le créer.

 
Sélectionnez
    CONTROL "", IDE_PB1, PROGRESS_CLASS, 0 ,10, 20, 140, 12

Il est suivi du texte, puis de son identificateur, puis du nom de sa classe de fenêtre, puis de son style, puis de sa position et de ses dimensions.
Ces contrôles pour être utilisés doivent s'assurer que comctrl32.dll est chargée. C'est le rôle de la fonction InitCommonControls :

 
Sélectionnez
       InitCommonControls();

Cette fonction doit être appelée une seule fois avant l'utilisation du contrôle.

III. La barre de progression

L'utilisation de la barre de progression est très simple. Avant son utilisation, vous lui envoyez un message PBM_SETRANGE pour définir ses bornes :

 
Sélectionnez
         SendDlgItemMessage(hDlg, IDE_PB1, PBM_SETRANGE, 0, MAKELONG(0,10));

Celle-ci dans les mots de poids faible et de poids fort du paramètre lParam, reconstitué avec la macro MAKELONG.
Ensuite, vous initialisez un pas de progression en lui envoyant un message PBM_SETSTEP :

 
Sélectionnez
         SendDlgItemMessage(hDlg, IDE_PB1, PBM_SETSTEP, 1, 0);

Le pas étant passé avec le paramètre wParam du message.
Enfin, vous la faites avancer d'un pas avec le message PBM_STEPIT :

 
Sélectionnez
         SendDlgItemMessage(hDlg, IDE_PB1, PBM_STEPIT, 0, 0);

Ce que nous ferons à chaque action du bouton.

IV. Code complet

resource.h :

 
Sélectionnez
#define IDE_PB1 101

resource.rc :

 
Sélectionnez
#include <windows.h>
#include "resource.h"

DIALOG1 DIALOG
   60, 60, 160, 80
          STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
                                                    CAPTION "ProgressBar"
BEGIN
    DEFPUSHBUTTON "Progress", IDOK, 56, 55, 42, 12
    CONTROL "", IDE_PB1, PROGRESS_CLASS, 0 ,10, 20, 140, 12
END

winmain.c :

 
Sélectionnez
#include <windows.h>
#include <commctrl.h>
#include "resource.h"

BOOL APIENTRY DlgProc(HWND Dlg,UINT message,WPARAM wParam,LPARAM lParam);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                                                  LPSTR lpCmdLine, int nCmdShow)
{
       InitCommonControls();
       DialogBox(hInstance,"DIALOG1",NULL,(DLGPROC)DlgProc);
       return 0;
}
/******************************************************************************/

BOOL APIENTRY DlgProc(HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
    switch (uMsg)
    {
      case WM_INITDIALOG:
         SendDlgItemMessage(hDlg, IDE_PB1, PBM_SETRANGE, 0, MAKELONG(0,10));
         SendDlgItemMessage(hDlg, IDE_PB1, PBM_SETSTEP, 1, 0);
         return TRUE;

      case WM_COMMAND :
         if (LOWORD(wParam) == IDOK)
              {
                   SendDlgItemMessage(hDlg, IDE_PB1, PBM_STEPIT, 0, 0);
                   return TRUE;
              }
         if (LOWORD(wParam) == IDCANCEL)
              {
                   EndDialog(hDlg,0);
                   return TRUE;
              }
      default :
         return FALSE;
    }
}

Dans le document suivant : "Le contrôle barre d'état". Un contrôle de la "Common control library" sera créé sur la fenêtre principale.

J'ai testé les compilations avec C++ Builder et Dev-C++.
Le compilateur de ressources de Dev-C++ n'ayant pas accepté la constante PROGRESS_CLASS, j'ai dû la remplacer par son véritable nom de classe de fenêtre.

 
Sélectionnez
    CONTROL "", IDE_PB1, "msctls_progress32", 0 ,10, 20, 140, 12

N'oubliez pas d'ajouter la bibliothèque d'importation "libcomctl32.a" avec Dev-C++ (Load object files dans Project options).

À voir un autre exemple d'utilisation d'un contrôle de comctrl32.dll : La barre d'état.

À vos PC.

CGi

Sommaire

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 CGi. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.