本文展示一個功能完整的 MFC 多文件應用程式(MDI)架構範例,涵蓋動態選單/工具列切換、自製對話列、位圖按鈕與選單、單一實例執行機制、自訂視圖類別等實用技巧,適合作為企業級 MDI 應用的起始框架。
根據使用者登入狀態切換介面:
SetMenu(hWnd, hMenu):動態更換視窗選單CToolBarCtrl::SetState(nID, nState):控制工具列按鈕啟用/停用/隱藏CFrameWnd::RecalcLayout():重新計算控制列佈局
繼承 CDialogBar,嵌入 CTabCtrl 與 CListBox 實現分頁資訊面板:
// 建立對話列
if (!m_wndBar.Create(this, IDD_DIALOGBAR,
WS_CHILD | WS_VISIBLE | CBRS_BOTTOM | CBRS_GRIPPER |
CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, IDD_DIALOGBAR))
// 操作 Tab 控制項
CTabCtrl* pTab = (CTabCtrl*)m_wndBar.GetDlgItem(IDC_TAB_INFO);
pTab->InsertItem(0, _T("操作資訊"));
pTab->SetImageList(&((CMainFrame*)AfxGetMainWnd())->m_imageList);
// 動態調整 ListBox 大小與顯示
CListBox* pList = (CListBox*)m_wndBar.GetDlgItem(IDC_LIST_INFO);
pList->SetWindowPos(NULL, 0, 0,
GetSystemMetrics(SM_CXSCREEN) - 11, 75,
SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_SHOWWINDOW);
使用 CButton::SetBitmap() 與 CMenu::SetMenuItemBitmaps() 直接設定圖片,避免複雜的 Owner Draw 實作。
使用具名 Mutex + 系統廣播訊息實現:
// 唯一識別碼 (GUID)
#define UNIQUE_NAME _T("{1AB792D6-EEF2-4528-9A84-91356811E7A4}")
#define RA_MSG _T("{D48CA923-4925-41cb-8F56-ABAAAFCEF787}")
const UINT ID_RA_MSG = ::RegisterWindowMessage(RA_MSG);
BOOL CMyApp::InitInstance()
{
m_hOneInstance = ::CreateMutex(NULL, FALSE, UNIQUE_NAME);
if (GetLastError() == ERROR_ALREADY_EXISTS) {
// 已有實例運行,發送喚醒訊息
DWORD dwRecipients = BSM_APPLICATIONS;
::BroadcastSystemMessage(BSF_NOHANG, &dwRecipients,
ID_RA_MSG, 0, 0);
return FALSE; // 結束當前實例
}
// ... 正常初始化
return TRUE;
}
int CMyApp::ExitInstance()
{
CloseHandle(m_hOneInstance);
return CWinApp::ExitInstance();
}
// CMainFrame 處理喚醒訊息
ON_REGISTERED_MESSAGE(ID_RA_MSG, OnRaiseWindow)
LRESULT CMainFrame::OnRaiseWindow(WPARAM, LPARAM)
{
SetForegroundWindow();
SetActiveWindow();
return 0;
}
未使用精靈產生的預設視圖類別,而是手工建立三個差異化的子視圖類別,展示完全自訂的文件/視圖架構。
MyMdiApp/ ├── MainFrm.h/cpp // 主框架:動態選單、工具列、對話列、單一實例 ├── ChildFrm.h/cpp // 子框架 ├── MyView1/2/3.h/cpp // 三個自訂視圖類別 ├── MyDoc.h/cpp // 文件類別 ├── Resource.h // 資源 ID └── MyMdiApp.cpp // 應用程式類別:Mutex、訊息註冊
此 MDI 架構範例整合了企業級應用常見的核心需求:權限導向的動態介面、豐富的資訊面板、單一實例保護、可擴展的文件/視圖架構。開發者可直接以此為基礎,替換業務邏輯與視圖實作,快速構建專業級 Windows 桌面應用程式。完整原始碼與資料庫版本請參考附件。