首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Win32 開發入門(4):建立選單——資源編輯器與動態建立

     編輯:關於C++

兩種建立選單的方法

方法一:純代碼動態建立

使用 CreateMenu、CreatePopupMenu、AppendMenu、InsertMenuItem 建立:


HMENU hRoot;
void CreateMyMenu() {
    hRoot = CreateMenu();
    HMENU pop1 = CreatePopupMenu();
    AppendMenu(hRoot, MF_POPUP, (UINT_PTR)pop1, L"操作");
    AppendMenu(pop1, MF_STRING, IDM_OPT1, L"飛機");
    
    MENUITEMINFO mif = { sizeof(MENUITEMINFO) };
    mif.fMask = MIIM_ID | MIIM_STRING | MIIM_STATE;
    mif.fType = MFT_STRING;
    mif.dwTypeData = L"機關槍";
    mif.wID = IDM_OPT2;
    mif.fState = MFS_ENABLED;
    InsertMenuItem(pop1, IDM_OPT2, FALSE, &mif);
}

缺點:程式碼冗長、維護困難、無視覺化編輯。

動態建立選單執行畫面

方法二:資源編輯器建立 (推薦)

  1. 「檢視」→「資源檢視」→專案右鍵→「加入」→「資源」→選擇 Menu → 新建
  2. 屬性視窗修改選單資源 ID (如 IDR_MAIN)
  3. 視覺化編輯選單結構、項目文字、ID
  4. 儲存後 resource.h 自動產生 ID 宏定義

資源檢視加入選單

新增資源對話框

選擇 Menu 類型

修改選單資源 ID

視覺化編輯選單項目

resource.h 自動產生 ID

資源 ID 管理技巧

  • 「資源檢視」右鍵→「資源符號」可檢視/修改所有資源 ID、使用狀態
  • 直接編輯 resource.h 亦可
  • 不同資源類型可共用同一 ID (如選單項目與工具列按鈕功能相同)

回應選單命令 (WM_COMMAND)

使用者點選選單項目產生 WM_COMMAND,LOWORD(wParam) 為選單項目 ID:


case WM_COMMAND: {
    switch (LOWORD(wParam)) {
        case IDM_PLANE: MessageBox(hwnd, L"灰機來了。", L"提示", MB_OK); break;
        case IDM_GUN:   MessageBox(hwnd, L"讓炮彈飛。", L"提示", MB_OK); break;
        case IDM_MT_GUN:MessageBox(hwnd, L"山炮欲來風滿樓。", L"提示", MB_OK); break;
    }
} return 0;

載入選單資源


HWND hm = CreateWindow(..., LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MAIN)), ...);
  • LoadMenu 參數:實例控制代碼、資源 ID (需 MAKEINTRESOURCE 轉換)
  • 或設定 wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAIN) 為類別層級選單

資源選單執行畫面

完整程式碼清單 (資源版)


#include <Windows.h>
#include "resource.h"

LRESULT CALLBACK MyWinProce(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int nShow) {
    WCHAR* cn = L"Myapp";
    WNDCLASS wc = { };
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.lpszClassName = cn;
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.hInstance = hInstance;
    wc.lpfnWndProc = (WNDPROC)MyWinProce;
    RegisterClass(&wc);
    
    HWND hm = CreateWindow(cn, L"我的應用程式", WS_OVERLAPPEDWINDOW,
                           20, 15, 420, 360, NULL,
                           LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MAIN)),
                           hInstance, NULL);
    if (hm == NULL) return 0;
    ShowWindow(hm, nShow);
    
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return 0;
}

LRESULT CALLBACK MyWinProce(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
        case WM_COMMAND: {
            switch (LOWORD(wParam)) {
                case IDM_PLANE: MessageBox(hwnd, L"灰機來了。", L"提示", MB_OK); break;
                case IDM_GUN:   MessageBox(hwnd, L"讓炮彈飛。", L"提示", MB_OK); break;
                case IDM_MT_GUN:MessageBox(hwnd, L"山炮欲來風滿樓。", L"提示", MB_OK); break;
            }
        } return 0;
        case WM_DESTROY:
            PostQuitMessage(0); return 0;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
}

重點整理

  • 資源編輯器建立選單:視覺化、易維護、自動產生 resource.h
  • 動態建立選單:CreateMenu/AppendMenu/InsertMenuItem,適合動態需求
  • WM_COMMAND + LOWORD(wParam) 判斷使用者選擇的選單項目
  • LoadMenu 載入資源選單,搭配 MAKEINTRESOURCE
  • 資源 ID 管理:資源符號視窗或直接編輯 resource.h
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved