search
LoginSignup
2

posted at

updated at

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

もくじ

やりたいこと

久しぶりに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

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
What you can do with signing up
2