上一節中雞啄米講了為Ribbon Bar添加控件的方法。本節教程雞啄米将繼續完善前面的執行個體,講解一些稍複雜的控件的添加方法,及如何為它們添加消息處理函數。
一、為Ribbon Bar添加更多Ribbon控件
雞啄米将在上一節執行個體的基礎上,繼續添加下拉菜單、Check Box、Combo Box等Ribbon控件。
1、首先把“Small Button”面闆上的“Click”按鈕改造成一個下拉菜單。“Click”按鈕有一個Behavior屬性Menu Items,預設為Empty,選中它右側會出現一個浏覽按鈕,點選浏覽按鈕會彈出“Items Editor”對話框,如下圖:

我們可以在上圖Items下的組合框中選擇按鈕、分割線等,點選組合框右側的Add按鈕将其添加到下拉菜單中,添加按鈕後在Properties分組中可以設定Caption(标題)、ID、Image(圖檔)等屬性。雞啄米這裡添加兩個按鈕,Caption屬性分别為One Click、Double Click,ID分别為ID_ONE_CLICK、ID_DOUBLE_CLICK,Image等屬性就不設定了。此時的Ribbon Bar如下圖:
“Click”右側多了一個向下的箭頭,運作程式後點選此箭頭會顯示包含One Click和Double Click按鈕的下拉菜單。另外,上圖中有一個按鈕雞啄米用紅線訓示了其提示資訊-“Test Ribbon”,點選了此按鈕我們就可以不運作程式而直接檢視Ribbon界面效果。
2、在Small Button面闆的右側再添加一個面闆“More Controls”,然後在Toolbox工具中找到Check Box和Combo Box控件拖入新面闆,Check Box的Caption屬性設為“Websites Enable”,Combo Box的屬性設為“Websites”。效果圖如下:
我們為Websites組合框(Combo Box)添加兩個下拉選項,方法是,右鍵點選Websites組合框,選擇“Properties”,顯示出其屬性頁,修改Data屬性為“www.jizhuomi.com;www.jizhuomi.com/android”,這樣就為此Combo Box添加兩個網址選項。
二、為Ribbon控件添加消息處理函數
前面控件都添加好了,接下來我們就為控件添加消息處理函數。
1、首先為Open按鈕添加單擊事件的消息處理函數,其ID修改為ID_OPEN_BUTTON,然後右鍵點選Open按鈕,選擇“Add Event Handler”,彈出Event Handler Wizard對話框,右側的Class list中選擇“CMainFrame”,左側的Message Type中選擇“COMMAND”,最後點選“Add and Edit”按鈕,CMainFrame類中就添加了void CMainFrame::OnOpenButton()成員函數。
大家可能感覺到了,其實消息處理函數的添加過程與以前的普通控件是類似的。最後修改void CMainFrame::OnOpenButton()函數的函數實作如下:
C++代碼
void CMainFrame::OnOpenButton()
{
// TODO: Add your command handler code here
MessageBox(_T("Open Button!")); // 彈出對話框,提示“Open Button!”
}
因為隻是為了講解按鈕的消息處理函數的添加,是以沒有寫複雜的代碼,隻寫了一個彈出MessageBox的語句。運作程式,在結果界面的Function類别的Big Button面闆中,點選Open按鈕就會彈出一個對話框,并顯示“Open Button!”。
2、我們再為Websites組合框添加消息處理函數(方法同上),同樣也為其在CMainFrame類中添加COMMAND消息處理函數--void CMainFrame::OnWebsitesCombo(),修改此函數實作如下:
void CMainFrame::OnWebsitesCombo()
// 擷取Combo Box控件的指針
CMFCRibbonComboBox* pComboBox = DYNAMIC_DOWNCAST(CMFCRibbonComboBox, m_wndRibbonBar.FindByID(ID_WEBSITES_COMBO));
// 擷取Combo Box控件目前選中項的索引
int nCurSel = pComboBox->GetCurSel();
if (nCurSel >= 0)
{
// 如果索引大于等于0,則說明有選中項,彈出對話框并顯示選中項的資訊
MessageBox(pComboBox->GetItem(nCurSel));
}
else
// 如果索引小于0,則說明沒有選中項,彈出對話框提示使用者進行選擇
MessageBox(_T("Please select one item!"));
運作程式,在結果界面中,改變WebSites組合框的選中項,則會彈出對話框顯示選中項的資訊。如下圖:
3、然後我們為Websites Enable複選框添加消息處理函數。預設情況下Check Box控件不會因為使用者的點選而改變狀态,這就需要我們通過代碼來實作正常的複選功能。
我們需要一個變量儲存Check Box的目前選中狀态,是以在MainFrm.h檔案中為CMainFrame類添加一個BOOL型的成員變量m_bWebsitesEnable,并在CMainFrame類的構造函數中為其初始化:
CMainFrame::CMainFrame()
// TODO: add member initialization code here
theApp.m_nAppLook = theApp.GetInt(_T("ApplicationLook"), ID_VIEW_APPLOOK_OFF_2007_BLUE);
// 初始化為TRUE,即複選框為選中狀态
m_bWebsitesEnable = TRUE;
接下來仍然采用1中的方法為Websites Enable複選框在CMainFrame類中添加COMMAND消息處理函數,并修改其函數體如下:
void CMainFrame::OnWebsitesCheck()
// 為m_bWebsitesEnable取反,即切換複選框的狀态
m_bWebsitesEnable = !m_bWebsitesEnable;
但是現在複選框的狀态隻是儲存到了變量中,我們還要根據變量值改變複選框的顯示狀态,這就需要再為Check Box添加一個UPDATE_COMMAND_UI消息處理函數,方法仍舊是右鍵點選Check Box,選擇“Add Event Handler”,在彈出的Event Handler Wizard對話框的Class list中選擇“CMainFrame”,Message type中則選擇UPDATE_COMMAND_UI,最後點“Add and Edit”,這樣就添加了UPDATE_COMMAND_UI消息處理函數,修改此函數實作如下:
void CMainFrame::OnUpdateWebsitesCheck(CCmdUI *pCmdUI)
// TODO: Add your command update UI handler code here
// 根據目前變量值設定複選框狀态
pCmdUI->SetCheck(m_bWebsitesEnable);
這時你可以試着運作下程式,點選Website Enable複選框,它已經能成功的改變狀态了。
4、除了以上功能,我們還要實作一個稍複雜的功能,就是如果選中Websites Enable複選框則激活Websites組合框,而如果取消選中則禁用Websites組合框。這就需要我們為Websites組合框添加UPDATE_COMMAND_UI消息處理函數了,添加方法同上,雞啄米這裡不再贅述。修改函數實作為:
void CMainFrame::OnUpdateWebsitesCombo(CCmdUI *pCmdUI)
// 根據Websites Enable複選框的狀态确實激活還是禁用
pCmdUI->Enable(m_bWebsitesEnable);
運作程式,試着改變Websites Enable複選框的狀态,Websites組合框的使能狀态也會跟着改變。
最後,雞啄米再簡單講講如何為Ribbon Bar左上角的圓形菜單按鈕和快速通路工具欄添加新項。
圓形菜單按鈕的屬性頁中有一個Buttons屬性,可以點選其右側浏覽按鈕彈出Items Editor對話框,使用該對話框可以在菜單按鈕的彈出菜單視窗中添加右下角的按鈕。還有一個Main Items屬性,點其右側浏覽按鈕也會彈出Items Editor對話框,通過它可以為圓形菜單按鈕添加菜單項。
快速通路工具欄的屬性頁中有一個QAT Items屬性,點選其右側浏覽按鈕彈出QAT Items Editor對話框,使用該對話框可以在快速通路工具欄中添加新項。
本節内容有點多,不過并不複雜,很多都與之前的知識類似。最後雞啄米歡迎大家常回本站看看。