ダイアログボックスにメニューを付けます。
win124.cpp
// // Windows プログラム // #include <windows.h> #include <tchar.h> #include "resource.h" #include <MyAboutBox.h> // グローバル変数 HINSTANCE hInst; // 現在のインターフェイス // ダイアログプロシージャ INT_PTR CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM); // アプリケーション開始位置 int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE, LPTSTR, int nCmdShow) { hInst = hInstance; // インスタンスハンドル保存 DialogBox(hInst, TEXT("MyDlgMain"), NULL, DlgProc); } // ダイアログプロシージャ INT_PTR CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { int wmId; switch (msg) { case WM_CLOSE: EndDialog(hWnd, LOWORD(wp)); return (INT_PTR)TRUE; break; case WM_COMMAND: wmId = LOWORD(wp); switch(wmId) { case IDM_EXIT: EndDialog(hWnd, wmId); return (INT_PTR)TRUE; break; case IDM_ABOUT: DialogBox(hInst, TEXT("MyAboutBox"), hWnd, About); return (INT_PTR)TRUE; break; } return (INT_PTR)TRUE; break; } return (INT_PTR)FALSE; }
resource.h
#define IDM_EXIT 40000 #define IDM_ABOUT 40001
win124.rc
#include <windows.h>
#include "resource.h"
//
// Menu resources
//
MyMenu MENU
BEGIN
POPUP "ファイル(&F)"
BEGIN
MENUITEM "終了(&X)", IDM_EXIT
END
POPUP "ヘルプ(&H)"
BEGIN
MENUITEM "バージョン情報(&A)", IDM_ABOUT
END
END
//
// Dialog resources
//
MyDlgMain DIALOG 0, 0, 186, 95
STYLE DS_3DLOOK | DS_CENTER | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_GROUP | WS_TABSTOP | WS_THICKFRAME | WS_SYSMENU
CAPTION "Windowsプログラム"
MENU MyMenu
FONT 9, "MS UI Gothic"
BEGIN
END
MyAboutBox DIALOG 0, 0, 186, 95
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
CAPTION "バージョン情報"
FONT 8, "Ms Shell Dlg"
BEGIN
DEFPUSHBUTTON "OK", IDOK, 129, 7, 50, 14
LTEXT "win124, Version 1.0", IDC_STATIC, 39, 43, 114, 8, SS_LEFT | SS_NOPREFIX
LTEXT "Copyright (C) 2010", IDC_STATIC, 39, 55, 114, 8, SS_LEFT
END
MyAboutBox.h
#pragma once // // バージョン情報ダイアログプロシージャ // INT_PTR CALLBACK About(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp) { int wmId; switch (msg) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: wmId = LOWORD(wp); if(wmId == IDOK){ EndDialog(hDlg, wmId); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE; }
実行画面です。
メニューを付けるのは簡単です。 リソースファイルに次のように書きます。
MyMenu MENU BEGIN POPUP "ファイル(&F)" BEGIN MENUITEM "終了(&X)", IDM_EXIT END POPUP "ヘルプ(&H)" BEGIN MENUITEM "バージョン情報(&A)", IDM_ABOUT END END
そして、"MyDlgMain"に、"MENU MyMenu" と書くだけです。
メニューを動作させるには、"IDM_EXIT" のようなマクロ定数を使います。 これは、"resource.h" に書きます。
メニューが選択されると、WM_COMMANDメッセージがやって来ます。 そこで、DlgProcプロシージャで捕まえます。 そして、LOWORD(wp) に IDM_EXIT などが入っているので、それでわかりまず。
ついでに、バージョン情報用のダイアログボックスを作りました。 このプロシージャは変わることがないので、"include" フォルダへ保存します。 ファイル名は、"MyAboutBox.h" とします。