LoginSignup
6
2

More than 1 year has passed since last update.

[C++] ダイアログベースアプリのひな型

Last updated at Posted at 2020-12-14

もくじ

やりたいこと

久しぶりにC++でダイアログベースで実験用ソフトを作ろうと思って、15年以上前に猫でもわかるWindowsプログラミングを見て勉強しながら書いた自分のテンプレートを引っ張り出してビルドしたらビルドできなくなってたので、今(VisualStudio2019)の環境でビルドできるように手なおしして、実験に使えるようにしたい。
(今、WindowsのC++でUIのあるソフトを作ろうとしたときの選択肢って、何か増えてましたっけ?勉強不足で追いつけてない...)

コード

下記が今回作ったコード。
https://github.com/tera1707/Cpp/tree/master/CppDlgbaseTemplate

今回VS2019でひな型を作った時の手順メモ

1.プロジェクトの作成

まず「新しいプロジェクトの作成」で、「Windowsデスクトップアプリケーション」を選択。

image.png

そうすると、ひな型として、

  • wWinMain
  • MyRegisterClass
  • InitInstance
  • WndProc
  • About

の関数を持ったcppファイルが出来上がるので、このうち

  • wWinMain

だけを残してあとの関数を全部消す。

2.ダイアログの追加

実験用ダイアログのリソースを追加する。

ソリューションエクスプローラーの中の「リソースファイル」を右クリック>[追加]>[リソース]を押す。

image.png

出てきた「リソースの追加」ダイアログで、「Dialog」を選択し「新規作成」を押す。
image.png

→リソースビューを開いて、プロジェクトの中の「Dialog」フォルダを開くと「IDD_DIALOG1」というダイアログが、追加されているので、それを開く。
image.png

3.IDの変更

開いた「IDD_DIALOG1」ダイアログのプロパティの中の「ID」のところが「IDD_DIALOG1」となっているので、「""」でくくった文字列で、好きな名前を付ける。
※ここでは"MYTESTDLGBASE_MAIN"とした。
image.png

4.ボタンの追加

ダイアログには、元々OKボタンとCancelボタンがついているが、追加でボタンを1個追加する。
「ツールボックス」の中の「Button」を選択して、ダイアログエディタの中のダイアログの上でクリックする。
image.png
ボタンが出来上がる。
作ったボタンのプロパティを見ると、IDが「IDC_BUTTON1」となっている。
image.png

5.ダイアログプロシージャを書く

次に、メインのcppファイルに戻って、実験用ダイアログのプロシージャを書く。
追加したボタンを押したときの処理を書きたい場合はcase IDC_BUTTON1:のところに書く。
(今回は、なにも中身のないMsgBoxを試しに出している)

BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
    switch (msg) {
    case WM_COMMAND:
        switch (LOWORD(wp)) {
        case IDOK:
            EndDialog(hDlg, IDOK);
            return TRUE;
        case IDCANCEL:
            EndDialog(hDlg, IDCANCEL);
            return TRUE;
        case IDC_BUTTON1:
            MessageBox(NULL, L"", L"", MB_OK);
            break;
        }
        return FALSE;
    }
    return FALSE;
}

6.DialogBoxを呼ぶ

wWinMain()の中で、上で作ったダイアログプロシージャを指定して、DialogBox()を呼ぶ。

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    hInst = hInstance;

    // ダイアログの名前と、プロシージャを指定してDialogBoxを開く
    DialogBox(hInst, L"MyTestDlgBase_Main", NULL, (DLGPROC)MyDlgProc);

    return (int)0;
}

これで、とりあえず最小限のダイアログが開く。
コントロール類を追加したいときは、追加したボタンと同じようなやり方で追加する。
image.png

メイン部分のコード全体

WindowsProject1.cpp
#include "framework.h"
#include "WindowsProject1.h"
#include "resource.h"

// グローバル変数:
HINSTANCE hInst;

// このコード モジュールに含まれる関数の宣言を転送します:
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
BOOL CALLBACK MyDlgProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    hInst = hInstance;

    DialogBox(hInst, L"MyTestDlgBase_Main", NULL, (DLGPROC)MyDlgProc);

    return (int)0;
}

// ダイアログプロシージャ
BOOL CALLBACK MyDlgProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
    switch (msg) {
    case WM_COMMAND:
        switch (LOWORD(wp)) {
        case IDOK:
            EndDialog(hDlg, IDOK);
            return TRUE;
        case IDCANCEL:
            EndDialog(hDlg, IDCANCEL);
            return TRUE;
        case IDC_BUTTON1:
            MessageBox(NULL, L"", L"", MB_OK);
            break;
        }
        return FALSE;
    }
    return FALSE;
}

参考

猫でもわかるWindowsプログラミング
http://www.kumei.ne.jp/c_lang/index_sdk.html

6
2
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2