創建Menu

Windows SDK中有資源的概念。這個資源包含了dialog、menu等等。它有點像「標記式語言」,程序中自動識別關鍵字。

首先看一個menu.rc文件中的輸入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// menu.rc
#include "SIMPLEMENU.h"

// SIMPLEMENU : 名字
SIMPLEMENU MENU
BEGIN
POPUP "File" // 彈出框
BEGIN
MENUITEM "Esc", IDM_END // 按鈕名字, 按鈕的編號
END
POPUP "Help"
BEGIN
MENUITEM "About", IDM_ABOUT
END
END
1
2
3
4
5
// SIMPLEMENU.h
#pragma once

#define IDM_END 100
#define IDM_ABOUT 1001

資源文檔可以像C++程序那樣#include其它文檔。資源文檔可以手動輸入,也可以利用Visual Studio創建資源檔,提供圖形化界面。

手動輸入需要注意的是,要將menu.rc文檔關聯到項目中,這樣才會被編譯。

使用Menu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = instanceHandle;
wc.hIcon = LoadIcon (0, IDI_APPLICATION);
wc.hCursor = LoadCursor (0, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);
wc.lpszMenuName = L"SIMPLEMENU"; // 注意這一行,改成Menu的名字
wc.lpszClassName = L"SimpleMenu";

// 按鈕事件
LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_COMMAND:
switch (LOWORD (wParam)) {
case IDM_END:
SendMessage (hwnd, WM_CLOSE, 0, 0L);
break;
case IDM_ABOUT:
MessageBox (hwnd, L"About Me", L"About", 0);
break;
}
break;
}

return DefWindowProc (hwnd, msg, wParam, lParam);
}

lpszMenuName修改成對應菜單的名字便可。菜單欄事件是WM_COMMAND,並根據按鈕的編號來判斷按下的按鈕是哪一個。

效果演示

exe
Visual Studio Editor

メニューバーの作成

Windows SDKでは、リソースという概念がある。メニューやダイアログなどのものはリソースである。リソースは「マークアップ言語」のように、プログラムがテキストを自動的に解析する。

まずmenu.rcのテキストを見てみましょう。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// menu.rc
#include "SIMPLEMENU.h"

// SIMPLEMENU : メニューの名前
SIMPLEMENU MENU
BEGIN
POPUP "File" // ポップアップのアイテム
BEGIN
MENUITEM "Esc", IDM_END // アイテムの名前, アイテムのインデックス
END
POPUP "Help"
BEGIN
MENUITEM "About", IDM_ABOUT
END
END
1
2
3
4
5
// SIMPLEMENU.h
#pragma once

#define IDM_END 100
#define IDM_ABOUT 1001

リソーステキストはC++のように#includeを使える。リソーステキストは自分で入力するほか、Visual Studioで作れる。

自分で作った場合、必ずプロジェクトと関連しなければならない。

メニューの使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = instanceHandle;
wc.hIcon = LoadIcon (0, IDI_APPLICATION);
wc.hCursor = LoadCursor (0, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH);
wc.lpszMenuName = L"SIMPLEMENU"; // ここに注意してください。
wc.lpszClassName = L"SimpleMenu";

// 按鈕事件
LRESULT CALLBACK WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_COMMAND:
switch (LOWORD (wParam)) {
case IDM_END:
SendMessage (hwnd, WM_CLOSE, 0, 0L);
break;
case IDM_ABOUT:
MessageBox (hwnd, L"About Me", L"About", 0);
break;
}
break;
}

return DefWindowProc (hwnd, msg, wParam, lParam);
}

lpszMenuNameを作られたメニューの名前に変更する。メニューのイベントはWM_COMMANDで、押したアイテムのインデックスによって、なんか操作をする。

結果表示

exe
Visual Studio Editor