Programmer en C++
Win32 - L'EditBox

1. EditBox

L'EditBox permet la saisie d'une texte, ou l'affichage d'un texte dans une fenêtre. Pour plus de simplicité, l'ensemble du code sera écrit ici dans un fichier unique. Nous générons le fichier de base automatiquement en créant un nouveau projet de type "Win32 GUI project".

2. Programmation d'une EditBox

La fonction permettant de construire une "EditBox" nécessite 3 déclarations préalables :

C'est donc au début de notre programme, juste après les "#include" que nous écrirons le code que voici :

HWND hEditBox;     // Handle sur notre EditBox
HINSTANCE hInstance;     // Instance pour notre EditBox
#define ID_TEXT 200     // Identifiant pour notre EditBox

Découvrons maintenant le code permettant de dessiner l'EditBox :

/* Creation d'une EditBox */
hEditBox = CreateWindow(
    TEXT("EDIT"),
    TEXT("Texte à afficher"),
    WS_VISIBLE | WS_CHILD | WS_BORDER,
    10, 10, 150, 20,
    hwnd,
    (HMENU) ID_TEXT,
    hInstance,
    NULL);

Nous reconnaissons la fonction déjà utilisée pour la création d'un bouton.

Où écrire cette fonction ?

Comme pour la création d'un bouton, c'est dans la boucle des messages que nous allons placer cette fonction. Naturellement pour faire apparaître notre EditBox à l'ouverture de la fenêtre, nous plaçons notre fonction dans WM_CREATE.

3. Couleur de fond et d'écriture pour notre EditBox

L'ajout d'un fond de couleur, ou le changement de la coueur d'écriture, nécessite pour l'EditBox la déclaration préalable d'un "Contexte de périphérique" (HDC). En gros c'est juste pour savoir où dessiner.
Après les "#include" nous ajoutons :

HDC hdcEdit;     // Contexte de périphérique pour notre EditBox

C'est le message WM_CTLCOLOREDIT qui nous permet de modifier les couleurs. Dans la boucle de message, nous ajoutons donc le code suivant :

case WM_CTLCOLOREDIT:
    /* Ajoute un fond de couleur à notre EditBox */
    hdcEdit = (HDC) wParam;
    if ((HWND) lParam == GetDlgItem(hwnd, ID_TEXT))
    {
        SetBkColor(hdcEdit, RGB(255, 255, 0));
        SetTextColor(hdcEdit, RGB(200, 0, 150));
    }

Un peu d'explication :
La condition "if" ne sert à rien dans cet exemple car il n'y a qu'une EditBox. Cependant il est intéressant de montrer comment grâce a son identifiant nous pourrions la sélectionner parmi plusieurs EditBox.
Comme on peut le deviner, c'est la fonction SetBkColor() qui modifie la couleur du fond et la fonction SetTextColor() qui modifie la couleur de l'écriture.

4. Modifier la police et la taille d'écriture

Pour modifier l'écriture nous avons besoin de déclarer un handle de font (HFONT).
Ensuite nous initialisons le handle en utilisant la fonction CreateFont(). Cette fonction contient de nombreux paramètres dont les plus importants sont :

Pour terminer nous utilisons la fonction SendMessage() qui transmet la police à notre EditBox grâce a son handle.

HFONT hFont;     // Handle sur l'écriture.
hFont = CreateFont(30, 0, 0, 0, FW_BOLD, 0, 0, 0, 0, 0, 0, 0, 0, TEXT("Arial"));
SendMessage(hEditBox, WM_SETFONT, (WPARAM)hFont, 0);

C'est dans la boucle de message WM_CREATE que nous écrivons ce code.

5. Code complet

#if defined(UNICODE) && !defined(_UNICODE)
    #define _UNICODE
#elif defined(_UNICODE) && !defined(UNICODE)
    #define UNICODE
#endif


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

HWND hEditBox;     // Handle sur notre EditBox
HINSTANCE hInstance;     // Instance pour notre EditBox
#define ID_TEXT 200     // Identifiant pour notre EditBox
HDC hdcEdit;     // Contexte de périphérique pour notre EditBox

// Déclaration de la procédure de fenêtre
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

// Création d'une variable globale contenant le nom de la classe de fenêtre
TCHAR szClassName[ ] = _T("CodeBlocksWindowsApp");

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("Ma jolie fenêtre"),
        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;
}

/* Procédure de fenêtre (action à réaliser) */
LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_CTLCOLOREDIT:
            /* Ajoute un fond de couleur à notre EditBox */
            hdcEdit = (HDC) wParam;
            if ((HWND) lParam == GetDlgItem(hwnd, ID_TEXT))
            {
                SetBkColor(hdcEdit, RGB(255, 255, 0));
                SetTextColor(hdcEdit, RGB(200, 0, 150));
            }
            break;

        case WM_CREATE:
            /* Creation d'une EditBox */
            hEditBox = CreateWindow(
                TEXT("EDIT"),
                TEXT("Texte à afficher"),
                WS_VISIBLE | WS_CHILD | WS_BORDER,
                10, 10, 200, 33,
                hwnd,
                (HMENU) ID_TEXT,
                hInstance,
                NULL);

            /* Modification de l'écriture */
            HFONT hFont;     // Handle sur l'écriture.
            hFont = CreateFont(30, 0, 0, 0, FW_BOLD, 0, 0, 0, 0, 0, 0, 0, 0, TEXT("Arial"));
            SendMessage(hEditBox, WM_SETFONT, (WPARAM)hFont, 0);
            break;

        case WM_DESTROY:
            PostQuitMessage (0);     // Déclenche la fermeture de la fenêtre
            break;

        default:
            return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    return 0;
}

Voici ce qu'on obtient :