W32 MessageBox

MessageBox(終了確認)と OutputDebugString のサンプルです。

前田稔の超初心者のプログラム入門

プログラムの説明

  1. 2019/05/04 Visual Studio Professional 2019 16.0.3 にバージョンアップしました。
    [Windows デスクトップ アプリケーション] はメッセージループで描画する Win32 API に準じるプラットホームです。
    Visual Studio を立ち上げて[ファイル][新規作成][プロジェクト]を開き、[新しいプロジェクトの作成]を選択します。

  2. [Windows デスクトップ アプリケーション][C++ Windows デスクトップ]を選択します。
    一覧に表示されない場合は、ウインドウ下部の「探しているものが見つからない場合さらにツールと機能をインストールする」を選択します。

  3. [ソリューションとプロジェクトを同じディレクトリに配置する]をチェックして作成すると WindowsProject1 の名前でメッセージループのプロジェクトが作成されます。

  4. WindowsProject1.cpp を修正します。
    int cnt = 0; は呼び出しのカウンターで、Debug() はカウンター(val)を引数にするデバッグ関数です。
    後位参照が起こらないように[// グローバル変数:]の直後にでも置いて下さい。
    // グローバル変数:
    HINSTANCE hInst;                                // 現在のインターフェイス
    WCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーのテキスト
    WCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名
    int cnt = 0;    // 呼び出しカウント
    
    void Debug(wchar_t msg[], int val)
    {   wchar_t str[80];
        swprintf(str, 80, L"**%s: %d\r\n", msg, val);
        OutputDebugString(str);
    }
    
  5. WndProc() 関数を修正します。
    WM_CREATE: はウインドウを生成するときに呼び出されます。
    ここで MessageBox() でプログラムの開始を知らせます。
        case WM_CREATE:
            MessageBox(NULL, L"Start Program", L"Message Box", MB_OK);
            break;
    
  6. IDM_EXIT: は、メニューから[ファイル][終了する]を選ぶと呼び出されます。
    MessageBox() の「終了しますか」に対して OK をクリックしたときに終了します。
                case IDM_EXIT:
                    int id;
                    id = MessageBox(hWnd, L"終了しますか",
                        L"終了確認", MB_OKCANCEL | MB_ICONQUESTION);
                    if (id == IDOK)  DestroyWindow(hWnd);
                    break;
    
  7. WM_PAINT: では Ellipse(hdc,20,20,100,100); で赤色の円を描画します。
    WM_PAINT: が呼び出された回数を確認するときは Debug() 関数を使います。
        case WM_PAINT:
            {
                PAINTSTRUCT ps;
                HDC hdc = BeginPaint(hWnd, &ps);
                // TODO: HDC を使用する描画コードをここに追加してください...
                //OutputDebugString(L"\n**WM_PAINT: Called\n");
                cnt++;
                Debug((wchar_t *)L"WM_PAINT", cnt);
                HBRUSH      hBrushRed,hOldBrush;
                hBrushRed= CreateSolidBrush(RGB(255,0,0));          // 赤のブラシを生成
                hOldBrush= (HBRUSH)SelectObject(hdc,hBrushRed);     // ブラシを選択
                Ellipse(hdc,20,20,100,100);                         // 円を描画
                SelectObject(hdc,hOldBrush);                        // ブラシを戻す
                DeleteObject(hBrushRed);                            // 赤のブラシを削除
                EndPaint(hWnd, &ps);
            }
            break;
    
  8. x64 または x86 を選んで、右三角矢印(または F5 キー)でコンパイル&実行すると、ウインドウに赤い丸が表示されます。
    マウスでウインドウサイズを変更すると WM_PAINT: が連続して呼ばれるので、出力ウインドウの Debug() 関数の印字を確認して下さい。
    メニューから[ファイル][終了する]を選ぶと IDM_EXIT: が呼ばれます。
    MessageBox() の応答要求に対して OK を選択するとプログラムが終了します。
    プログラムは Win32 API に準じるようです。詳細は[超初心者のプログラム入門(C言語 Windows)]を参照して下さい。

    MessageBox() は Win32 API のメッセージ表示で、Store Application では MessageDialog 使います。
    MessageBox() は終了(応答)を待って次に進みます。
    対して、MessageDialog は終了を待たずに次に進みます。違いを認識して下さい。

超初心者のプログラム入門(C/C++)

超初心者のプログラム入門(C言語 Windows)