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