もくじ
やりたいこと
久しぶりにC++でダイアログベースで実験用ソフトを作ろうと思って、15年以上前に猫でもわかるWindowsプログラミングを見て勉強しながら書いた自分のテンプレートを引っ張り出してビルドしたらビルドできなくなってたので、今(VisualStudio2019)の環境でビルドできるように手なおしして、実験に使えるようにしたい。
(今、WindowsのC++でUIのあるソフトを作ろうとしたときの選択肢って、何か増えてましたっけ?勉強不足で追いつけてない...)
コード
下記が今回作ったコード。
https://github.com/tera1707/Cpp/tree/master/CppDlgbaseTemplate
今回VS2019でひな型を作った時の手順メモ
1.プロジェクトの作成
まず「新しいプロジェクトの作成」で、「Windowsデスクトップアプリケーション」を選択。
そうすると、ひな型として、
- wWinMain
- MyRegisterClass
- InitInstance
- WndProc
- About
の関数を持ったcppファイルが出来上がるので、このうち
- wWinMain
だけを残してあとの関数を全部消す。
2.ダイアログの追加
実験用ダイアログのリソースを追加する。
ソリューションエクスプローラーの中の「リソースファイル」を右クリック>[追加]>[リソース]を押す。
出てきた「リソースの追加」ダイアログで、「Dialog」を選択し「新規作成」を押す。
→リソースビューを開いて、プロジェクトの中の「Dialog」フォルダを開くと「IDD_DIALOG1」というダイアログが、追加されているので、それを開く。
3.IDの変更
開いた「IDD_DIALOG1」ダイアログのプロパティの中の「ID」のところが「IDD_DIALOG1」となっているので、「""」でくくった文字列で、好きな名前を付ける。
※ここでは"MYTESTDLGBASE_MAIN"
とした。
4.ボタンの追加
ダイアログには、元々OKボタンとCancelボタンがついているが、追加でボタンを1個追加する。
「ツールボックス」の中の「Button」を選択して、ダイアログエディタの中のダイアログの上でクリックする。
ボタンが出来上がる。
作ったボタンのプロパティを見ると、IDが「IDC_BUTTON1」となっている。
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;
}
これで、とりあえず最小限のダイアログが開く。
コントロール類を追加したいときは、追加したボタンと同じようなやり方で追加する。
メイン部分のコード全体
#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