本文提供另一個完整的多語言選單實作範例,強調**資源檔手動編輯**、**`CMainFrame` 選單快取與切換**、**預設語言初始化**、**選單項目 ID 保持一致**等關鍵細節,適合直接複製套用至現有專案。
// 找到 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`。
class CMainFrame : public CFrameWnd
{
CMenu m_menuChinese;
CMenu m_menuEnglish;
enum { LANG_CH, LANG_EN } m_nLang;
// ...
};
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_