Ribbon界面的構(gòu)成
為了支持新的界面風(fēng)格的開發(fā),MFC提供了很多新的、經(jīng)過擴(kuò)展過后的應(yīng)用程序類,界面類等。例如在我們的實(shí)例程序中用到的CRibbonApp,CMainFrame就是分別從CWinAppEx,CMDIFrameWndEx派生的。而CWinAppEx和CMDIFrameWndEx又是從傳統(tǒng)的CWinApp和CMDIFrameWnd派生,在原有類的基礎(chǔ)上,添加了對(duì)新的界面風(fēng)格的支持。 熟悉MFC界面開發(fā)的朋友都知道,應(yīng)用程序的CMainFrame類負(fù)責(zé)整個(gè)主框架界面的創(chuàng)建和管理,在傳統(tǒng)的菜單式界面下,它負(fù)責(zé)創(chuàng)建和管理菜單欄,狀態(tài)欄,工具欄等。同樣的,在Ribbon界面下,它同樣負(fù)責(zé)Ribbon界面的創(chuàng)建和管理。
class CMainFrame : public CMDIFrameWndEx { DECLARE_DYNAMIC(CMainFrame) public: CMainFrame(); // Attributes public: // Operations public: // Overrides public: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); // Implementation public: virtual ~CMainFrame(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // control bar embedded members CMFCRibbonBar m_wndRibbonBar; CMFCRibbonApplicationButton m_MainButton; CMFCToolBarImages m_PanelImages; CMFCRibbonStatusBar m_wndStatusBar; // Generated message map functions protected: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnWindowManager(); afx_msg void OnApplicationLook(UINT id); afx_msg void OnUpdateApplicationLook(CCmdUI* pCmdUI); DECLARE_MESSAGE_MAP() void InitializeRibbon(); };
從上面的代碼中我們可以看到,在Ribbon界面下,CMainFrame類包含了三個(gè)成員變量:m_wndRibbonBar、m_MainButton、m_wndStatusBar,分別用于控制Ribbon界面的命令面板,應(yīng)用程序按鈕和狀態(tài)欄。清楚了各個(gè)變量對(duì)應(yīng)的Ribbon界面元素后,我們就可以操作相應(yīng)的成員變量,在Ribbon界面上添加我們需要的內(nèi)容。
Ribbon界面的構(gòu)成
處理菜單資源和消息響應(yīng)函數(shù)
Ribbon界面相對(duì)于傳統(tǒng)的菜單式界面,最大的差別就是用新的Ribbon Bar代替了傳統(tǒng)的菜單欄。我們可以看到,在默認(rèn)情況下,Ribbon Bar已經(jīng)擁有了一個(gè)名為“Home”的命令分組(Category),其中又包含了多個(gè)面板(Panel),每個(gè)面板中有一個(gè)或者多個(gè)命令按鈕(Ribbon Button)。下面我們就來看看如何在Ribbon Bar上添加一個(gè)新的命令分組,然后在其中添加新的命令按鈕以執(zhí)行相應(yīng)的功能。 按照傳統(tǒng)的菜單式界面的開發(fā)流程,我們總是先編輯菜單資源,然后再創(chuàng)建相應(yīng)的菜單命令消息響應(yīng)函數(shù),最后再實(shí)現(xiàn)這個(gè)消息響應(yīng)函數(shù),完成相應(yīng)的任務(wù)。在新的Ribbon界面中,我們還是先要按照這樣的流程,完成菜單資源的編輯,實(shí)現(xiàn)消息響應(yīng)函數(shù)等。所以,我們先打開Visual Studio 2010的資源編輯器,在IDR_RibbonUITYPE菜單資源中添加兩個(gè)新的菜單項(xiàng)。
編輯菜單資源
然后,我們分別為這兩個(gè)菜單項(xiàng)添加相應(yīng)的消息響應(yīng)函數(shù):
添加消息響應(yīng)函數(shù)
這里,我們只是演示Ribbon界面的創(chuàng)建,所以我們將這兩個(gè)消息響應(yīng)函數(shù)簡(jiǎn)單地實(shí)現(xiàn)如下:
// CRibbonUIView message handlers void CRibbonUIView::OnEditSayhello() { // TODO: Add your command handler code here AfxMessageBox(_T("Hello RibbonUI!")); } void CRibbonUIView::OnEditSaygoodbye() { // TODO: Add your command handler code here AfxMessageBox(_T("Goodbye RibbonUI!")); }
添加Ribbon按鈕
到現(xiàn)在為止,我們已經(jīng)按照菜單式界面的開發(fā)流程,完成了資源的編輯和消息函數(shù)的實(shí)現(xiàn)。如果這時(shí)我們編譯運(yùn)行解決方案,我們?cè)诔绦蚪缑嫔峡床坏饺魏巫兓驗(yàn)槲覀冞沒有把這些命令綁定到Ribbon Bar的命令按鈕上。在CMainFrame類中,它提供了一個(gè)專門的函數(shù)CMainFrame::InitializeRibbon()來完成Ribbon界面的初始化工作,所以,我們?cè)谶@個(gè)函數(shù)中添加如下代碼,創(chuàng)建新的命令分組,然后將命令按鈕映射到我們剛剛創(chuàng)建的菜單項(xiàng)。
void CMainFrame::InitializeRibbon(){ BOOL bNameValid; ///… ////////////////////////////////////////////////////////////// // 添加一個(gè)命令分組(Category)“RibbonUI Category” CMFCRibbonCategory *pRibbonUICategory = m_wndRibbonBar.AddCategory(_T("RibbonUI Category"), IDB_WRITESMALL, IDB_WRITELARGE); // 添加一個(gè)面板(Panel) CMFCRibbonPanel *pTestPanel = pRibbonUICategory->AddPanel(_T("RibbonUI Panel"), m_PanelImages.ExtractIcon(1)); // 在面板上添加Ribbon命令按鈕(CMFCRibbonButton) pTestPanel->Add(new CMFCRibbonButton(ID_EDIT_SAYHELLO, _T("Say Hello"), 0, 0)); pTestPanel->Add(new CMFCRibbonButton(ID_EDIT_SAYHELLO, _T("Say Hello"), 1)); pTestPanel->Add(new CMFCRibbonButton(ID_EDIT_SAYGOODBYE, _T("Say Goodbye"), 2)); ////////////////////////////////////////////////////////////// ///… }
在這段代碼中,我們首先利用Ribbon Bar的AddCategory()函數(shù),添加了一個(gè)新的命令分組(Category),也就是Ribbon Bar上的一個(gè)新的標(biāo)簽頁(yè)。然后,我們?cè)谶@個(gè)新創(chuàng)建的標(biāo)簽頁(yè)中,添加了一個(gè)新的面板(Panel)。最后,我們創(chuàng)建了三個(gè)Ribbon命令按鈕(CMFCRibbonButton),并將它們放置到面板中。通過指定跟菜單資源中的菜單項(xiàng)相同的資源ID,我們將這些Ribbon命令按鈕跟我們之前創(chuàng)建的菜單項(xiàng)一一對(duì)應(yīng)起來。當(dāng)我們點(diǎn)擊某個(gè)Ribbon命令按鈕時(shí),就會(huì)執(zhí)行相應(yīng)的菜單命令響應(yīng)函數(shù)。這樣,我們就實(shí)現(xiàn)了菜單命令在Ribbon Bar的綁定,同時(shí)在界面上也能看到我們剛剛添加的命令按鈕了。
新創(chuàng)建的命令按鈕
在這里,我們只是簡(jiǎn)單地向大家介紹了Ribbon界面的基本概念和大致的開發(fā)流程,要想開發(fā)跟Office 2007一樣專業(yè)的Ribbon界面,我們還有很長(zhǎng)的一段路要走。
本文鏈接:http://www.95time.cn/tech/program/2010/7579.asp
出處:藍(lán)色理想
責(zé)任編輯:bluehearts
上一頁(yè) Visual C++ 2010創(chuàng)建Ribbon界面 [1] 下一頁(yè)
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|