在MS Visual Studio 2008 MFC中Ribbon界面風格出現了,這種界面風格給人帶來耳目一新的感覺。Ribbon界面風格出現,可以說改革了傳統的菜單式界面風格,常見的應用就是MS Office 2007中的Word、Excel、PowerPoint等組件中,Ribbon不僅使得功能有組織的存放,而且可以更加方便快捷地找到各個功能。但是MS Visual Studio 2008 MFC中還未加入Ribbon編程的相關組件,這意味著不會是那種想要什么控件就托到相應的位置就可以了,而是要完全通過代碼來生成和控制相關的組件。值得然人欣喜的是,在MS Visual Studio 2010 MFC中,Ribbon編程相關的組件已經被添加了進來,這樣一來Ribbon編程就變得容易了起來,可以達到“所見即所得”的效果了。
下面結合MS Visual Studio 2008 MFC中Ribbon編程的一個實例,詳細講述Ribbon編程的具體步驟和注意事項,同時還將提出一種SDI(單文檔界面)架構程序中進行多個視圖切換的方法。(完整的實例可在我的CSDN資源中下載:[http://download.csdn.net/detail/margin1988/6408275](http://download.csdn.net/detail/margin1988/6408275)):
⑴??MS Visual Studio 2008 MFC中創建SDIRibbon應用程序的步驟:
1)“新建”一個Visual C++ MFC應用程序項目:

2)“確定”后進入MFC應用程序向導,單擊“下一步”:

3)進入到應用程序類型界面,選擇“單文檔”、“Office”、“Office 2007(黑色主題)”,單擊“下一步”:

4)進入復合文檔支持,選擇“無”,單擊“下一步”:

5)進入文檔模板字符串,單擊“下一步”:

6)進入數據庫支持,選擇“無”,單擊“下一步”:

7)進入用戶界面功能,按下圖所示選擇后,單擊“下一步”:

8)進入高級功能,勾去所有的高級功能,如下圖,單擊“下一步”:

9)進入生成的類,選擇基類“CFormView”,單擊“完成”:

10)完成后,直接編譯運行程序,得到的界面如下入:

(2)Ribbon界面風格的主要構成分析:

Ribbon應用程序的主體框架構成從大到小包含如上圖中所示的三大塊:分類(CMFCRibbonCategory)、面板(CMFCRibbonPanel)、元素(包括:CMFCRibbonButton、CMFCRibbonEdit等)。
(3)如何創建屬于自己的Ribbon界面表現形式:
1)使用繪圖、PS等工具繪制自己的按鈕圖標(PNG),并放在工程的res目錄下,然后將其導入工程資源:


2)在MainFrm.cpp文件的InitializeRibbon()函數中,仿照默認生成的代碼編寫自己的Ribbon界面表現形式,刪除自動生成的你不需要的代碼:
A.添加資源符號:
在String Table中添加分類和面板資源符號:


在Accelerator中添加元素資源快捷鍵:

B.依次創建“分類->面板->元素”:
~~~
//創建“分類”-模塊1
bNameValid = strTemp.LoadString(IDS_RIBBON_MODULAR1);
ASSERT(bNameValid);
CMFCRibbonCategory* pCategoryHomeMod1 = m_wndRibbonBar.AddCategory(strTemp,IDB_PNG3,IDB_PNG2,CSize(28,25),CSize(56,50));
//創建“面板”-用戶管理和“元素”-按鈕
bNameValid = strTemp.LoadString(IDS_RIBBON_USERMANAGER);
ASSERT(bNameValid);
CMFCRibbonPanel* pPanelUserManager = pCategoryHomeMod1->AddPanel(strTemp, m_PanelImages.ExtractIcon(7));//有個子圖標(索引~)
CMFCRibbonButton* pBtnUserManager = new CMFCRibbonButton(ID_EDIT_USERMANAGER,_T(""), 0,0);//加載的第一個(索引)
pPanelUserManager->Add(pBtnUserManager);
~~~
3)添加相應消息響應函數,使面板元素激活可用:
~~~
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
ON_COMMAND(ID_EDIT_USERMANAGER, OnUserManagerCommand)
ON_COMMAND(ID_EDIT_PARAMCONFIG, OnParamConfigCommand)
//消息響應宏
END_MESSAGE_MAP()
~~~
4)最終自定義的Ribbon界面表現形式如下圖:

(4)SDI(單文檔界面)架構想要實現多個視圖之間的切換,需要定義一個切換視圖的函數——void SwitchToForm(int nForm);該函數的實現體如下:
★聲明全局變量**frmID:**
在stdafx.h中添加聲明:extern int frmID;
在stdafx.cpp中添加定義:int frmID;
在C工程名.cpp中的InitInstance()中初始化:frmID = 0;
~~~
void CMainFrame::SwitchToForm(int nForm) {//進行視圖切換的代碼函數
if (nForm!=frmID)
{
frmID=nForm;//避免多次點擊同一按鈕時出現的錯誤,一按鈕點擊一次后,第二次點擊不做任何處理。
CDocument* pDoc = GetActiveDocument();
CView *pOldActiveView=GetActiveView();//保存舊視圖
CView *pNewActiveView=(CView*)GetDlgItem(nForm);//取得新視圖
if(pNewActiveView==NULL)
{
switch(nForm){
case IDD_USERMANAGER_FORM ://視圖資源符號
pNewActiveView=(CView*)new CPoint19View;
break;
case IDD_PARAMCONFIG_FORM ://視圖資源符號
pNewActiveView=(CView*)new CParamConfig;
break;
}
CCreateContext context; //將文擋和視圖相連
context.m_pCurrentDoc=pOldActiveView->GetDocument();
pNewActiveView->Create(NULL, NULL, WS_BORDER|WS_CHILD, CFrameWnd::rectDefault, this, nForm, &context);
pNewActiveView->OnInitialUpdate();
}
SetActiveView(pNewActiveView); //改變活動的視圖
pNewActiveView->ShowWindow(SW_SHOW); //顯示新的視圖
pOldActiveView->ShowWindow(SW_HIDE); //隱藏舊的視圖
if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CPoint19View))
pOldActiveView->SetDlgCtrlID(IDD_USERMANAGER_FORM);
else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(CParamConfig))
pOldActiveView->SetDlgCtrlID(IDD_PARAMCONFIG_FORM);
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
delete pOldActiveView; //刪除舊視圖
RecalcLayout();//調整框架窗口
}
}
~~~
調用方式如下:
~~~
void CMainFrame::OnUserManagerCommand(){
SwitchToForm(IDD_USERMANAGER_FORM);
}
void CMainFrame::OnParamConfigCommand(){
SwitchToForm(IDD_PARAMCONFIG_FORM);
}
~~~
- 前言
- VC++中自定義熱鍵及響應
- CFileDialog文件對話框
- VC++中客戶區保存為BMP圖片
- VC++讀、寫注冊表
- VC++播放音頻文件和音頻數據的方法
- VC++調用Matlab編寫的DLL(混合編程)
- VC++中文件讀、寫和其他相關操作匯總
- VC++獲取系統當前時間
- VC++按鈕控件字體設置
- VC++軟件界面風格簡單美化
- VC++中一些常用的數據類型之間的相互轉化
- VC++中截取字符串的方法
- VC++中vector矢量的使用方法及隨機相關
- VC++中結構體的定義及使用
- VC++中List Control控件的使用方法介紹
- VC++中窗口過程函數及其消息發送、響應機制介紹
- VC++中Ribbon編程架構及SDI架構多視圖切換介紹
- 串口通信基礎知識及VC++實現
- VC++中單個鍵盤按鍵的響應
- VC++中的計時器及多媒體高精度計時器
- VC++編寫DLL導出函數及其調用方法
- VC++對話框(CDialog)的全屏顯示及控件居中顯示
- VC++對話框(CDialog)添加背景圖片
- VC++圖片控件(Picture Control)顯示資源位圖(BMP)、文件位圖(BMP)、其它格式文件圖片(JPG\PNG\BMP)的方法
- VC++對Access數據庫的操作(查詢、插入、更新、刪除等)