API Windows en C

Les contrôles supplémentaires de Windows

CGi

♪

- Titre : API Windows en C

- Auteur : CGi

- Parution : 5 juillet 2005

- Licence : 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 et 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.

Sommaire

- I. Introduction

- II. Mise en œuvre

- III. La barre de progression

- IV. Code complet

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.

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.

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 :

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 :

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 :

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 :

SendDlgItemMessage(hDlg, IDE_PB1, PBM_STEPIT, 0, 0);

Ce que nous ferons à chaque action du bouton.

IV - Code complet

resource.h :

#define IDE_PB1 101

resource.rc :

#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 :

#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.

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