Partager via


Procédure pas à pas : Créer une application de bureau Windows traditionnelle (C++)

Cette procédure pas à pas explique comment créer une application de bureau Windows traditionnelle dans Visual Studio. L’application que vous créez utilise l’API Windows pour afficher Hello, Bureau Windows ! dans une fenêtre. Vous pouvez utiliser le code que vous développez dans cette procédure pas à pas comme modèle pour créer des applications de bureau Windows.

L’API Windows (également connue sous le nom d’API Win32, d’API Windows Desktop et d’API Windows Classique) est une infrastructure de travail basé sur le langage C pour la création d’applications Windows. Il a été utilisé pour créer des applications Windows depuis des décennies. Des frameworks plus avancés et plus faciles à programmer ont été basés sur l’API Windows, par exemple, les frameworks MFC, ATL et .NET. Même le code Windows Runtime le plus moderne pour les applications UWP et Store écrites en C++/WinRT utilise l’API Windows. Pour plus d’informations sur l’API Windows, voir Index de l’API Windows.

Importante

La section Générer le code à la fin de cet article affiche le code complet. Cette procédure pas à pas couvre les différents éléments de code qui entrent dans une application Windows, mais certains détails sont omis dans les extraits de code pour se concentrer sur les parties les plus importantes. Vous pouvez copier le code complet et le coller dans votre projet à la fin.

Prérequis

  • Microsoft Windows 7 ou versions ultérieures. Nous recommandons Windows 11 ou une version ultérieure pour une meilleure expérience de développement.

  • Visual Studio. Pour plus d’informations sur le téléchargement et l’installation de Visual Studio, consultez Installer Visual Studio. Lorsque vous exécutez le programme d’installation, assurez-vous que la charge de travail développement Desktop en C++ est activée. Ne vous inquiétez pas si vous n’avez pas installé cette charge de travail en même temps que Visual Studio. Vous pouvez réexécuter le programme d’installation et l’installer maintenant.

    Capture d’écran du développement Desktop avec une charge de travail C plus plus dans Visual Studio Installer.

  • Une compréhension de base de l’utilisation de l’IDE Visual Studio. Si vous avez déjà utilisé des applications de bureau Windows, vous n’aurez probablement aucun mal à suivre. Pour une introduction, consultez Visite guidée des fonctionnalités de l’IDE Visual Studio.

  • Vous connaissez bien le langage C++. Ne vous inquiétez pas, nous ne faisons rien de bien compliqué.

Créer un projet de bureau Windows

Suivez les étapes suivantes pour créer votre premier projet de bureau Windows. Comme indiqué au début de cet article, le code terminé est disponible dans la section Générer le code à la fin de la procédure pas à pas. Suivez les étapes de la création du projet, mais ne collez les sections de code suivantes qu’à la fin, lorsque le code complet de l’application est présenté. Certains détails sont omis dans les extraits de code afin de se concentrer sur les parties les plus importantes. Vous pouvez copier le code complet et le coller dans votre projet à la fin.

Pour afficher les étapes de votre version préférée de Visual Studio, utilisez le sélecteur de version situé en haut de la table des matières de cette page.

Pour créer un projet de bureau Windows dans Visual Studio

  1. Dans le menu principal, choisissez Fichier>Nouveau>Projet pour ouvrir la boîte de dialogue Créer un projet.

  2. En haut de la boîte de dialogue, définissez Langage sur C++ , Plateforme sur Windows et Type de projet sur Bureau.

  3. À partir de la liste filtrée des types de projets, choisissez Assistant Windows Desktop, puis choisissez Suivant. Dans la page suivante, entrez un nom pour le projet, par exemple DesktopApp.

  4. Choisissez le bouton Créer pour créer le projet.

  5. La boîte de dialogue Projet Windows Desktop s’affiche maintenant. Dans la liste déroulante type d’application, veillez à sélectionner application de bureau (.exe). Étant donné que nous créons une application Windows, le choix de l’application console donne lieu à un projet qui ne se construira pas compte tenu du code que nous allons utiliser. Puis, sous Options supplémentaires, sélectionnez Projet vide. Cliquez sur OK pour créer le projet.

  6. Dans l’Explorateur de solutions, cliquez avec le bouton droit de la souris sur le projet DesktopApp, choisissez Ajouter, puis choisissez Nouvel élément.

    Animation montrant l’ajout d’un nouvel élément à DesktopApp Project dans Visual Studio 2019.

    L’animation montre un clic droit sur le nom du projet dans l’Explorateur de solutions, le choix de l’option Ajouter dans le menu qui apparaît, puis le choix de l’option Nouvel élément.

  7. Dans la boîte de dialogue Ajouter un nouvel élément , sélectionnez Fichier C++ (.cpp). Dans la zone Nom , tapez un nom pour le fichier, par exemple HelloWindowsDesktop.cpp. Choisissez Ajouter.

    Capture d’écran de la boîte de dialogue Ajouter un nouvel élément dans Visual Studio 2019. L’option C plus plus Fichier (.cpp) est sélectionnée. Le champ nom est défini sur Hello Windows Desktop.cpp.

Votre projet est maintenant créé et votre fichier source est ouvert dans l’éditeur.

Pour créer un projet de bureau Windows dans Visual Studio 2017

  1. Dans le menu Fichier, choisissez Nouveau, puis Projet.

  2. Dans la boîte de dialogue Nouveau projet, dans le volet gauche, développez Installé>Visual C++, puis sélectionnez Windows Desktop. Dans le volet moyen, sélectionnez Assistant Windows Desktop.

    Dans la zone Nom , tapez le nom du projet, par exemple, DesktopApp. Choisissez OK.

    Capture d’écran de la boîte de dialogue Nouveau projet dans Visual Studio 2017. L’élément Assistant Bureau Windows est sélectionné. La zone de texte du nom indique DesktopApp.

  3. Dans la boîte de dialogue Projet Windows Desktop, sous Type d’application, sélectionnez Application Windows (.exe). Sous Options supplémentaires, sélectionnez Projet vide. Vérifiez que l’en-tête précompilé n’est pas sélectionné. Cliquez sur OK pour créer le projet.

  4. Dans l’Explorateur de solutions, cliquez avec le bouton droit de la souris sur le projet DesktopApp, choisissez Ajouter, puis choisissez Nouvel élément.

    Une animation montrant l’ajout d’un nouvel élément au projet DesktopApp dans Visual Studio 2017.

    L’animation montre un clic droit sur le nom du projet dans l’Explorateur de solutions, le choix de l’option Ajouter dans le menu qui est apparu, puis le choix de l’option Nouvel élément.

  5. Dans la boîte de dialogue Ajouter un nouvel élément , sélectionnez Fichier C++ (.cpp). Dans la zone Nom , tapez un nom pour le fichier, par exemple HelloWindowsDesktop.cpp. Choisissez Ajouter.

    Capture d’écran de la boîte de dialogue Ajouter un nouvel élément dans Visual Studio 2017. Visual C plus plus est sélectionné à gauche et l’option Fichier plus C plus est mise en surbrillance.

Votre projet est maintenant créé et votre fichier source est ouvert dans l’éditeur.

Pour créer un projet de bureau Windows dans Visual Studio 2015

  1. Dans le menu Fichier, choisissez Nouveau, puis Projet.

  2. Dans la boîte de dialogue Nouveau projet, dans le volet de gauche, développez Installé>Modèles>Visual C++, puis sélectionnez Win32. Dans le volet central, sélectionnez Projet Win32.

    Dans la zone Nom , tapez le nom du projet, par exemple, DesktopApp. Choisissez OK.

    Capture d’écran de la boîte de dialogue Nouveau projet dans Visual Studio 2015 avec l’option Projet Win32 mise en surbrillance et DesktopApp tapée dans la zone de texte Nom.

  3. Sur la page Vue d’ensemble de l’Assistant Application Win32, cliquez sur Suivant.

    Capture d’écran de la boîte de dialogue dans Visual Studio 2015 montrant la page Vue d’ensemble de l’Assistant Application Win32.

  4. Sur la page Paramètres de l’application, sous Type d’application Windows, sélectionnez Application Windows. Sous Options supplémentaires, sélectionnez En-tête précompilé, puis Projet vide. Cliquez sur Terminer pour créer le projet.

  5. Dans l’Explorateur de solutions, cliquez avec le bouton droit de la souris sur le projet DesktopApp, choisissez Ajouter, puis choisissez Nouvel élément.

    Animation montrant l’ajout d’un nouvel élément à DesktopApp Project dans Visual Studio 2015.

    L’animation montre un clic droit sur le nom du projet dans l’Explorateur de solutions, le choix de l’option Ajouter dans le menu qui apparaît, puis le choix de l’option Nouvel élément.

  6. Dans la boîte de dialogue Ajouter un nouvel élément , sélectionnez Fichier C++ (.cpp). Dans la zone Nom , tapez un nom pour le fichier, par exemple HelloWindowsDesktop.cpp. Choisissez Ajouter.

    Capture d’écran de la boîte de dialogue Ajouter un nouvel élément dans Visual Studio 2015 avec Visual C plus plus sélectionné et l’option C plus plus Fichier mise en surbrillance.

Votre projet est maintenant créé et votre fichier source est ouvert dans l’éditeur.

Code

Ensuite, vous apprendrez à créer le code d’une application de bureau Windows dans Visual Studio.

Où le code commence à s’exécuter dans une application de bureau Windows

  1. Tout comme chaque application C et C++ doit avoir une mainfonction comme point de départ, chaque application de bureau Windows doit avoir une WinMain fonction. La syntaxe deWinMain est la suivante.

    int WINAPI WinMain(
       _In_ HINSTANCE hInstance,
       _In_opt_ HINSTANCE hPrevInstance,
       _In_ LPSTR     lpCmdLine,
       _In_ int       nCmdShow
    );
    

    Pour plus d’informations sur les paramètres et la valeur de retour de cette fonction, consultez Point d’entrée WinMain.

    Remarque

    Quels sont tous ces mots supplémentaires, tels que WINAPI, ou CALLBACK, ou HINSTANCE, ou _In_ ? L’API Windows traditionnelle utilise largement les typedefs et les macros de préprocesseur pour faire abstraction de certains détails des types et du code spécifique à la plate-forme, tels que les conventions d’appel, les déclarations __declspec et les pragmas du compilateur. Dans Visual Studio, vous pouvez utiliser la fonctionnalité d’informations rapides IntelliSense pour voir ce que ces typesdefs et macros définissent. Placez votre souris sur le mot d’intérêt ou sélectionnez-le, puis appuyez sur Ctrl+K, Ctrl+J pour une petite fenêtre contextuelle qui contient la définition. Pour plus d’informations, consultez Utilisation d’IntelliSense. Les paramètres et les types de retour utilisent souvent annotations SAL pour vous aider à intercepter les erreurs de programmation. Pour plus d’informations, voir Utilisation des annotations SAL pour réduire les défauts du code C/C++.

  2. Les programmes de bureau Windows nécessitent <windows.h>. Vous voyez également fréquemment #include <tchar.h>. C’est pour faciliter l’écriture d’une application qui peut fonctionner avec char ou wchar_t. La façon dont il fonctionne est que vous utilisez plutôt la macro TCHAR dans votre code, qui se résout finalement à wchar_t si le symbole UNICODE est défini dans votre projet, sinon il se résout à char. Si vous générez toujours avec UNICODE activé, vous n’avez pas besoin de TCHAR et pouvez simplement utiliser wchar_t directement. Pour plus d’informations, consultez Utilisation de mappages de texte générique. Le code suivant présente ces deux instructions #include en haut du fichier.

    #include <windows.h>
    #include <tchar.h>
    
  3. Avec la fonction WinMain, chaque application de bureau Windows doit avoir une fonction de procédure de fenêtre. Cette fonction est appelée WndProc, mais vous pouvez lui donner le nom que vous aimez dans votre code. La syntaxe deWndProc est la suivante.

    LRESULT CALLBACK WndProc(
       _In_ HWND   hWnd,
       _In_ UINT   message,
       _In_ WPARAM wParam,
       _In_ LPARAM lParam
    );
    

    Dans cette fonction, vous écrivez du code pour gérer les messages que l’application reçoit de Windows quand événements se produisent. Par exemple, si un(e) utilisateur(-trice) choisit un bouton OK dans votre application, Windows vous envoie un message. Vous écrivez du code à l’intérieur d’une fonction WndProc qui effectue le travail approprié. Elle est appelée gestion un événement. Vous ne traitez que les événements pertinents pour votre application.

    Pour plus d’informations, consultez Window Procedures.

Ajouter une fonctionnalité à la fonction de langageWinMain

  1. Dans cette fonction WinMain, vous devez capturer quelques informations de base sur votre fenêtre principale. Pour ce faire, remplissez une structure de type WNDCLASSEX. La structure contient des informations sur la fenêtre, telles que l’icône de l’application, la couleur d’arrière-plan de la fenêtre, le nom à afficher dans la barre de titre, entre autres. Il est important de noter qu’il contient un pointeur de fonction vers votre procédure de fenêtre qui gère les messages que Windows envoie à votre application. L’exemple suivant montre une structure typique WNDCLASSEX :

    WNDCLASSEX wcex;
    
    wcex.cbSize         = sizeof(WNDCLASSEX);
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(wcex.hInstance, IDI_APPLICATION);
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, IDI_APPLICATION);
    

    Pour plus d’informations sur les champs de cette structure, consultez WNDCLASSEX.

  2. Une fois la structure WNDCLASSEX remplie, vous l’enregistrez auprès de Windows afin qu’il connaisse votre fenêtre et sache comment lui envoyer des messages. Utilisez la fonction RegisterClassEx et transmettez la structure de la classe de fenêtre en tant qu’argument. La _T macro est utilisée, car nous utilisons le TCHAR type selon la discussion précédente sur Unicode. Le code suivant montre comment inscrire la classe de fenêtre.

    if (!RegisterClassEx(&wcex))
    {
       MessageBox(NULL,
          _T("Call to RegisterClassEx failed!"),
          _T("Windows Desktop Guided Tour"),
          NULL);
    
       return 1;
    }
    
  3. Créez une fenêtre à l’aide de la CreateWindowEx fonction.

    static TCHAR szWindowClass[] = _T("DesktopApp");
    static TCHAR szTitle[] = _T("Windows Desktop Guided Tour Application");
    
    // The parameters to CreateWindowEx explained:
    // WS_EX_OVERLAPPEDWINDOW : An optional extended window style.
    // szWindowClass: the name of the application
    // szTitle: the text that appears in the title bar
    // WS_OVERLAPPEDWINDOW: the type of window to create
    // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
    // 500, 100: initial size (width, length)
    // NULL: the parent of this window
    // NULL: this application does not have a menu bar
    // hInstance: the first parameter from WinMain
    // NULL: not used in this application
    HWND hWnd = CreateWindowEx(
    WS_EX_OVERLAPPEDWINDOW,
       szWindowClass,
       szTitle,
       WS_OVERLAPPEDWINDOW,
       CW_USEDEFAULT, CW_USEDEFAULT,
       500, 100,
       NULL,
       NULL,
       hInstance,
       NULL
    );
    if (!hWnd)
    {
       MessageBox(NULL,
          _T("Call to CreateWindowEx failed!"),
          _T("Windows Desktop Guided Tour"),
          NULL);
    
       return 1;
    }
    

    Cette fonction retourne un HWND, qui est une poignée de fenêtre. Une poignée est un peu comme un pointeur. Windows l’utilise pour suivre les fenêtres que vous créez. Pour plus d'informations, consultez Types de données Windows.

  4. À ce stade, la fenêtre a été créée, mais nous devons toujours indiquer à Windows de le rendre visible. C’est ce que fait ce code :

    // The parameters to ShowWindow explained:
    // hWnd: the value returned from CreateWindow
    // nCmdShow: the fourth parameter from WinMain
    ShowWindow(hWnd,
       nCmdShow);
    UpdateWindow(hWnd);
    

    La fenêtre affichée n’est qu’un rectangle vide, car vous n’avez pas encore implémenté la fonction WndProc. L’application ne traite pas encore les messages que Windows lui envoie maintenant.

  5. Pour gérer les messages, nous ajoutons d’abord ce qu’on appelle une boucle de message pour écouter les messages envoyés par Windows. Lorsque l’application reçoit un message, cette boucle le transmet à votre fonction WndProc pour qu’elle le traite. La boucle de message ressemble au code suivant :

    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
    }
    
    return (int) msg.wParam;
    

    Pour plus d’informations sur les structures et les fonctions de la boucle de message, voir MSG, GetMessage, TranslateMessage, et DispatchMessage.

    Une fonction de base WinMain qui crée la fenêtre principale de l’application et écoute les messages que Windows envoie à votre application ressemble au code suivant :

    int WINAPI WinMain(HINSTANCE hInstance,
                       HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine,
                       int nCmdShow)
    {
       WNDCLASSEX wcex;
    
       wcex.cbSize = sizeof(WNDCLASSEX);
       wcex.style          = CS_HREDRAW | CS_VREDRAW;
       wcex.lpfnWndProc    = WndProc;
       wcex.cbClsExtra     = 0;
       wcex.cbWndExtra     = 0;
       wcex.hInstance      = hInstance;
       wcex.hIcon          = LoadIcon(wcex.hInstance, IDI_APPLICATION);
       wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
       wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
       wcex.lpszMenuName   = NULL;
       wcex.lpszClassName  = szWindowClass;
       wcex.hIconSm        = LoadIcon(wcex.hInstance, IDI_APPLICATION);
    
       if (!RegisterClassEx(&wcex))
       {
          MessageBox(NULL,
             _T("Call to RegisterClassEx failed!"),
             _T("Windows Desktop Guided Tour"),
             NULL);
    
          return 1;
       }
    
       // Store instance handle in our global variable
       hInst = hInstance;
    
       // The parameters to CreateWindowEx explained:
       // WS_EX_OVERLAPPEDWINDOW : An optional extended window style.
       // szWindowClass: the name of the application
       // szTitle: the text that appears in the title bar
       // WS_OVERLAPPEDWINDOW: the type of window to create
       // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
       // 500, 100: initial size (width, length)
       // NULL: the parent of this window
       // NULL: this application dows not have a menu bar
       // hInstance: the first parameter from WinMain
       // NULL: not used in this application
       HWND hWnd = CreateWindowEx(
          WS_EX_OVERLAPPEDWINDOW,
          szWindowClass,
          szTitle,
          WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, CW_USEDEFAULT,
          500, 100,
          NULL,
          NULL,
          hInstance,
          NULL
       );
    
       if (!hWnd)
       {
          MessageBox(NULL,
             _T("Call to CreateWindow failed!"),
             _T("Windows Desktop Guided Tour"),
             NULL);
    
          return 1;
       }
    
       // The parameters to ShowWindow explained:
       // hWnd: the value returned from CreateWindow
       // nCmdShow: the fourth parameter from WinMain
       ShowWindow(hWnd, nCmdShow);
       UpdateWindow(hWnd);
    
       // Main message loop:
       MSG msg;
       while (GetMessage(&msg, NULL, 0, 0))
       {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
       }
    
       return (int) msg.wParam;
    }
    

Gérer les messages dans la fonction WndProc

  1. Pour gérer les messages que l’application reçoit, vous implémentez une instruction switch dans votre fonction WndProc.

    Un message important à gérer est WM_PAINT. L’application reçoit ce message WM_PAINT quand une partie de sa fenêtre affichée doit être mise à jour. L’événement peut se produire lorsqu’un(e) utilisateur(-trice) déplace une fenêtre devant la vôtre, puis la déplace à nouveau. Il reçoit ce message lors du premier affichage de votre fenêtre, ce qui vous permet d’afficher l’interface utilisateur de votre application. Votre application découvre ces événements quand Windows les envoie. Lors de l’affichage initial de la fenêtre, tout son contenu doit être mis à jour.

    Pour gérer un message WM_PAINT, il faut d’abord appeler BeginPaint, puis gérer toute la logique de disposition du texte, des boutons et des autres contrôles dans la fenêtre. Appelez ensuite EndPaint. Pour cette application, le code entre BeginPaint() et EndPaint() affiche Hello, Windows desktop! dans la fenêtre que vous avez créée dans WinMain(). Dans le code suivant, la fonction TextOut affiche le texte à l’emplacement spécifié dans la fenêtre.

    PAINTSTRUCT ps;
    HDC hdc;
    TCHAR greeting[] = _T("Hello, Windows desktop!");
    
    switch (message)
    {
    case WM_PAINT:
       hdc = BeginPaint(hWnd, &ps);
    
       // Here your application is laid out.
       // For this introduction, we just print out "Hello, Windows desktop!"
       // in the top left corner.
       TextOut(hdc,
          5, 5,
          greeting, _tcslen(greeting));
       // End application-specific layout section.
    
       EndPaint(hWnd, &ps);
       break;
    }
    

    Dans le code précédent, HDC est une poignée vers un contexte d’appareil associé à la zone cliente de la fenêtre. Vous l’utilisez lors du dessin dans la fenêtre pour faire référence à sa zone cliente. Utilisez les fonctions BeginPaint et EndPaint pour préparer et terminer le dessin dans la zone cliente. BeginPaint retourne une poignée au contexte d’appareil d’affichage utilisé pour dessiner dans la zone cliente; EndPaint met fin à la requête de peinture et libère le contexte de l’appareil.

  2. Une application gère généralement de nombreux autres messages. Par exemple, WM_CREATE est envoyé lorsqu’une fenêtre est créée pour la première fois et WM_DESTROY lorsque la fenêtre est fermée. Le code suivant illustre une fonction WndProc de base, mais complète :

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
       PAINTSTRUCT ps;
       HDC hdc;
       TCHAR greeting[] = _T("Hello, Windows desktop!");
    
       switch (message)
       {
       case WM_PAINT:
          hdc = BeginPaint(hWnd, &ps);
    
          // Here your application is laid out.
          // For this introduction, we just print out "Hello, Windows desktop!"
          // in the top left corner.
          TextOut(hdc,
             5, 5,
             greeting, _tcslen(greeting));
          // End application specific layout section.
    
          EndPaint(hWnd, &ps);
          break;
       case WM_DESTROY:
          PostQuitMessage(0);
          break;
       default:
          return DefWindowProc(hWnd, message, wParam, lParam);
          break;
       }
    
       return 0;
    }
    

Générer le code

Comme promis, le code complet de l’application de travail suit.

Pour générer cet exemple

  1. Supprimez tout le code dans HelloWindowsDesktop.cpp dans l’éditeur. Copiez cet exemple de code et collez-le dans HelloWindowsDesktop.cpp:

    // HelloWindowsDesktop.cpp
    // compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c
    
    #include <windows.h>
    #include <stdlib.h>
    #include <string.h>
    #include <tchar.h>
    
    // Global variables
    
    // The main window class name.
    static TCHAR szWindowClass[] = _T("DesktopApp");
    
    // The string that appears in the application's title bar.
    static TCHAR szTitle[] = _T("Windows Desktop Guided Tour Application");
    
    // Stored instance handle for use in Win32 API calls such as FindResource
    HINSTANCE hInst;
    
    // Forward declarations of functions included in this code module:
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    int WINAPI WinMain(
       _In_ HINSTANCE hInstance,
       _In_opt_ HINSTANCE hPrevInstance,
       _In_ LPSTR     lpCmdLine,
       _In_ int       nCmdShow
    )
    {
       WNDCLASSEX wcex;
    
       wcex.cbSize = sizeof(WNDCLASSEX);
       wcex.style          = CS_HREDRAW | CS_VREDRAW;
       wcex.lpfnWndProc    = WndProc;
       wcex.cbClsExtra     = 0;
       wcex.cbWndExtra     = 0;
       wcex.hInstance      = hInstance;
       wcex.hIcon          = LoadIcon(wcex.hInstance, IDI_APPLICATION);
       wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
       wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
       wcex.lpszMenuName   = NULL;
       wcex.lpszClassName  = szWindowClass;
       wcex.hIconSm        = LoadIcon(wcex.hInstance, IDI_APPLICATION);
    
       if (!RegisterClassEx(&wcex))
       {
          MessageBox(NULL,
             _T("Call to RegisterClassEx failed!"),
             _T("Windows Desktop Guided Tour"),
             NULL);
    
          return 1;
       }
    
       // Store instance handle in our global variable
       hInst = hInstance;
    
       // The parameters to CreateWindowEx explained:
       // WS_EX_OVERLAPPEDWINDOW : An optional extended window style.
       // szWindowClass: the name of the application
       // szTitle: the text that appears in the title bar
       // WS_OVERLAPPEDWINDOW: the type of window to create
       // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
       // 500, 100: initial size (width, length)
       // NULL: the parent of this window
       // NULL: this application does not have a menu bar
       // hInstance: the first parameter from WinMain
       // NULL: not used in this application
       HWND hWnd = CreateWindowEx(
          WS_EX_OVERLAPPEDWINDOW,
          szWindowClass,
          szTitle,
          WS_OVERLAPPEDWINDOW,
          CW_USEDEFAULT, CW_USEDEFAULT,
          500, 100,
          NULL,
          NULL,
          hInstance,
          NULL
       );
    
       if (!hWnd)
       {
          MessageBox(NULL,
             _T("Call to CreateWindow failed!"),
             _T("Windows Desktop Guided Tour"),
             NULL);
    
          return 1;
       }
    
       // The parameters to ShowWindow explained:
       // hWnd: the value returned from CreateWindow
       // nCmdShow: the fourth parameter from WinMain
       ShowWindow(hWnd,
          nCmdShow);
       UpdateWindow(hWnd);
    
       // Main message loop:
       MSG msg;
       while (GetMessage(&msg, NULL, 0, 0))
       {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
       }
    
       return (int) msg.wParam;
    }
    
    //  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
    //
    //  PURPOSE:  Processes messages for the main window.
    //
    //  WM_PAINT    - Paint the main window
    //  WM_DESTROY  - post a quit message and return
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
       PAINTSTRUCT ps;
       HDC hdc;
       TCHAR greeting[] = _T("Hello, Windows desktop!");
    
       switch (message)
       {
       case WM_PAINT:
          hdc = BeginPaint(hWnd, &ps);
    
          // Here your application is laid out.
          // For this introduction, we just print out "Hello, Windows desktop!"
          // in the top left corner.
          TextOut(hdc,
             5, 5,
             greeting, _tcslen(greeting));
          // End application-specific layout section.
    
          EndPaint(hWnd, &ps);
          break;
       case WM_DESTROY:
          PostQuitMessage(0);
          break;
       default:
          return DefWindowProc(hWnd, message, wParam, lParam);
          break;
       }
    
       return 0;
    }
    
  2. Dans le menu Générer , choisissez Générer la solution. Les résultats de la compilation apparaissent dans la fenêtre Sortie dans Visual Studio.

    Animation montrant les étapes de génération du projet DesktopApp.

    L’animation montre que l’on clique sur le bouton Enregistrer tout, puis que l’on choisit Construire > Construire une solution dans le menu principal.

  3. Pour exécuter l'application, appuyez sur F5. Une fenêtre avec le texte Hello, Windows desktop! doit apparaître.

    Capture d’écran d’une fenêtre avec le titre Application de la visite guidée du Bureau Windows. Le contenu de la fenêtre est Bonjour, Bureau Windows !.

Félicitations ! Vous avez créé une application de bureau Windows traditionnelle.

Voir aussi