您的位置:首页 > 其它

为早期项目添加Ribbon界面

2014-12-27 20:05 141 查看
本文由 代码助手软件 整理发布 内容与本软件无关
更惬意的读、更舒心的写、更轻松的发布

如果新建一个Ribbon项目,然后将老项目一一拷贝过去,那未免也太麻烦了。

因此,要是能将老项目直接修改成Ribbon界面,那自然是更好的选择咯。

通过对比测试,给出以下解决方案:

首先,添加一个Ribbon资源

第一步:所有的CFrameWnd --->CFrameWndEx
第二步:CWinApp----> CWinAppEx
第三步:APP中添加

// 实现
UINT  m_nAppLook;

第四步:MainFrm.h

protected:  // 控件条嵌入成员
CMFCRibbonBar     m_wndRibbonBar;            //2
CMFCRibbonStatusBar  m_wndStatusBar;         //3


protected:
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);     //4--修改
afx_msg void OnApplicationLook(UINT id);                  //5
afx_msg void OnUpdateApplicationLook(CCmdUI* pCmdUI);     //6

afx_msg void OnLink();                                  //7

第五步:MainFrm.cpp添加消息映射

ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook)
ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook)


第六步:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
return -1;
// 基于持久值设置视觉管理器和样式
OnApplicationLook(theApp.m_nAppLook);
m_wndRibbonBar.Create(this);
m_wndRibbonBar.LoadFromResource(IDR_RIBBON);
if (!m_wndStatusBar.Create(this))
{
TRACE0("未能创建状态栏\n");
return -1;      // 未能创建
}
m_wndStatusBar.AddElement(new CMFCRibbonLinkCtrl(ID_STATUSBAR_LINK, _T("众多创意软件 欢迎登陆古典小说网  www.gudianxiaoshuo.com"), _T("http://www.gudianxiaoshuo.com")), _T("Link to gudianxiaoshuo"));
// 启用 Visual Studio 2005 样式停靠窗口行为
CDockingManager::SetDockingMode(DT_SMART);
// 启用 Visual Studio 2005 样式停靠窗口自动隐藏行为
EnableAutoHidePanes(CBRS_ALIGN_ANY);

第七步

void CMainFrame::OnApplicationLook(UINT id)
{
CWaitCursor wait;
theApp.m_nAppLook = id;
switch (theApp.m_nAppLook)
{
case ID_VIEW_APPLOOK_WIN_2000:
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManager));
m_wndRibbonBar.SetWindows7Look(FALSE);
break;
case ID_VIEW_APPLOOK_OFF_XP:
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOfficeXP));
m_wndRibbonBar.SetWindows7Look(FALSE);
break;
case ID_VIEW_APPLOOK_WIN_XP:
CMFCVisualManagerWindows::m_b3DTabsXPTheme = TRUE;
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
m_wndRibbonBar.SetWindows7Look(FALSE);
break;
case ID_VIEW_APPLOOK_OFF_2003:
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2003));
CDockingManager::SetDockingMode(DT_SMART);
m_wndRibbonBar.SetWindows7Look(FALSE);
break;
case ID_VIEW_APPLOOK_VS_2005:
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2005));
CDockingManager::SetDockingMode(DT_SMART);
m_wndRibbonBar.SetWindows7Look(FALSE);
break;
case ID_VIEW_APPLOOK_VS_2008:
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2008));
CDockingManager::SetDockingMode(DT_SMART);
m_wndRibbonBar.SetWindows7Look(FALSE);
break;
case ID_VIEW_APPLOOK_WINDOWS_7:
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows7));
CDockingManager::SetDockingMode(DT_SMART);
m_wndRibbonBar.SetWindows7Look(TRUE);
break;
default:
switch (theApp.m_nAppLook)
{
case ID_VIEW_APPLOOK_OFF_2007_BLUE:
CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);
break;
case ID_VIEW_APPLOOK_OFF_2007_BLACK:
CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);
break;
case ID_VIEW_APPLOOK_OFF_2007_SILVER:
CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver);
break;
case ID_VIEW_APPLOOK_OFF_2007_AQUA:
CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua);
break;
}
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007));
CDockingManager::SetDockingMode(DT_SMART);
m_wndRibbonBar.SetWindows7Look(FALSE);
}
RedrawWindow(NULL, NULL, RDW_ALLCHILDREN | RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME | RDW_ERASE);
theApp.WriteInt(_T("ApplicationLook"), theApp.m_nAppLook);
}
void CMainFrame::OnUpdateApplicationLook(CCmdUI* pCmdUI)
{
pCmdUI->SetRadio(theApp.m_nAppLook == pCmdUI->m_nID);
}
void CMainFrame::OnLink()
{
CMFCRibbonLinkCtrl* pLink = (CMFCRibbonLinkCtrl*) m_wndStatusBar.FindByID(ID_STATUSBAR_LINK);
if (pLink != NULL)
{
pLink->OpenLink();
}
}


第八步:RC添加头文件

#if !defined(_AFXDLL)
#include "afxribbon.rc"              // MFC ribbon and control bar resources
#endif


添加位置很值得注意,此处也总是出问题
合理的位置应该是:

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE 4, 2
#pragma code_page(936)
#include "res\Import.rc2"  // 非 Microsoft Visual C++ 编辑资源
#include "afxres.rc"         // 标准组件
#include "afxprint.rc"       // 打印/打印预览资源
//添加RIBBON
#if !defined(_AFXDLL)
#include "afxribbon.rc"              // MFC ribbon and control bar resources
#endif
#endif

但是,保存后又总是丢失,不知道什么原因,我用的VS2010,还没找到原因。

效果图对照:
早期项目


Ribbon--黑色



Ribbon--蓝色



Ribbon--银色



Ribbon---水银色



Ribbon---win7

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: