0から始めるVisualStudio2022:ソフト開発塾
ダイアログボックス
メニューを追加してみる
VisualStudio2022を起動して
新しいプロジェクトを選んで
C++の空のプロジェクトを選んで
次に、メニューより
『プロジェクト』『リソースの追加』
「Menu」で、「新規作成」ボタンを押す。
ダイアログを編集する画面が現れた。
4.リソースの編集をやってみた(その1)と同じ様な感じで
ファイル(F) ヘルプ(H) があって
ファイル(F) に 開く(O)で
ヘルプ(H) に バージョン表示(A) を、作る。
メニューから
『編集』『メニュー』『IDの編集』
IDの編集をONにすると
ファイル(F) の 開く(O) のIDを変更する。
ID_MENU_FILEOPENに変更
メニューから
『編集』『リソースシンボル』
とりあえず、こんな感じです。
値は、気にしない。
また、IDR_MENU1って気に入らないけど、このままで
ダイアログは、前回同様または前回のを複写して
ダイアログのプロパティで
メニューにIDR_MENU1をセットする。
次にソースは、前回のdialog000.cppをコピーするか、同じのを作成して
dialog001.cppとする。
また、新規に、dialog001_01.cppを作成する。
dialog001_01.cppのソースを次のようにする。
#include <windows.h>
#include "resource.h"
BOOL dialog_proc(
HWND hDlg,
UINT msg,
WPARAM wPara,
LPARAM lPara
) {
return FALSE;
}
BOOL dialog_cmd(
HWND hDlg,
WPARAM wPara,
LPARAM lPara
) {
return FALSE;
}
dialog001.cppのソースを次のようにする。
#include <windows.h>
#include <strsafe.h>
BOOL dialog_proc(HWND hDlg, UINT msg, WPARAM wPara, LPARAM lPara);
BOOL dialog_cmd(HWND hDlg, WPARAM wPara, LPARAM lPara);
void ErrMsgBox(DWORD dw, LPTSTR lpszFunction) {
LPVOID lpMsgBuf;
LPVOID lpDisplayBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&lpMsgBuf,
0, NULL);
lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,
(lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR));
StringCchPrintf((LPTSTR)lpDisplayBuf,
LocalSize(lpDisplayBuf) / sizeof(TCHAR),
TEXT("%s failed with error %d: %s"),
lpszFunction, dw, lpMsgBuf);
MessageBoxW(NULL, (LPCTSTR)lpDisplayBuf, TEXT("Error"), MB_OK);
LocalFree(lpMsgBuf);
LocalFree(lpDisplayBuf);
}
BOOL CALLBACK MyDlgProc(
HWND hDlg,
UINT msg,
WPARAM wPara,
LPARAM lPara) {
switch (msg) {
default:
return dialog_proc(hDlg, msg, wPara, lPara);
case WM_COMMAND:
switch (LOWORD(wPara)) {
default:
return dialog_cmd(hDlg, wPara, lPara);
case IDOK:
EndDialog(hDlg, IDOK);
return TRUE;
case IDCANCEL:
EndDialog(hDlg, IDCANCEL);
return TRUE;
}
return FALSE;
}
return FALSE;
}
int WINAPI WinMain(
_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow) {
//DialogBoxA(hInstance, "DIALOGBOX", NULL, (DLGPROC)MyDlgProc);
INT_PTR rc;
rc = DialogBoxA(hInstance,
"DIALOGBOX",
NULL,
(DLGPROC)MyDlgProc);
if (rc == 0) {
MessageBoxA(NULL, "Err 0", "Error", MB_OK);
}else
if (rc < 0) {
DWORD dw = GetLastError();
ErrMsgBox(dw, (LPTSTR)TEXT(__FILE__));
}
return 0;
}
ここまでで、一度ビルドしてエラーが出ないこと確認。
実行
ファイル 開く
を、行っても何も起こらない。
なので、とりあえず、MessageBoxを表示してみる。
dialog001_01.cppのソースを次のようにする。
#include <windows.h>
#include "resource.h"
BOOL dialog_proc(
HWND hDlg,
UINT msg,
WPARAM wPara,
LPARAM lPara
) {
return FALSE;
}
BOOL dialog_cmd(
HWND hDlg,
WPARAM wPara,
LPARAM lPara
) {
switch (LOWORD(wPara)) {
case ID_MENU_FILEOPEN:
MessageBoxA(NULL, "OPEN", "", MB_OK | MB_ICONINFORMATION | MB_SYSTEMMODAL);
break;
}
return FALSE;
}
ビルドして実行
Top 次