チュートリアル: 従来の Windows デスクトップ アプリケーションを作成する (C++)

このチュートリアルでは、Visual Studio で従来の Windows デスクトップ アプリケーションを作成する方法について説明します。 作成するアプリケーションでは、Windows API を使用して、ウィンドウに "Hello, Windows desktop!" を表示します。 このチュートリアルで開発したコードは、Windows デスクトップ アプリケーションを作成するためのパターンとして使用できます。

Windows API (Win32 API、Windows Desktop API、Windows Classic API とも呼ばれます) は、Windows アプリケーションを作成するための C 言語ベースのフレームワークです。 何十年もの間、Windows アプリケーションを作成するために使用されてきました。 より高度でプログラミングが容易なフレームワークが、Windows API の上に構築されています。 たとえば、MFC、ATL、.NET フレームワークなどです。 C++/WinRT で記述された、UWP およびストア アプリの最新の Windows ランタイム コードでも、下に Windows API が使用されています。 Windows API の詳細については、「Windows API インデックス」を参照してください。

重要

このドキュメントの最後の「コードをビルドする」セクションに、完全なコードが示されています。 このチュートリアルでは、Windows アプリに含まれるさまざまなコードの断片について説明しますが、最も重要な部分に焦点を当てるため、コード スニペットではいくつかの詳細が省略されているため、そのままコードを記述する必要はありません。 完全なコードをコピーし、最後にプロジェクトに貼り付けることができます。

前提条件

  • Microsoft Windows 7 またはそれ以降のバージョンを稼働しているコンピューター。 最適な開発作業のためには、Windows 11 以降をお勧めします。

  • Visual Studio。 Visual Studio をダウンロードしてインストールする方法について詳しくは、「Visual Studio のインストール」をご覧ください。 インストーラーを実行するときに、[C++ によるデスクトップ開発] ワークロードがオンになっていることを確認してください。 Visual Studio をインストールしたときにこのワークロードをインストールしていなくても問題ありません。 インストーラーをもう一度実行して、すぐにインストールできます。

    Visual Studio インストーラーの C++ によるデスクトップ開発ワークロードのスクリーンショット。Visual C++ ツールセットの機能を使用して従来の Windows ベースのアプリをビルドする

  • Visual Studio IDE の使用に関する基本的な理解。 以前に Windows デスクトップ アプリを使ったことがあれば、おそらく問題ありません。 概要については、Visual Studio IDE の機能ツアーに関するページをご覧ください。

  • 内容を理解するための、C++ 言語の基本に関する十分な理解。 あまり複雑な作業は行わないので、ご安心ください。

Windows デスクトップ プロジェクトを作成する

最初の Windows デスクトップ プロジェクトを作成するには、以降の手順に従います。 このチュートリアルの冒頭のメモに従って、完成したコードはチュートリアルの最後にある「コードのビルド」セクションで確認できます。 先に進み、次の手順に従ってプロジェクトを作成しますが、完全なアプリケーション コードが表示されるまで、次のセクションのコードの貼り付けはお控えください。 コード スニペットでは、最も重要な部分に焦点を当てるため、いくつかの詳細を省略しています。 完全なコードをコピーし、最後にプロジェクトに貼り付けることができます。

説明を簡略化するため。 優先するバージョンの Visual Studio のドキュメントを表示するには、 [バージョン] セレクター コントロールを使用します。 このページの目次の一番上にあります。

Visual Studio で Windows デスクトップ プロジェクトを作成するには

  1. メイン メニューで、[ファイル]>[新規作成]>[プロジェクト] の順に選択して、[新しいプロジェクトの作成] ダイアログ ボックスを開きます。

  2. ダイアログの上部で、[言語][C++] に、[プラットフォーム][Windows] に、[プロジェクト タイプ][デスクトップ] に設定します。

  3. フィルター処理されたプロジェクト タイプの一覧から、[Windows デスクトップ ウィザード] を選択して、[次へ] を選択します。 次のページで、プロジェクトの名前 (DesktopApp など) を入力します。

  4. [作成] ボタンをクリックしてプロジェクトを作成します。

  5. これで、[Windows デスクトップ プロジェクト] ダイアログが表示されます。 [アプリケーションの種類] ドロップダウンで、[デスクトップ アプリケーション (.exe)] を選択していることを確認します。 Windows アプリケーションを作成しているため、コンソール アプリケーションを選択すると、使用するコードを指定してビルドされないプロジェクトが生成されます。 次に、[追加のオプション][空のプロジェクト] を選択します。 [OK] を選択して、プロジェクトを作成します。

  6. [ソリューション エクスプローラー] で、DesktopApp プロジェクトを右クリックし、[追加] を選択して、[新しい項目] を選択します。

    Visual Studio 2019 で DesktopApp Project に新しい項目を追加することを示すアニメーション。

    アニメーションでは、ソリューション エクスプローラーでプロジェクト名を右クリックし、表示されるメニューで [追加] を選択し、[新しい項目] を選択しています。

  7. [新しい項目の追加] ダイアログ ボックスで、 [C++ ファイル (.cpp)]をクリックします。 [名前] ボックスに、ファイルの名前 (HelloWindowsDesktop.cpp など) を入力します。 追加を選択します。

    Visual Studio 2019 の [新しい項目の追加] ダイアログ ボックスのスクリーンショット。C++ ファイル (.cpp) オプションが選択されています。名前フィールドは Hello Windows Desktop.cpp に設定されます。

これで、プロジェクトが作成され、ソース ファイルがエディターで開きます。

Visual Studio 2017 で Windows デスクトップ プロジェクトを作成するには

  1. [ファイル] メニューの [新規作成] を選択し、[プロジェクト] を選択します。

  2. [新しいプロジェクト] ダイアログ ボックスの左側のペインで、[インストール]>[Visual C++] の順に展開し、[Windows デスクトップ] を選択します。 中央のペインで、[Windows デスクトップ ウィザード] を選択します。

    [名前] ボックスに、プロジェクトの名前 (DesktopApp など) を入力します。 OK を選択します。

    Visual Studio 2017 の [新しいプロジェクト] ダイアログ ボックスのスクリーンショット。[Windows デスクトップ ウィザード] が選択されています。名前のテキスト ボックスに DesktopApp と表示されます。

  3. [Windows デスクトップ プロジェクト] ダイアログの [アプリケーションの種類] で、[Windows アプリケーション (.exe)] を選択します。 [追加のオプション][空のプロジェクト]を選択します。 [プリコンパイル済みヘッダー] が選択されていないことを確認します。 [OK] を選択して、プロジェクトを作成します。

  4. [ソリューション エクスプローラー] で、DesktopApp プロジェクトを右クリックし、[追加] を選択して、[新しい項目] を選択します。

    Visual Studio 2017 で DesktopApp Project に新しい項目を追加することを示すアニメーション。

    アニメーションでは、ソリューション エクスプローラーでプロジェクト名を右クリックし、表示されるメニューで [追加] を選択し、[新しい項目] を選択しています。

  5. [新しい項目の追加] ダイアログ ボックスで、 [C++ ファイル (.cpp)]をクリックします。 [名前] ボックスに、ファイルの名前 (HelloWindowsDesktop.cpp など) を入力します。 追加を選択します。

    Visual Studio 2017 の [新しい項目の追加] ダイアログ ボックスのスクリーンショット。インストールされている > Visual C++ が左側で選択され、[C+ + ファイル] オプションが強調表示されています。

これで、プロジェクトが作成され、ソース ファイルがエディターで開きます。

Visual Studio 2015 で Windows デスクトップ プロジェクトを作成するには

  1. [ファイル] メニューの [新規作成] を選択し、[プロジェクト] を選択します。

  2. [新しいプロジェクト] ダイアログ ボックスの左側のペインで、[インストール]>[テンプレート]>[Visual C++] の順に展開し、[Win32] を選択します。 中央のペインで、 [Win32 プロジェクト]を選択します。

    [名前] ボックスに、プロジェクトの名前 (DesktopApp など) を入力します。 OK を選択します。

    [インストール済み] > [テンプレート] > [Visual C++] > [Win32] が選択され、[Win32 プロジェクト] オプションが強調表示され、[名前] テキスト ボックスに「DesktopApp」と入力されている Visual Studio 2015 の [新しいプロジェクト] ダイアログ ボックスのスクリーンショット。

  3. [Win32 アプリケーション ウィザード][概要] ページで、[次へ] を選択します。

    Win32 アプリケーション ウィザードの [概要] ページで DesktopApp を作成します。

  4. [アプリケーションの設定] ページの [アプリケーションの種類] で、[Windows アプリケーション] を選択します。 [追加オプション] で、[プリコンパイル済みヘッダー] をオフにしてから、[空のプロジェクト] を選択します。 [完了] を選択して、プロジェクトを作成します。

  5. [ソリューション エクスプローラー] で、DesktopApp プロジェクトを右クリックし、[追加] を選択して、[新しい項目] を選択します。

    Visual Studio 2015 で DesktopApp Project に新しい項目を追加することを示すアニメーション。

    アニメーションでは、ソリューション エクスプローラーでプロジェクト名を右クリックし、表示されるメニューで [追加] を選択し、[新しい項目] を選択しています。

  6. [新しい項目の追加] ダイアログ ボックスで、 [C++ ファイル (.cpp)]をクリックします。 [名前] ボックスに、ファイルの名前 (HelloWindowsDesktop.cpp など) を入力します。 追加を選択します。

    [インストール済み] > [Visual C++] が選択され、[C++ ファイル] オプションが強調表示されている Visual Studio 2015 の [新しい項目の追加] ダイアログボックスのスクリーンショット。

これで、プロジェクトが作成され、ソース ファイルがエディターで開きます。

コード

次に、Visual Studio で Windows デスクトップ アプリケーションのコードを作成する方法について説明します。

Windows デスクトップ アプリケーションでコードの実行を開始する場所

  1. すべての C アプリケーションおよび C++ アプリケーションに開始点として main 関数が必要なように、すべての Windows デスクトップ アプリケーションには WinMain 関数が必要です。 WinMain の構文は、次のとおりです。

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

    この関数のパラメーターと戻り値については、WinMain エントリ ポイントに関する記事を参照してください。

    Note

    WINAPICALLBACKHINSTANCE_In_ などの追加の単語は何でしょうか。 従来の Windows API では、typedef とプリプロセッサ マクロを広範囲に使用して、型の詳細とプラットフォーム固有のコードの一部 (呼び出し規則、__declspec 宣言、コンパイラ pragma など) を抽象化します。 Visual Studio では、IntelliSense クイック ヒント機能を使用して、これらの typedef およびマクロの定義内容を確認できます。 目的の単語の上にマウス ポインターを置くか、それを選択して Ctrl+K キー、Ctrl+I キーを押して、定義を含む小さなポップアップ ウィンドウを表示します。 詳細については、「IntelliSense の使用」を参照してください。 パラメーターと戻り値の型では、多くの場合、プログラミング エラーをキャッチするのに役立つ "SAL 注釈" が使用されます。 詳細については、「SAL 注釈を使って C/C++ のコード障害を減らす方法」を参照してください。

  2. Windows デスクトップ プログラムには <windows.h> が必要です。 また、#include <tchar.h> も頻繁に表示されます。 これは、charwchar_t のどちらでも動作するアプリを簡単に作成できるようにするためです。 アプリが動作する方法として、代わりにコードで TCHAR マクロを使用する方法があります。これは、最終的に UNICODE シンボルがプロジェクトで定義されている場合は wchar_t で解決しますが、それ以外の場合は char で解決します。 常に UNICODE を有効にしてビルドする場合は、TCHAR は不要であり、wchar_t だけを直接使用できます。 詳細については、「汎用テキスト マップの使用」を参照してください。 次のコードは、ファイルの先頭にあるこれら 2 つの #include ステートメントを示しています。

    #include <windows.h>
    #include <tchar.h>
    
  3. WinMain 関数の他に、すべての Windows デスクトップ アプリケーションにはウィンドウ プロシージャ関数も必要です。 この関数は WndProc と呼ばれますが、コード内で好きな名前を付けることができます。 WndProc の構文は、次のとおりです。

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

    この関数では、"イベント" が発生したときに Windows からアプリケーションが受け取る "メッセージ" を処理するコードを記述します。 たとえば、ユーザーがアプリケーションで [OK] ボタンを選択した場合、Windows からメッセージが送信されます。 適切な処理を行うコードを WndProc 関数内に記述します。 これは、イベントの "処理" と呼ばれます。 処理するのは、アプリケーションに関連するイベントのみです。

    詳細については、「 ウィンドウ プロシージャ」を参照してください。

WinMain 関数に機能を追加する

  1. WinMain 関数では、メイン ウィンドウに関するいくつかの基本情報を取得する必要があります。 そのためには、WNDCLASSEX 型の構造を入力します。 この構造体には、ウィンドウに関する情報 (アプリケーション アイコン、ウィンドウの背景色、タイトル バーに表示される名前など) が含まれます。 重要なのは、Windows がアプリに送信するメッセージを処理するウィンドウ プロシージャへの関数ポインターが含まれていることです。 一般的な 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);
    

    この構造体のフィールドについては、WNDCLASSEX に関する記事を参照してください。

  2. WNDCLASSEX 構造を入力したら、Windows に登録して、Windows がお使いのウィンドウとそれにメッセージを送信する方法について把握できるようにします。 RegisterClassEx 関数を使用して、ウィンドウ クラス構造体を引数として渡します。 _T マクロが使用されているのは、上記の Unicode に関する説明に従って TCHAR 型を使用するためです。 次のコードは、ウィンドウ クラスを登録する方法を示しています。

    if (!RegisterClassEx(&wcex))
    {
       MessageBox(NULL,
          _T("Call to RegisterClassEx failed!"),
          _T("Windows Desktop Guided Tour"),
          NULL);
    
       return 1;
    }
    
  3. 次に、CreateWindowEx 関数を使用してウィンドウを作成します。

    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;
    }
    

    この関数は HWND を返します。これはウィンドウへのハンドルです。 ハンドルはポインターのようなものです。 Windows ではハンドルを使用して、作成したウィンドウを追跡します。 詳細については、「 Windows のデータ型」を参照してください。

  4. この時点で、ウィンドウは作成されていますが、これを表示させるように Windows にさらに指示する必要があります。 それがこのコードで実行する内容です。

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

    WndProc 関数をまだ実装していないため、表示されるウィンドウはただの空白の四角形です。 アプリケーションは、Windows が現在それに送信しているメッセージをまだ処理していません。

  5. メッセージを処理するには、まずメッセージ ループと呼ばれるものを追加して、Windows が送信するメッセージをリッスンします。 アプリケーションがメッセージを受け取ると、このループはそれを処理するために WndProc 関数にディスパッチします。 メッセージ ループのコードは、次のようになります。

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

    メッセージ ループ内の構造体と関数の詳細については、 MSGGetMessage、「TranslateMessage」、DispatchMessage を参照してください。

    アプリケーションのメイン ウィンドウを作成し、Windows がアプリを送信するメッセージをリッスンする基本的な WinMain 関数は、次のようなコードになります。

    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;
    }
    

WndProc 関数内のメッセージを処理する

  1. アプリケーションが受信するメッセージを処理するには、WndProc 関数に switch ステートメントを実装します。

    処理する重要なメッセージは WM_PAINT です。 アプリケーションは、表示されたウィンドウの一部の更新が必要になったときに WM_PAINT メッセージを受け取ります。 このイベントは、ユーザーがお使いのウィンドウの前にあるウィンドウを移動し、それを再び離したときに発生することがあります。 アプリケーションは、ウィンドウが初めて表示されるときにこのメッセージを受け取り、アプリケーション UI を表示する機会が与えられます。 Windows がこれらのイベントを送信すると、アプリケーションはそのイベントを検出できます。 ウィンドウが初めて表示されるときには、その全体が更新される必要があります。

    WM_PAINT メッセージを処理するには、最初に BeginPaint を呼び出してから、ウィンドウ内のテキスト、ボタン、およびその他のコントロールをレイアウトするすべてのロジックを処理します。 次に、EndPaint を呼び出します。 このアプリケーションでは、BeginPaint()EndPaint() の間のコードは、WinMain() で作成したウィンドウに Hello, Windows desktop! を表示します。 次のコードでは、この TextOut 関数はウィンドウ内の指定した位置にテキストを表示します。

    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;
    }
    

    前のコードでは、HDC はウィンドウのクライアント領域に関連付けられているデバイス コンテキストへのハンドルです。 このハンドルは、ウィンドウ内を描画してクライアント領域を参照するときに使用します。 クライアント領域での描画を準備して完了するには、BeginPaint および EndPaint 関数を使用します。 BeginPaint は、クライアント領域での描画に使用されるディスプレイ デバイス コンテキストへのハンドルを返します。EndPaint は、描画要求を終了し、デバイス コンテキストを解放します。

  2. アプリケーションは通常、多くの他のメッセージを処理します。 たとえば、ウィンドウが最初に作成されたときに送信される WM_CREATE や、ウィンドウが閉じられたときの WM_DESTROY などです。 単純でも完成した WndProc 関数のコードを次に示します。

    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;
    }
    

コードのビルド

約束どおり、動作するアプリケーションの完全なコードを次に示します。

この例をビルドするには

  1. エディターで HelloWindowsDesktop.cpp 内のコードをすべて削除します。 このコード例をコピーし、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. [ビルド] メニューの [ソリューションのビルド]をクリックします。 コンパイルの結果は、Visual Studio の [出力] ウィンドウに表示されます。

    DesktopApp プロジェクトをビルドする手順を示すアニメーション。

    アニメーションでは、[すべて保存] ボタンをクリックした後、メイン メニューから [ビルド] > [ソリューションのビルド] を選択しています。

  3. アプリケーションを実行するには、F5 を押します。 "Hello, Windows desktop!" というテキストのウィンドウが表示されます。

    実行中のプロジェクトのスクリーンショット。「Windows デスクトップ ガイド付きツアー アプリケーション」というタイトルのウィンドウが表示されます。ウィンドウの内容は「Hello, Windows desktop!」です。

お疲れさまでした。 これで、従来の Windows デスクトップ アプリケーションのビルドが完了しました。

関連項目

Windows C++ デスクトップ アプリケーションの種類