程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> Office2000風格的停泊、智能型菜單

Office2000風格的停泊、智能型菜單

編輯:關於VC++

Office2000風格的停泊、智能型菜單例子運行時圖像:

譯者注:

由於原文作者所提供例子代碼需使用附帶RC資源,經本人使用後覺得不夠通用,故將部分源碼修改並將文章翻譯。文中現在所附例子為我最近所作一抓圖程序的界面部分。不光Office 2000智能菜單噢!還包括多文檔視圖的TAB頁顯示,自繪制菜單等,詳情請參看附帶實例代碼。

在你的工程文件中使用Office 2000菜單的話(譯者:目前僅支持多文檔菜單修改,如果要改單文檔菜單界面的話,可對文件中的CMultiDocTemplateEx類、CMDIFrameEx類和CMDIFrameEx類進行修改,以適應單文檔界面。),請按下面步驟進行: 

1、在資源裡的字符串表中新增二字符串:一、ID_SHOWFULL ,32792,顯示完全菜單。二、ID_INTMODE,32794,打開/禁止智能菜單模式。
2、將OffMenu文件夾中每一個.cpp和.h文件包含井你的工程文件中。
3、編輯工程文件中的 MainFrm.h (主框架頭文件) :
將原類的聲明從:
class CMainFrame : public CMDIFrameWnd
改為:
#include "MDIFrmEx.h"
#include "ToolBarEx.h"
class CMainFrame : public CMDIFrameEx
接著將類中的工具條類從 CToolBar 改為 CToolbarEx:
CToolbar m_wndToolBar;
變量聲明為:
CToolbarEx m_wndToolBar;
4、編輯工程文件中的 MainFrm.cpp (主框架文件):
改變其中消息映射從:
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
變成:
IMPLEMENT_DYNAMIC(CMainFrame, CMDIFrameEx)
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameEx)
接著將 CMainFrame::OnCreate 中的:
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
變為:
if (CMDIFrameEx::OnCreate(lpCreateStruct) == -1)
5、編輯工程文件中 MyApp.h (應用類頭文件):
改變其中的類聲明從:
class CTestMDIApp : public CWinApp
變為:
#include "WinAppEx.h"
class CTestMDIApp : public CWinAppEx
6、編輯工程文件中 MyApp.cpp (應用類文件):
將其中的消息映射從:
BEGIN_MESSAGE_MAP(CTestMDIApp, CWinApp)
變為:
#include "DocTplEx.h"
BEGIN_MESSAGE_MAP(CTestMDIApp, CWinAppEx)
接著將 CMyApp::InitInstance() 中的下面代碼從:
  CMultiDocTemplate* pDocTemplate;
  pDocTemplate = new CMultiDocTemplate(
    IDR_TESTMDTYPE,
    RUNTIME_CLASS(CTestMDIDoc),
    // custom MDI child frame
    RUNTIME_CLASS(CChildFrame),
    RUNTIME_CLASS(CTestMDIView));
  AddDocTemplate(pDocTemplate);
  // create main MDI Frame window
  CMainFrame* pMainFrame = new CMainFrame;
  if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
    return FALSE;
  m_pMainWnd = pMainFrame;

替換成:
  UINT nID;
  nID=IDR_MAINFRAME;
  // create main MDI Frame window
  CMainFrame* pMainFrame = new CMainFrame;
  if (!pMainFrame->LoadFrame(nID))
    return FALSE;
  m_pMainWnd = pMainFrame;
  CMultiDocTemplateEx* pDocTemplate;
  pDocTemplate = new CMultiDocTemplateEx(
    IDR_TESTMDTYPE,
    RUNTIME_CLASS(CTestMDIDoc),
    // custom MDI child frame
    RUNTIME_CLASS(CChildFrame),
    RUNTIME_CLASS(CTestMDIView),
    &nID,1);
  AddDocTemplate(pDocTemplate);
  CWinAppEx::InitInstance();

7、接下來就可以編釋並運行你的程序了。
如果你想自己掌控智能菜單的話,可直接重載CmenuBar類中的下面涵數既可:
WORD CMenuBar::IncMenuUsage(CMenuEx *pParent,
              UINT pos,
              WORD curusage)
BOOL CMenuBar::EvaluateIfGrayed(CMenuEx *pParent,
                UINT pos,
                WORD &curusage,
                int iMed,
                int iRange)

第一個函數用來添加當前菜單條有用法。第二個函數決定當前菜單條是否灰色顯示,它也可用來修改當前菜單條的用法。如果你想在菜單中存儲應用程序中定義的數據的話,可用CMenuEx::GetExtraDataPtr(UINT)來包含進這些數據。

  1. 上一頁:
  2. 下一頁:
欄目導航
Copyright © 程式師世界 All Rights Reserved