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

Office 2000 風格停泊與智能選單:MDI 應用整合指南

     編輯:關於VC++

前言

Office 2000 引入的智能選單(常用項優先顯示、完整選單延遲展開)與停泊工具列極具代表性。本文提供一套移植自開源專案的類別庫,支援 MDI 架構下的智能選單、Tab 頁文檔視圖、自繪選單等功能,並說明整合步驟。

智能選單效果 1 智能選單效果 2

整合步驟(針對 MDI 專案)

  1. 字串表新增:ID_SHOWFULL (32792, "顯示完整選單")、ID_INTMODE (32794, "開啟/關閉智能模式")。
  2. 加入原始碼:將 OffMenu 資料夾下所有 .h/.cpp 加入專案。
  3. 修改 MainFrm.h:
    #include "MDIFrmEx.h"
    #include "ToolBarEx.h"
    class CMainFrame : public CMDIFrameEx
    CToolBarEx m_wndToolBar;
  4. 修改 MainFrm.cpp:
    IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameEx)
    BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameEx)
    if (CMDIFrameEx::OnCreate(lpCreateStruct) == -1)
  5. 修改 MyApp.h:
    #include "WinAppEx.h"
    class CTestMDIApp : public CWinAppEx
  6. 修改 MyApp.cpp:
    #include "DocTplEx.h"
    BEGIN_MESSAGE_MAP(CTestMDIApp, CWinAppEx)
    重寫 InitInstance,改用 CMultiDocTemplateEx 並呼叫 CWinAppEx::InitInstance():
    UINT nID = IDR_MAINFRAME;
    CMainFrame* pMainFrame = new CMainFrame;
    if (!pMainFrame->LoadFrame(nID)) return FALSE;
    m_pMainWnd = pMainFrame;
    
    CMultiDocTemplateEx* pDocTemplate = new CMultiDocTemplateEx(
        IDR_TESTMDTYPE,
        RUNTIME_CLASS(CTestMDIDoc),
        RUNTIME_CLASS(CChildFrame),
        RUNTIME_CLASS(CTestMDIView),
        &nID, 1);
    AddDocTemplate(pDocTemplate);
    CWinAppEx::InitInstance();
  7. 編譯運行:即可擁有 Office 2000 風格介面。

自訂智能邏輯

若需自行控制選單項使用率與灰顯判斷,可覆寫 CMenuBar 兩個虛擬函數:

WORD IncMenuUsage(CMenuEx* pParent, UINT pos, WORD curUsage);
BOOL EvaluateIfGrayed(CMenuEx* pParent, UINT pos, WORD& curUsage, int iMed, int iRange);

亦可透過 CMenuEx::GetExtraDataPtr(UINT) 附加應用層資料。

單文檔 (SDI) 支援

原碼僅針對 MDI,若需 SDI 請自行修改 CMultiDocTemplateEx、CMDIFrameEx、CMDIChildWndEx 相關類別以適配 CFrameWnd 架構。

結語

附帶範例為一抓圖程式介面部分,包含 Tab 頁視圖、自繪選單等完整功能,請參考原始碼深入研究。

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