學習VS2010 ------ 多彩界面,Ribbon編程

多彩界面,Ribbon編程

  Ribbon是類似於office2007樣式的界面,它替代了傳統的MFC程序裏的菜單和工具欄,MFC默認生成的Ribbon功能少,需要我們自己添加一些控件和圖片等元素使界面好看。與菜單資源相比,Ribbon的設計使界面更加直觀,帶有的圖標也使界面看起來更加美觀。Ribbon界面設計的重要方面就是要設計所需的圖標,設計圖標時,需要設計小圖標和大圖標,Ribbon類的添加有兩種方式。

方法一:資源創建

可以利用VS2010帶有的資源編輯器創建Ribbon資源,並在程序中調用,調用方式:

m_wndRibbonBar.LoadFromResource(IDR_RIBBON)

在右邊的工具欄中,具有與Ribbon界面相關的各種工具,可以選擇相應的Ribbon工具按照工具進行添加,可以先添加category,再添加Pane,再根據自己的需要添加各種按鈕、按鈕集、複選框等。

Ribbon工具欄及其包含的控件如下:


在利用資源編輯的方式編輯Ribbon界面時,注意先利用位圖的方式引入category需要的圖標,然後再在具體的控件中填寫引用的序號,並選用相應的ID,針對下拉式按鈕,在創建時,可以利用“Menu Item”項目創建子項目。


   在資源中創建Ribbon界面之後,可以利用ClassWizard添加各個控件的Ribbon變量,並針對各個按鈕創建實現的代碼函數,實現相應的程序設計。

方法二:編程創建

1.      Ribbon主菜單的設計

       m_MainButton.SetImage(IDB_RIBBON_MAIN);

         m_MainButton.SetToolTipText(_T("File"));

         m_MainButton.SetText(_T("\nf"));

         m_wndRibbonBar.SetApplicationButton(&m_MainButton, CSize (45, 45));

         CMFCRibbonMainPanel*pMainPanel = m_wndRibbonBar.AddMainCategory (_T("File"),IDB_RIBBON_FILE_SMALL, IDB_RIBBON_FILE_LARGE);

         pMainPanel->Add(new CMFCRibbonButton (ID_FILE_NEW, _T("&New"), 0, 0));

         pMainPanel->Add(new CMFCRibbonButton (ID_FILE_OPEN, _T("&Open..."), 1, 1));

         pMainPanel->Add(new CMFCRibbonButton (ID_FILE_SAVE, _T("&Save"), 2, 2));

         pMainPanel->Add(new CMFCRibbonButton (ID_FILE_SAVE_AS, _T("Save &As..."), 3, 3));

         std::auto_ptr<CMFCRibbonButton>apBtnPrint(new CMFCRibbonButton (ID_FILE_PRINT,_T("&Print"), 4, 4));

         apBtnPrint->AddSubItem(new CMFCRibbonLabel (_T("Preview and print the document")));

         apBtnPrint->AddSubItem(new CMFCRibbonButton (ID_FILE_PRINT, _T("&Print"), 4, 4, TRUE));

         apBtnPrint->AddSubItem(new CMFCRibbonButton (ID_FILE_PRINT_DIRECT,_T("&Quick Print"), 6, 6,TRUE));

         apBtnPrint->AddSubItem(new CMFCRibbonButton (ID_FILE_PRINT_PREVIEW,_T("Print Pre&view"), 7, 7,TRUE));

         apBtnPrint->SetKeys (_T("p"),_T("w"));

         pMainPanel->Add (apBtnPrint.release());

         pMainPanel->AddRecentFilesList(_T("Recent Documents"));

         pMainPanel->AddToBottom(new CMFCRibbonMainPanelButton(ID_TOOLS_OPTIONS, _T("Opt&ions"),8));

         pMainPanel->AddToBottom(new CMFCRibbonMainPanelButton (ID_APP_EXIT,_T("E&xit"), 9));

2.      Ribbon的category的添加:

         CMFCRibbonCategory*pCategory = m_wndRibbonBar.AddCategory(_T("&Buttons"),IDB_RIBBON_CATEGORY1_SMALL, IDB_RIBBON_CATEGORY1_LARGE);

         CMFCRibbonPanel*pPanel1 = pCategory->AddPanel(_T("LargeButtons"));

         std::auto_ptr<CMFCRibbonButton>apBtn1(new CMFCRibbonButton(ID_RIBBON_BTN_1,_T("Button"), 0, 0));

         apBtn1->SetAlwaysLargeImage();

         pPanel1->Add(apBtn1.release());

         std::auto_ptr<CMFCRibbonButton>apBtn2(new CMFCRibbonButton(ID_RIBBON_BTN_2,_T("Menu Button"), 1, 1));

         apBtn2->SetMenu(IDR_RIBBON_MENU_1);

         apBtn2->SetAlwaysLargeImage();

         pPanel1->Add(apBtn2.release());

         std::auto_ptr<CMFCRibbonButton>apBtn3(new CMFCRibbonButton(ID_RIBBON_BTN_3,_T("Split Button"), 2, 2));

         apBtn3->SetMenu(IDR_RIBBON_MENU_1,TRUE);

         apBtn3->SetAlwaysLargeImage();

         apBtn3->RemoveSubItem(0);

         apBtn3->AddSubItem(new CMFCRibbonButton(ID_RIBBON_MBTN_1, _T("Item 1"), 2), 0);

         pPanel1->Add(apBtn3.release());

         CMFCRibbonPanel*pPanel2 = pCategory->AddPanel(_T("Small"));

         std::auto_ptr<CMFCRibbonButton>apBtn4(new CMFCRibbonButton(ID_RIBBON_BTN_4,_T("Button"), 3));

         pPanel2->Add(apBtn4.release());

         std::auto_ptr<CMFCRibbonButton>apBtn5(new CMFCRibbonButton(ID_RIBBON_BTN_5,_T("Menu Button"), 4));

         apBtn5->SetMenu(IDR_RIBBON_MENU_1);

         pPanel2->Add(apBtn5.release());

         std::auto_ptr<CMFCRibbonButton>apBtn6(new CMFCRibbonButton(ID_RIBBON_BTN_6,_T("Split Button"), 5));

         apBtn6->SetMenu(IDR_RIBBON_MENU_1,TRUE);

         apBtn6->SetAlwaysLargeImage();

         apBtn6->RemoveSubItem(1);

         apBtn6->AddSubItem(new CMFCRibbonButton(ID_RIBBON_MBTN_2, _T("Item 2"), 5), 1);

         pPanel2->Add(apBtn6.release());

         CMFCRibbonPanel*pPanel3 = pCategory->AddPanel(_T("CheckBoxes"));

         pPanel3->Add(new CMFCRibbonCheckBox(ID_RIBBON_BTN_7, _T("Check Box 1")));

         pPanel3->Add(new CMFCRibbonCheckBox(ID_RIBBON_BTN_8, _T("Check Box 2")));

         pPanel3->Add(new CMFCRibbonCheckBox(ID_RIBBON_BTN_9, _T("Check Box 3")));

         pPanel1->SetData(ID_RIBBON_SOURCE_CODE_1_1);

         pPanel2->SetData(ID_RIBBON_SOURCE_CODE_1_2);

         pPanel3->SetData(ID_RIBBON_SOURCE_CODE_1_3);

3.      其它category的添加

添加方法同2

4.      界面風格的變化:

Ribbon支持MFC風格界面的變化,可以根據設定的Style設定不同的界面風格。

switch (m_nAppLook)

{

caseID_VIEW_APPLOOK_2007:

caseID_VIEW_APPLOOK_2007_1:

caseID_VIEW_APPLOOK_2007_2:

caseID_VIEW_APPLOOK_2007_3:

switch (m_nAppLook)

{

caseID_VIEW_APPLOOK_2007:

CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue);

break;

caseID_VIEW_APPLOOK_2007_1:

CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_ObsidianBlack);

break;

caseID_VIEW_APPLOOK_2007_2:

CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Silver);

break;

caseID_VIEW_APPLOOK_2007_3:

         CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_Aqua);

         break;

         }

CMFCVisualManager::SetDefaultManager (RUNTIME_CLASS(CMFCVisualManagerOffice2007));

CDockingManager::SetDockingMode (DT_SMART);

break;

default:

         ASSERT(FALSE);

}

最終界面:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章