经典MFC界面和Ribbon界面框架对比(单文档为例)

摘要:
IDE是:VS2008+SP1A,这是经典的MFC单文档界面;B、 它是带状MFC单文档界面。在生成了A和B的基本框架代码后,通过比较工具发现,两种不同风格的接口之间存在一些差异,主要是在MainFrame类+++++++++++++++++++++++3++++++++中。H数据成员变量ACMFCToolBarm_wndToolBar之间存在一定的对应关系;//工具栏CMFCToolBarImagesm_ UserImages;//工具栏CMFCMenuBarm_wndMenuBar使用的图像资源;//菜单栏CMFCStatusArm_wndStatusBar;//状态栏B无菜单栏CMFCRibbonBarm_wndRibbonBar;//功能区工具栏CMFCToolBarImagesm_ PanelImages;//工具栏使用的图像资源CMFCRibbonApplicationButtonm_MainButton;//左上按钮CMFCRibbonStatusArm_wndStatusBar;//状态栏MainFrm cpp中的主要差异代码仍然反映在OnCreate()函数A//在主接口intCMainFrame::OnCreate{ifeturn-1;BOOLbNameValid;//设置visualmanagerandstylebasedonpersistedvalueOnApplicationLook;if(!

IDE为:VS2008+SP1

A为经典MFC单文档界面:

经典MFC界面和Ribbon界面框架对比(单文档为例)第1张

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

经典MFC界面和Ribbon界面框架对比(单文档为例)第2张

在生成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

免责声明:文章转载自《经典MFC界面和Ribbon界面框架对比(单文档为例)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Veritas NetBackup备份系统管理维护实战(NBU培训+各种数据库备份恢复)11个代码质量审核和管理工具,程序员必备!下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

XNA框架基础——获取免费的XNA Game Studio Express

获取免费的XNA Game Studio Express 要立刻开始编码,你必须确定你安装了恰当的工具,IDE是快速起步的一个尤其重要的工具。如果你已经完成了XNA Game Studio Express的安装和配置,你可以越过这一个章节。 写这个部份仅仅以防有人需要另外的技巧和窍门。例如,如何在Visual Studio 2005 Profession...

【日志框架】log4j、log4j2、logback、slf4j等常用的日志框架及门面

一、在Java程序中常用日志框架可以分为两类: 无具体实现的抽象门面框架,如:Commons Logging、SLF4J 具体实现的框架,如:Log4j,Log4j 2,Logback,Jul 二、常用日志框架之间的关系 Log4j2与Log4j1发生了很大的变化,log4j2不兼容log4j1 Commons Logging和Slf4j是日志门面(...

基于ServiceStack.OrmLite框架 代码性能、开发效率皆第一 没有之一

基于ServiceStack.OrmLite框架 代码性能、开发效率皆第一 没有之一 1.此框架方便简洁,便于学习研究。除了基本的增删改查外,还有分页,兼容分页的多表查询,同一业务处理时多次数据库操作仅需要打开一次数据库,反射对象映射赋值,分页返回集合的json封装函数,自定义对象,NLOG日志记录,前端H+框架,sweetalert、Sortable、l...

Android中用文件初始化sqlite 数据库的文(一) (转)

很多时候在应用安装初始化时,需要创建本地数据库,同时为数据库添加数据,之后再从数据库中读取数据。 这里有2个思路 1.先在本地创建一个能支持android使用的sqlite数据库文件,启动时,用现成的sqlite的二进制文件进行直接copy到Android系统的数据库路径 2.可以考虑在第一次启动时,执行数据库初始化的sql文件. 方法1: 1.在本地准备...

基于WPF系统框架设计(5)-Ribbon整合Avalondock 2.0实现多文档界面设计(二)

AvalonDock 是一个.NET库,用于在停靠模式布局(docking)中排列一系列WPF/WinForm控件。最新发布的版本原生支持MVVM框架、Aero Snap特效并具有更好的性能。 AvalonDock 2.0版本已经发布了,新版本是用MVVM框架重新编写,似乎也用了Command(命令)模式。2.0版的文档尚未发布,但你可以参考Avalon....

倍福TwinCAT(贝福Beckhoff)常见问题(FAQ)-如何在初始化的时候写入参数

最常见的是定义一个全局变量,然后跟对应的变量绑定,比如我定义了一个SINT型的变量ControlWord 数值是8,定义好之后编译一下,可以发现PLC程序中或多出来这个变量(MAIN.ControlWord就是我们定义的输出型变量,注意AT%Q*表示输出型,AT%I*表示输入型) ControlWord AT%Q*:SINT:=8;   随后我双击...