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

VC++ 實作多語言選單動態切換:英文/中文資源雙套菜單無縫轉換

     編輯:VC 教學

前言

軟體國際化首要需求是介面語言切換。VC++ 資源系統原生支援多語言選單:以**不同資源 ID** 定義多套選單(如 `IDR_MENU_CHINESE`、`IDR_MENU_ENGLISH`),執行期動態 `LoadMenu`、`SetMenu` 切換,無需重啟程式。本文完整示範雙語選單建立、資源編輯技巧、`CMainFrame` 狀態管理、切換邏輯、資源釋放。

一、建立雙語選單資源

  1. AppWizard 建立專案,預設產生 `IDR_MAINFRAME`(中文)。
  2. 資源視圖 → Menu → 右鍵 `Insert` 新增選單資源,ID 設為 `IDR_MENU_ENGLISH`。
  3. 逐項翻譯:`文件(&F)` → `&File`、`新建(&N)` → `&New`、`打開(&O)` → `&Open`... 快捷鍵保持一致(`Ctrl+N` 等)。
  4. 在 `查看` 選單加入切換項目:`英文(&E)` / `中文(&C)`,ID 同為 `ID_MENU_SWITCH_LANG`。

二、資源腳本 手動同步技巧

用記事本開啟 `.rc` 檔,複製整個 `IDR_MAINFRAME` 區塊,修改 ID 為 `IDR_MENU_ENGLISH`,批次替換中文為英文,存檔後 Visual Studio 重新載入即可看到兩套選單。此法比 GUI 編輯快得多。

三、CMainFrame 成員與初始化


class CMainFrame : public CFrameWnd
{
    CMenu m_menuChinese;  // 中文選單
    CMenu m_menuEnglish;  // 英文選單
    enum Lang { CHINESE, ENGLISH } m_eCurrentLang;

    // 訊息映射
    afx_msg void OnMenuSwitchLang();
    // ...
};

CMainFrame::CMainFrame() : m_eCurrentLang(CHINESE) {}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;

    // 1. 載入英文選單資源
    m_menuEnglish.LoadMenu(IDR_MENU_ENGLISH);

    // 2. 取得目前視窗掛載的中文選單(預設資源)
    HMENU hMenu = ::GetMenu(m_hWnd);
    m_menuChinese.Attach(hMenu); // 接管預設選單

    return 0;
}

四、語言切換處理


void CMainFrame::OnMenuSwitchLang()
{
    if (m_eCurrentLang == CHINESE)
    {
        SetMenu(&m_menuEnglish);
        m_eCurrentLang = ENGLISH;
        // 同步更新切換項目文字(需手動修改選單項目)
        m_menuEnglish.ModifyMenu(ID_MENU_SWITCH_LANG, MF_BYCOMMAND, ID_MENU_SWITCH_LANG, _T("中文(&C)"));
    }
    else
    {
        SetMenu(&m_menuChinese);
        m_eCurrentLang = CHINESE;
        m_menuChinese.ModifyMenu(ID_MENU_SWITCH_LANG, MF_BYCOMMAND, ID_MENU_SWITCH_LANG, _T("英文(&E)"));
    }
    DrawMenuBar(); // 重繪選單列
}

五、資源清理


CMainFrame::~CMainFrame()
{
    m_menuChinese.DestroyMenu();
    m_menuEnglish.DestroyMenu();
}

六、擴充:支援任意語言

  • 資源 ID 命名規範:`IDR_MENU_`(如 `IDR_MENU_JAPANESE`、`IDR_MENU_GERMAN`)。
  • `CMainFrame` 成員改為 `CMap m_mapMenus;`。
  • 切換函數接受語言代碼,動態 `LoadMenu` 快取,`SetMenu` 切換。
  • 搭配 `SetThreadLocale` / `AfxSetResourceHandle` 實現完整區域化(日期、數字、貨幣格式)。

七、結語

VC++ 多語言選單核心在於:**一語言一資源 ID → LoadMenu 快取 → SetMenu 熱切換 → DrawMenuBar 刷新**。此法零第三方依賴、相容所有 MFC 版本、切換瞬間完成無閃爍。配合衛星 DLL(資源專用 DLL)可實現部署時按語言分發、減小主程式體積,是企業級國際化產品的標準架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved