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

MFC 多文件應用程式架構:動態選單工具列、對話列、單一實例、自訂視圖

     編輯:關於VC++

本文展示一個功能完整的 MFC 多文件應用程式(MDI)架構範例,涵蓋動態選單/工具列切換、自製對話列、位圖按鈕與選單、單一實例執行機制、自訂視圖類別等實用技巧,適合作為企業級 MDI 應用的起始框架。

核心功能模組

1. 動態選單與工具列

根據使用者登入狀態切換介面:

  • SetMenu(hWnd, hMenu):動態更換視窗選單
  • CToolBarCtrl::SetState(nID, nState):控制工具列按鈕啟用/停用/隱藏
  • CFrameWnd::RecalcLayout():重新計算控制列佈局
未登入狀態 登入狀態

2. 自製對話列

繼承 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);
自製對話列效果

3. 位圖按鈕與選單

使用 CButton::SetBitmap() 與 CMenu::SetMenuItemBitmaps() 直接設定圖片,避免複雜的 Owner Draw 實作。

4. 單一實例執行機制

使用具名 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;
}

5. 自訂視圖類別

未使用精靈產生的預設視圖類別,而是手工建立三個差異化的子視圖類別,展示完全自訂的文件/視圖架構。

架構優勢

  • 模組化:各功能獨立封裝,易於維護與擴展
  • 權限感知:動態 UI 適應不同使用者角色
  • 資源友善:單一實例避免重複佔用資源
  • 可擴展:對話列、工具列、視圖類別均可獨立替換

原始碼結構

MyMdiApp/
├── MainFrm.h/cpp       // 主框架:動態選單、工具列、對話列、單一實例
├── ChildFrm.h/cpp      // 子框架
├── MyView1/2/3.h/cpp   // 三個自訂視圖類別
├── MyDoc.h/cpp         // 文件類別
├── Resource.h          // 資源 ID
└── MyMdiApp.cpp        // 應用程式類別:Mutex、訊息註冊

結語

此 MDI 架構範例整合了企業級應用常見的核心需求:權限導向的動態介面、豐富的資訊面板、單一實例保護、可擴展的文件/視圖架構。開發者可直接以此為基礎,替換業務邏輯與視圖實作,快速構建專業級 Windows 桌面應用程式。完整原始碼與資料庫版本請參考附件。

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