ダイアログボックスにメニューを付ける

メニュー1

今回は、ダイアログボックスにメニューを付けます。メニューから、アプリケーションを終了できるようにします。

テキストの表示 - インコのWindowsSDK で作成したソースを修正します。

ここでは、Reseditで作成する方法も説明します。

C言語 ソースファイル

WM_COMMAND

WM_COMMANDメッセージは、メニューを選択したときなど、発生するメッセージです。
メッセージとは、ユーザーがキーを押した、マウスを移動した、メニューを実行したなどの動作をやり取りするものでした。

1、メニューを選択した際に、WM_COMMANDメッセージがきます。
このとき、ウィンドウプロシージャ(メッセージを処理する関数)の3番目の引数(ここではwParam)のうち、下位16ビットは、リソースID(メニューを選択した場合は、メニューのリソースID) なので、これを処理します。
32ビットから下位16ビットを取り出すには、LOWORD()を使用します。

WORD LOWORD(
    DWORD dwValue
);

なお、上位16ビットを取り出す場合は、HIWORD()を使用します。

WORD HIWORD(
    DWORD dwValue
);

2.メニューで終了を選択した場合、リソースIDがIDM_EXITになります。 このとき、ダイアログボックスを閉じる関数EndDialog()を実行します。

リソースファイル

メニュー[MENU]


コントロールID MENU
BEGIN
    POPUP "メニュー1(&*)"
    BEGIN
        MENUITEM "項目1(&*)", ****
        MENUITEM "項目2(&*)", ****
    END
    POPUP "メニュー2(&*)"
    BEGIN
        MENUITEM "項目1(&*)", ****
        MENUITEM "項目2(&*)", ****
   END
END

親メニューはPOPUP、子メニューはMENUITEMで表記します。
子メニューの始めにBEGINを入れ、と最後にENDを入れます。

方法1 : Visual Studioのリソース ビューからメニューを追加

Visual Studio Expressでは、この方法は利用できません。

Visual Studio Express 以外の場合は、Visual Studioからメニューを追加できます。

右上のウインドウから「リソース ビュー」のシートをクリック。
リソースファイルを右クリックして、メニューを開き、「リソースの追加(A)...」を選択してください。

VSC1

「リソースの追加」ダイアログが開くので、リソースの種類(T):「Dialog」を選択してから、 「新規作成」ボタンをクリックしてください。

VSC1

プレビュー画面の「ここへ入力」となっているところを、1回クリックすると、メニュー名を入力できるようになるので、 メニュー名を入力します。ここでは「ファイル(&F)」と入力します。
メニューの項目名も入力できるので入力します。ここでは「アプリケーションの終了(&X)」と入力します。

ここで(&F)」と入力すると、表示が下記のように下線付きになり、Altキーを押しながらFキーを押すと、直接選択できるメニューを作成できます。

VSC2

方法2 : Reseditからメニューを追加

「リソース(Resources)」ウインドウを右クリック - 「リソースの追加(Add Resource)...」 - 「メニュー(Menu) Ctrl+M」 でメニューを追加

VCwin32アプリケーション3

プレビュー画面のType hereとなっているところを、2回クリックすると、左側にメニューを追加できるので、 メニュー名を入力します。
<※全角文字を入力する場合、確定するまでは、入力した文字が画面に表示されません。>
メニュー名を入力できたら、Type hereをシングルクリックしてから、先ほど入力したメニューをクリックします。 メニューの下にType hereが出てくるので、これを2回クリックすると、上側にメニューの項目を追加 できるので、メニューの項目名を入力します。

VCwin32アプリケーション4 VCwin32アプリケーション5

ダイアログボックスにメニュー[MENU]を追加


MENU id

idコントロールID

メニューをVisual Studioのリソース ビューやResEditで追加すれば、Visual Studioのリソース ビューやResEditから、ダイアログボックスの「プロパティ(Properties)」ウインドウで、Menuを選択できるようになります。

VSC3 VCwin32アプリケーション6

ソースコードの入力

ソースコードは下記のように入れてください。

test.cpp
#include <windows.h>
#include "resource.h"

// このコード モジュールに含まれる関数の宣言を転送します:
BOOL CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
          PSTR lpCmdLine, int nCmdShow )
{
    DialogBox(hInstance, TEXT("DIALOG_BOX"), NULL, DialogProc);
    return 0;
}

BOOL CALLBACK DialogProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    UINT wmId;
    switch (msg)
    {
        case WM_CLOSE:
            EndDialog(hWnd, IDOK);
            break;
        case WM_COMMAND:
            wmId = LOWORD(wParam);
            switch (wmId)
            {
                case IDM_EXIT:
                    EndDialog(hWnd, IDOK);
                    break;
                default:
                    break;
            }
        default:
            break;
    }
    return FALSE;
}

resource.h

#define IDM_ABOUT 104
#define IDM_EXIT 105
#define IDC_HP 109
#ifndef IDC_STATIC
#define IDC_STATIC -1
#endif

Reseditで作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。

test.rc
#include "resource.h"

/////////////////////////////////////////////////////////////////////////////
//
// メニュー
//

IDC_HP MENU
BEGIN
    POPUP "ファイル(&F)"
    BEGIN
        MENUITEM "アプリケーションの終了(&X)", IDM_EXIT
    END
    POPUP "ヘルプ(&H)"
    BEGIN
        MENUITEM "バージョン情報(&A)...", IDM_ABOUT
    END
END

/////////////////////////////////////////////////////////////////////////////
//
// ダイアログ
//

DIALOG_BOX DIALOG 0, 0, 170, 62
FONT 9, "MS UI Gothic"
CAPTION "ダイアログ"
MENU IDC_HP
BEGIN
    LTEXT           "Copyright (C) 2008",IDC_STATIC,42,26,114,8
END

Reseditで作成した場合は、これとは異なるソースコードになります。
上記の太線で示している箇所のみ追加です。