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

VC++ 多語言選單實作:資源檔雙套菜單動態切換完整範例

     編輯:VC 教學

前言

本文提供另一個完整的多語言選單實作範例,強調**資源檔手動編輯**、**`CMainFrame` 選單快取與切換**、**預設語言初始化**、**選單項目 ID 保持一致**等關鍵細節,適合直接複製套用至現有專案。

一、建立專案與預設中文選單

  1. AppWizard → SDI/MDI,語言選中文,其他預設。
  2. 資源編輯器開啟 `IDR_MAINFRAME`,在 `查看` 選單加入 `英文(&E)` 項目,ID = `ID_MENU_LANG_SWITCH`。

二、記事本編輯 .rc 檔新增英文選單


// 找到 IDR_MAINFRAME 區塊,複製整段,修改如下:
IDR_MENU_ENGLISH MENU PRELOAD DISCARDABLE
BEGIN
    POPUP "&File"
    BEGIN
        MENUITEM "&New\tCtrl+N", ID_FILE_NEW
        MENUITEM "&Open...\tCtrl+O", ID_FILE_OPEN
        MENUITEM "&Save\tCtrl+S", ID_FILE_SAVE
        MENUITEM "Save &As...", ID_FILE_SAVE_AS
        MENUITEM SEPARATOR
        MENUITEM "&Print...\tCtrl+P", ID_FILE_PRINT
        MENUITEM "Print Pre&view", ID_FILE_PRINT_PREVIEW
        MENUITEM "Print Set&up...", ID_FILE_PRINT_SETUP
        MENUITEM SEPARATOR
        MENUITEM "Recent Files", ID_FILE_MRU_FILE1, GRAYED
        MENUITEM SEPARATOR
        MENUITEM "E&xit", ID_APP_EXIT
    END
    POPUP "&Edit"
    BEGIN
        MENUITEM "&Undo\tCtrl+Z", ID_EDIT_UNDO
        MENUITEM SEPARATOR
        MENUITEM "Cu&t\tCtrl+X", ID_EDIT_CUT
        MENUITEM "&Copy\tCtrl+C", ID_EDIT_COPY
        MENUITEM "&Paste\tCtrl+V", ID_EDIT_PASTE
    END
    POPUP "&View"
    BEGIN
        MENUITEM "&Toolbar", ID_VIEW_TOOLBAR
        MENUITEM "&Status Bar", ID_VIEW_STATUS_BAR
        MENUITEM "&Chinese", ID_MENU_LANG_SWITCH
    END
    POPUP "&Help"
    BEGIN
        MENUITEM "&About...", ID_APP_ABOUT
    END
END

存檔後 VS 自動偵測變更,資源視圖出現 `IDR_MENU_ENGLISH`。

三、CMainFrame 變數宣告


class CMainFrame : public CFrameWnd
{
    CMenu m_menuChinese;
    CMenu m_menuEnglish;
    enum { LANG_CH, LANG_EN } m_nLang;
    // ...
};

四、建構函數與 OnCreate 初始化


CMainFrame::CMainFrame() : m_nLang(LANG_CH) {}

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

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

    // 取得並保存預設中文選單
    HMENU hMenu = ::GetMenu(m_hWnd);
    m_menuChinese.Attach(hMenu);

    return 0;
}

五、切換語言處理函數


void CMainFrame::OnMenuLangSwitch()
{
    if (m_nLang == LANG_CH)
    {
        SetMenu(&m_menuEnglish);
        m_nLang = LANG_EN;
        // 更新切換項目文字為中文
        m_menuEnglish.ModifyMenu(ID_MENU_LANG_SWITCH, MF_BYCOMMAND, ID_MENU_LANG_SWITCH, _T("中文(&C)"));
    }
    else
    {
        SetMenu(&m_menuChinese);
        m_nLang = LANG_CH;
        m_menuChinese.ModifyMenu(ID_MENU_LANG_SWITCH, MF_BYCOMMAND, ID_MENU_LANG_SWITCH, _T("英文(&E)"));
    }
    DrawMenuBar();
}

六、析構函數釋放


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

七、執行效果

多語言選單切換示範

點選 `View → 英文` 瞬間切換為英文選單,再點 `View → 中文` 切回,所有命令 ID 不變,功能完全正常。

八、關鍵點總結

關鍵點說明
命令 ID 一致中英選單對應項目必須使用相同 ID(如 ID_FILE_NEW),否則命令路由失效
ModifyMenu 同步文字切換後需更新切換項目本身的文字,否則顯示舊語言
DrawMenuBar 必呼叫SetMenu 後必須呼叫 DrawMenuBar 重繪選單列
資源快取LoadMenu 一次,Attach 預設選單,避免重複載入
快捷鍵保持翻譯時保留 \tCtrl+X 等加速鍵標記

九、結語

此範例與前文(ID 102797)核心架構相同,差異在於資源建立細節與切換項目 ID 命名。建議專案採用統一命名規範(`IDR_MENU_`、`ID_MENU_LANG_SWITCH`),將切換邏輯封裝為 `CLanguageManager` 靜態類別,支援 `SwitchLanguage(LANG_ID)`、`GetCurrentLanguage()`、`RegisterMenu(IDR_MENU_XXX)`,實現全專案語言熱切換。

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