Programmer en C++
Application Windows de base

1. Introduction

Il n'est pas nécessaire de connaitre la moindre ligne de programmation pour construire notre première page Windows vierge. Avec CodeBlock, il suffit de suivre la démarche qui est présenté ci-dessous. Vous ne pourrez cependant pas échapper à la compréhension du code si vous désirez rendre votre application attrayante ou utile. Dans une deuxième étape, je vais donc présenter ce code de la manière la plus simple possible pour ne pas effrayer les débutants. Les détails nécessaires seront ajoutés au fil des pages. Assez de bavardages, passons à la pratique :

2. Création d'une fenêtre Windows

Dans le menu "File", choisir "New", puis "Project..."

Dans la fenêtre qui s'ouvre (voir ci-dessous),
nous cliquerons sur "Win 32 GUI project", puis sur "Go".

Choisissez le type "Frame based", puis après avoir cliqué sur le bouton "Next", nommez votre projet pour l'enregistrer.

Dans la fenêtre qui apparaît, cliquez sur "Finish". Voilà c'est terminé.

Notre programme est maintenant écrit. Pour le voir, il faut le compiler et ensuite le lancer. Je clique donc sur l'icone représentant un duo engrenage associé à une flèche verte (Build and run).

Ne soyez pas étonné si votre anti virus réagit de façon agressive. C'est normal, il ne connait pas encore votre programme, et le traite comme un intrus. Lorsque l'analyse sera terminée voilà ce que vous allez obtenir :

Ne soyez pas étonné, il y aura toujours cette deuxième fenêtre de type DOS qui appraîtra derrière. C'est typique de CodeBlock.

3. Analyse du code

Nous abordons maintenant la partie difficile.

Une application Win32 nécessite deux bibliothèques que nous plaçons au début du programme :

#include <tchar.h>
#include <windows.h>

La ligne suivante représente la déclaration de la procédure de fenêtre.

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

Elle est définie un peu plus loin dans le programme de la façon suivante :

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_DESTROY:
            PostQuitMessage (0);     // Déclenche la fermeture de la fenêtre
            break;
        default:
            return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    return 0;
}

Cette fonction est très importante car elle permet de traiter les messages provenant de la fenêtre. Ces messages sont par exemple : "un clic de souris", "le déplacement du pointeur", etc. Pour l'instant cette fonction ne permet que de fermer la fenêtre lorsque l'utilisateur clique sur la fameuse petite croix bien connue de tous, située en haut à droite de chaque fenêtre.
Dans les chapîtres suivants, nous verrons que c'est dans cette fonction que nous ajouterons des lignes de programmes pour rendre notre fenêtre opérationnelle.

Vous vous souvenez du programme principal "main()" dans un projet de type console ? Ici la fonction sera un peu plus complexe et se nommera "WinMain". Découvrons cette fonction maintenant.

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow)
{
    HWND hwnd;     // "handle" de la fenêtre
    MSG messages;     // variable de sauvegarde des messages provenant de la fenêtre
    WNDCLASSEX wincl;     // Création d'une structure de classe de fenêtre

    /* Structure de la classe de fenêtre */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;
    wincl.style = CS_DBLCLKS;
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Choix par défaut des icones et du pointeur de souris */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;
    wincl.cbClsExtra = 0;
    wincl.cbWndExtra = 0;
    /* Choix par défaut de la couleur de l'arrière plan */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Enregistrement de la classe de fenêtre. Si échec, on quitte le programme */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* Création de la fenêtre */
    hwnd = CreateWindowEx (
        0,
        szClassName,
        _T("Code::Blocks Template Windows App"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        544,
        375,
        HWND_DESKTOP,
        NULL,
        hThisInstance,
        NULL
       );

    /* Affichage de la fenêtre à l'écran */
    ShowWindow (hwnd, nCmdShow);

    /* Boucle de lecture des messages */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Convertit les codes messages en caractères */
        TranslateMessage(&messages);
        /* Envoie des messages à la fonction WindowProcedure */
        DispatchMessage(&messages);
    }

    /* Valeur de retour */
    return messages.wParam;
}

En effet il y a de quoi effrayer un débutant. Commençons juste par des choses toutes simples :
La première partie commence par construire une classe de fenêtre, qui est ensuite enregistrée. La partie suivante crée la fenêtre en lui donnant des paramètres. Trois de ces paramètres vont nous intéresser maintenant :


Ce chapître se termine ici. Contentez vous de relire le code en essayant de repérer les grandes parties. Les détails viendrons petit à petit. Bon courage.