軟體國際化首要需求是介面語言切換。VC++ 資源系統原生支援多語言選單:以**不同資源 ID** 定義多套選單(如 `IDR_MENU_CHINESE`、`IDR_MENU_ENGLISH`),執行期動態 `LoadMenu`、`SetMenu` 切換,無需重啟程式。本文完整示範雙語選單建立、資源編輯技巧、`CMainFrame` 狀態管理、切換邏輯、資源釋放。
用記事本開啟 `.rc` 檔,複製整個 `IDR_MAINFRAME` 區塊,修改 ID 為 `IDR_MENU_ENGLISH`,批次替換中文為英文,存檔後 Visual Studio 重新載入即可看到兩套選單。此法比 GUI 編輯快得多。
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();
}
VC++ 多語言選單核心在於:**一語言一資源 ID → LoadMenu 快取 → SetMenu 熱切換 → DrawMenuBar 刷新**。此法零第三方依賴、相容所有 MFC 版本、切換瞬間完成無閃爍。配合衛星 DLL(資源專用 DLL)可實現部署時按語言分發、減小主程式體積,是企業級國際化產品的標準架構。