zoukankan      html  css  js  c++  java
  • 经典MFC界面和Ribbon界面框架对比(单文档为例)

    IDE为:VS2008+SP1

    A为经典MFC单文档界面:

    B为Ribbon风格的MFC单文档界面:

    在生成A和B的基础框架代码之后,通过对比工具,发现这两种不同风格的界面主要在MainFrame类中存在一些差异。

    应用程序类(CXXXApp)的InitInstance()函数中,B风格在调用InitContextMenuManager()之后,执行了InitShellManager()的初始化。

    该句代码主要是为CMFCShellTreeCtrl(文件目录树)和CMFCShellListCtrl(文件列表)的使用做一些Shell的初始化工作。

    +++++++++++++++++++++++++++++++++++++++++++++

    MainFrm.h数据成员变量存在一定的对应关系

    A

    CMFCToolBar       m_wndToolBar;   // 工具栏
    CMFCToolBarImages m_UserImages; // 工具栏使用的图片资源
    CMFCMenuBar       m_wndMenuBar;  // 菜单栏
    CMFCStatusBar     m_wndStatusBar; // 状态栏

    B   无菜单栏

    CMFCRibbonBar m_wndRibbonBar;      // Ribbon工具条
    CMFCToolBarImages m_PanelImages;  // 工具栏使用的图片资源
    CMFCRibbonApplicationButton m_MainButton; // 左上角按钮
    CMFCRibbonStatusBar m_wndStatusBar; // 状态栏
    

    MainFrm.cpp中的主要差异代码还是体现在OnCreate()函数中

    A

    // 创建并初始化主界面上的各个控件
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
    		return -1;
    
    	BOOL bNameValid;
    	// set the visual manager and style based on persisted value
    	OnApplicationLook(theApp.m_nAppLook);
    
    	if (!m_wndMenuBar.Create(this))
    	{
    		TRACE0("Failed to create menubar\n");
    		return -1;      // fail to create
    	}
    
    	m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);
    
    	// prevent the menu bar from taking the focus on activation
    	CMFCPopupMenu::SetForceMenuFocus(FALSE);
    
    	if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    		!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
    	{
    		TRACE0("Failed to create toolbar\n");
    		return -1;      // fail to create
    	}
    
    	CString strToolBarName;
    	bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD);
    	ASSERT(bNameValid);
    	m_wndToolBar.SetWindowText(strToolBarName);
    
    	CString strCustomize;
    	bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);
    	ASSERT(bNameValid);
    	m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);
    
    	// Allow user-defined toolbars operations:
    	InitUserToolbars(NULL, uiFirstUserToolBarId, uiLastUserToolBarId);
    
    	if (!m_wndStatusBar.Create(this))
    	{
    		TRACE0("Failed to create status bar\n");
    		return -1;      // fail to create
    	}
    	m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
    
    	// TODO: Delete these five lines if you don't want the toolbar and menubar to be dockable
    	m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
    	m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
    	EnableDocking(CBRS_ALIGN_ANY);
    	DockPane(&m_wndMenuBar);
    	DockPane(&m_wndToolBar);
    
    
    	// enable Visual Studio 2005 style docking window behavior
    	CDockingManager::SetDockingMode(DT_SMART);
    	// enable Visual Studio 2005 style docking window auto-hide behavior
    	EnableAutoHidePanes(CBRS_ALIGN_ANY);
    
    	// Enable toolbar and docking window menu replacement
    	EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR);
    
    	// enable quick (Alt+drag) toolbar customization
    	CMFCToolBar::EnableQuickCustomization();
    
    	return 0;
    }
    

      

    B  OnCreate()中调用InitializeRibbon()完成Ribbon工具条的初始化工作

    // 创建并初始化主界面上的各个控件
    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
    		return -1;
    
    	BOOL bNameValid;
    	// set the visual manager and style based on persisted value
    	OnApplicationLook(theApp.m_nAppLook);
    
    	m_wndRibbonBar.Create(this);
    	InitializeRibbon();
    
    	if (!m_wndStatusBar.Create(this))
    	{
    		TRACE0("Failed to create status bar\n");
    		return -1;      // fail to create
    	}
    
    	CString strTitlePane1;
    	CString strTitlePane2;
    	bNameValid = strTitlePane1.LoadString(IDS_STATUS_PANE1);
    	ASSERT(bNameValid);
    	bNameValid = strTitlePane2.LoadString(IDS_STATUS_PANE2);
    	ASSERT(bNameValid);
    	m_wndStatusBar.AddElement(new CMFCRibbonStatusBarPane(ID_STATUSBAR_PANE1, strTitlePane1, TRUE), strTitlePane1);
    	m_wndStatusBar.AddExtendedElement(new CMFCRibbonStatusBarPane(ID_STATUSBAR_PANE2, strTitlePane2, TRUE), strTitlePane2);
    
    	// enable Visual Studio 2005 style docking window behavior
    	CDockingManager::SetDockingMode(DT_SMART);
    	// enable Visual Studio 2005 style docking window auto-hide behavior
    	EnableAutoHidePanes(CBRS_ALIGN_ANY);
    
    	// Navigation pane will be created at left, so temporary disable docking at the left side:
    	EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM | CBRS_ALIGN_RIGHT);
    
    	// Outlook bar is created and docking on the left side should be allowed.
    	EnableDocking(CBRS_ALIGN_LEFT);
    	EnableAutoHidePanes(CBRS_ALIGN_RIGHT);
    
    	return 0;
    }
    
    // 初始化Ribbion工具条
    void CMainFrame::InitializeRibbon()
    {
    	BOOL bNameValid;
    	CString strTemp;
    
    	// Load panel images:
    	m_PanelImages.SetImageSize(CSize(16, 16));
    	m_PanelImages.Load(IDB_BUTTONS);
    
    	// Init main button:
    	m_MainButton.SetImage(IDB_MAIN);
    	m_MainButton.SetText(_T("\nf"));
    	m_MainButton.SetToolTipText(strTemp);
    
    	m_wndRibbonBar.SetApplicationButton(&m_MainButton, CSize (45, 45));
    
    	// Add "Home" category with "Clipboard" panel:
    	bNameValid = strTemp.LoadString(IDS_RIBBON_HOME);
    	ASSERT(bNameValid);
    	CMFCRibbonCategory* pCategoryHome = m_wndRibbonBar.AddCategory(strTemp, IDB_WRITESMALL, IDB_WRITELARGE);
    
    	// Create and add a "View" panel:
    	bNameValid = strTemp.LoadString(IDS_RIBBON_VIEW);
    	ASSERT(bNameValid);
    	CMFCRibbonPanel* pPanelView = pCategoryHome->AddPanel(strTemp, m_PanelImages.ExtractIcon (7));
    
    	bNameValid = strTemp.LoadString(IDS_RIBBON_STATUSBAR);
    	ASSERT(bNameValid);
    	CMFCRibbonButton* pBtnStatusBar = new CMFCRibbonCheckBox(ID_VIEW_STATUS_BAR, strTemp);
    	pPanelView->Add(pBtnStatusBar);
    
    	// Add elements to the right side of tabs:
    	bNameValid = strTemp.LoadString(IDS_RIBBON_STYLE);
    	ASSERT(bNameValid);
    	CMFCRibbonButton* pVisualStyleButton = new CMFCRibbonButton(-1, strTemp, -1, -1);
    
    	pVisualStyleButton->SetMenu(IDR_THEME_MENU, FALSE /* No default command */, TRUE /* Right align */);
    
    	bNameValid = strTemp.LoadString(IDS_RIBBON_STYLE_TIP);
    	ASSERT(bNameValid);
    	pVisualStyleButton->SetToolTipText(strTemp);
    	bNameValid = strTemp.LoadString(IDS_RIBBON_STYLE_DESC);
    	ASSERT(bNameValid);
    	pVisualStyleButton->SetDescription(strTemp);
    	m_wndRibbonBar.AddToTabs(pVisualStyleButton);
    }
    

    PS: CXXXApp不再由CWinApp派生,而是由CWinAppEx派生

          CMainFrame不再由CFrameWnd派生,而是由CFrameWndEx派生

    下载RibbonMFC框架示例代码: RibbonMFC.rar

  • 相关阅读:
    对象和接口简单比较
    DevExpress报表开发基本流程
    有关ExecuteNonQuery返回值的分析
    2012年度计划
    小测试:有关++i&&i++,你是不是看晕了
    “PE文件格式”1.9版 完整译文
    .NET中的入口及幕后英雄:MSCorEE.dll(转)
    软件构建过程中的隐喻
    转:地图导出格式,教你如何选择
    推荐几个网站
  • 原文地址:https://www.cnblogs.com/kekec/p/2251110.html
Copyright © 2011-2022 走看看