Créer une fenêtre

Dans cet article, découvrez comment créer et afficher une fenêtre.

Classes de fenêtres

Une classe window définit un ensemble de comportements que plusieurs fenêtres peuvent avoir en commun. Par exemple, dans un groupe de boutons, chaque bouton a un comportement similaire lorsque l’utilisateur sélectionne le bouton. Bien sûr, les boutons ne sont pas complètement identiques. Chaque bouton affiche sa propre chaîne de texte et a ses propres coordonnées d’écran. Les données uniques pour chaque fenêtre sont appelées données d’instance.

Chaque fenêtre doit être associée à une classe de fenêtre, même si votre programme ne crée qu’une seule instance de cette classe. Une classe de fenêtre n’est pas une classe dans le sens C++. Il s’agit plutôt d’une structure de données utilisée en interne par le système d’exploitation. Les classes de fenêtre sont inscrites auprès du système au moment de l’exécution. Pour inscrire une nouvelle classe de fenêtre, renseignez une structure WNDCLASS :

// Register the window class.
const wchar_t CLASS_NAME[]  = L"Sample Window Class";

WNDCLASS wc = { };

wc.lpfnWndProc   = WindowProc;
wc.hInstance     = hInstance;
wc.lpszClassName = CLASS_NAME;

Vous devez définir les membres de structure suivants :

  • lpfnWndProc est un pointeur vers une fonction définie par l’application appelée procédure window ou processus de fenêtre. La procédure de fenêtre définit la plupart du comportement de la fenêtre. Pour l’instant, cette valeur est une déclaration de transfert d’une fonction. Pour plus d’informations, consultez Écriture de la procédure Window.
  • hInstance est le handle de l’instance d’application. Obtenez cette valeur à partir du paramètre hInstance de wWinMain.
  • lpszClassName est une chaîne qui identifie la classe window.

Les noms de classes étant locaux au processus actuel, le nom doit uniquement être unique au sein du processus. Toutefois, les contrôles Windows standard ont également des classes. Si vous utilisez l’un de ces contrôles, vous devez choisir des noms de classe qui ne sont pas en conflit avec les noms de classe de contrôle. Par exemple, la classe de fenêtre du contrôle bouton est nommée Button.

La structure WNDCLASS a d’autres membres qui ne sont pas affichés ici. Vous pouvez les définir sur zéro, comme illustré dans cet exemple, ou les remplir. Pour plus d’informations, consultez WNDCLASS.

Ensuite, passez l’adresse de la structure WNDCLASS à la fonction RegisterClass . Cette fonction inscrit la classe window auprès du système d’exploitation.

RegisterClass(&wc);

Créer la fenêtre

Pour créer une instance d’une fenêtre, appelez la fonction CreateWindowEx :

HWND hwnd = CreateWindowEx(
    0,                              // Optional window styles.
    CLASS_NAME,                     // Window class
    L"Learn to Program Windows",    // Window text
    WS_OVERLAPPEDWINDOW,            // Window style

    // Size and position
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

    NULL,       // Parent window    
    NULL,       // Menu
    hInstance,  // Instance handle
    NULL        // Additional application data
    );

if (hwnd == NULL)
{
    return 0;
}

Pour obtenir des descriptions détaillées des paramètres, consultez CreateWindowEx. Voici un résumé rapide :

  • Le premier paramètre vous permet de spécifier certains comportements facultatifs pour la fenêtre, par exemple les fenêtres transparentes. Définissez ce paramètre sur zéro pour les comportements par défaut.
  • CLASS_NAME est le nom de la classe window. Ce nom définit le type de fenêtre à créer.
  • Le texte de la fenêtre est utilisé de différentes manières par différents types de fenêtres. Si la fenêtre a une barre de titre, le texte s’affiche dans la barre de titre.
  • Le style de fenêtre est un ensemble d’indicateurs qui définissent une partie de l’apparence d’une fenêtre. La constante WS_OVERLAPPEDWINDOW est en fait plusieurs indicateurs combinés à un bit.OR Ensemble, ces indicateurs donnent à la fenêtre une barre de titre, une bordure, un menu système et des boutons Réduire et Agrandir . Cet ensemble d’indicateurs est le style le plus courant pour une fenêtre d’application de niveau supérieur.
  • Pour la position et la taille, la constante CW_USEDEFAULT signifie utiliser des valeurs par défaut.
  • Le paramètre suivant définit une fenêtre parente ou une fenêtre propriétaire pour la nouvelle fenêtre. Définissez le parent si pour créer une fenêtre enfant. Pour une fenêtre de niveau supérieur, définissez cette valeur sur NULL.
  • Pour une fenêtre d’application, le paramètre suivant définit le menu de la fenêtre. Cet exemple n’utilise pas de menu, de sorte que la valeur est NULL.
  • hInstance est le handle d’instance, décrit précédemment. Consultez WinMain : point d’entrée de l’application.
  • Le dernier paramètre est un pointeur vers des données arbitraires de type void*. Vous pouvez utiliser cette valeur pour passer une structure de données à votre procédure de fenêtre. Pour savoir comment utiliser ce paramètre, consultez Gestion de l’état de l’application.

CreateWindowEx retourne un handle à la nouvelle fenêtre, ou zéro si la fonction échoue. Pour afficher la fenêtre, autrement dit, rendre la fenêtre visible, passez la poignée de fenêtre à la fonction ShowWindow :

ShowWindow(hwnd, nCmdShow);

Le paramètre hwnd est le handle de fenêtre retourné par CreateWindowEx. Le paramètre nCmdShow peut être utilisé pour réduire ou agrandir une fenêtre. Le système d’exploitation transmet cette valeur au programme via la fonction wWinMain .

Voici le code complet pour créer la fenêtre. N’oubliez pas que WindowProc n’est toujours qu’une déclaration de transfert d’une fonction.

// Register the window class.
const wchar_t CLASS_NAME[]  = L"Sample Window Class";

WNDCLASS wc = { };

wc.lpfnWndProc   = WindowProc;
wc.hInstance     = hInstance;
wc.lpszClassName = CLASS_NAME;

RegisterClass(&wc);

// Create the window.

HWND hwnd = CreateWindowEx(
    0,                              // Optional window styles.
    CLASS_NAME,                     // Window class
    L"Learn to Program Windows",    // Window text
    WS_OVERLAPPEDWINDOW,            // Window style

    // Size and position
    CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

    NULL,       // Parent window    
    NULL,       // Menu
    hInstance,  // Instance handle
    NULL        // Additional application data
    );

if (hwnd == NULL)
{
    return 0;
}

ShowWindow(hwnd, nCmdShow);

Félicitations, vous avez créé une fenêtre !

Pour l’instant, la fenêtre ne contient aucun contenu et n’interagit pas avec l’utilisateur. Dans une application d’interface utilisateur graphique réelle, la fenêtre répond aux événements de l’utilisateur et du système d’exploitation. La section suivante décrit comment les messages de fenêtre fournissent ce type d’interactivité.

Voir aussi

Passez à Messages de fenêtre pour continuer ce module.