admin管理员组文章数量:1516870
本文转自:
如果新建一个Ribbon项目,然后将老项目一一拷贝过去,那未免也太麻烦了。
因此,要是能将老项目直接修改成Ribbon界面,那自然是更好的选择咯。
通过对比测试,给出以下解决方案:
首先,添加一个Ribbon资源
第一步:所有的CFrameWnd --->CFrameWndEx
第二步:CWinApp----> CWinAppEx
第三步:APP中添加
// 实现 UINT m_nAppLook;
第四步:MainFrm.h
protected: // 控件条嵌入成员 CMFCRibbonBar m_wndRibbonBar; //2 CMFCRibbonStatusBar m_wndStatusBar; //3
protected: afx_msgintOnCreate(LPCREATESTRUCT lpCreateStruct); //4--修改 afx_msgvoidOnApplicationLook(UINT id); //5afx_msgvoidOnUpdateApplicationLook(CCmdUI* pCmdUI); //6
afx_msgvoidOnLink(); //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("")), _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
版权声明:本文标题:Ribbon控件整合案例:让您的MFC项目焕新颜 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.betaflare.com/web/1771639516a3267795.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。


发表评论