雞啄米在上一節教程中講了工具欄資源及CToolBar類,本節繼續講解工具欄的相關知識,主要內容包括工具欄的創建、??颗c使用。

       工具欄的使用

       上一節中雞啄米提到過,一般情況下工具欄中的按鈕在菜單欄中都有對應的菜單項,兩者實現的功能相同,要想實現這種效果,只需要將工具欄按鈕的ID與對應的菜單欄中菜單項的ID設置為相同值即可。

       在實際使用工具欄時,除了前面講的資源編輯外,其他使用與菜單類似。例如,對COMMAND消息和UPDATE_COMMAND_UI消息,可以像VS2010/MFC編程入門之三十五(菜單:菜單及CMenu類的使用)中的菜單應用實例那樣為工具欄按鈕添加消息處理函數。

       如果工具欄按鈕對應的菜單項已經添加了消息處理函數,那么就不必再為它添加了,因為它的ID與菜單項相同,所以會調用同樣的消息處理函數。這樣點擊工具欄按鈕與點擊相應菜單項執行相同的功能,在菜單項為選中、激活或禁用等狀態時,工具欄按鈕會有一樣的狀態。

       工具欄的創建

       大家在第三十四講創建的Example34工程的CMainFrame類中看到,它創建工具欄所使用的類并不是常用的CToolBar類,而是CMFCToolBar類。CMFCToolBar類是自VS2008以來MFC提供的類,它與CToolBar類有些類似,但功能更豐富。這里要注意,CMFCToolBar類與CToolBar類并沒有任何派生關系。

       雞啄米這里就以CMFCToolBar類來講講工具欄的創建步驟:

       1. 創建工具欄資源。

       2. 構造CMFCToolBar類的對象。

       3. 調用CMFCToolBar類的Create或CreateEx成員函數創建工具欄。

       4. 調用LoadToolBar成員函數加載工具欄資源。

       大家可以對應著看看Example34的CMainFrame類自動生成的代碼中創建工具欄的過程。

       工具欄IDR_MAINFRAME的資源已經自動創建好。在MainFrm.h文件對CMainFrame類的聲明中,定義了CMFCToolBar類的對象作為成員對象:CMFCToolBar  m_wndToolBar;。然后在CMainFrame::OnCreate函數的實現中可以看到工具欄的創建以及加載工具欄資源的代碼,如下:

C++代碼
  1. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)   
  2. {   
  3.     if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)   
  4.         return -1;   
  5.          ......略   
  6.   
  7.     // 調用CreateEx函數創建工具欄,并調用LoadToolBar函數加載工具欄資源   
  8.     if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||   
  9.         !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))   
  10.     {   
  11.         TRACE0("Failed to create toolbar\n");   
  12.         return -1;      // fail to create   
  13.     }   
  14.   
  15.     ......略   
  16.   
  17.     return 0;   
  18. }  

       因為創建框架窗口時需要調OnCreate函數,所以工具欄的創建也是在OnCreate中完成的。

       工具欄的???/strong>

       在創建好工具欄后,如果想要??抗ぞ邫?,也需要添加相應的??看a。工具欄??康牟襟E及需要調用的函數如下(前兩個步驟可以顛倒順序):

       1. 在框架窗口中啟用???。

           若要將工具欄??康侥硞€框架窗口,則必須啟用該框架窗口(或目標)以允許?????梢栽贑FrameWndEx類中調用下面的成員函數來實現:

           BOOL EnableDocking(DWORD dwDockStyle);

           該函數采用一個DWORD參數,用來指定框架窗口的哪個邊可以接受???,可以有四種取值:CBRS_ALIGN_TOP(頂部)、CBRS_ALIGN_BOTTOM(底部)、CBRS_ALIGN_LEFT(左側)、CBRS_ALIGN_RIGHT(右側)。如果希望能夠將控制條??吭谌我馕恢?,將CBRS_ALIGN_ANY作為參數傳遞給EnableDocking。

       2. 工具欄啟用???。

           框架窗口啟用??繙蕚浜煤?,必須以相似的方式準備工具欄。為想要??康拿恳粋€工具欄CMFCToolBar對象調用下面的函數:

           virtual void EnableDocking(DWORD dwAlignment);

           允許工具欄??康娇蚣艽翱?,并指定工具欄應??康哪繕诉?。此函數指定的目標邊必須與框架窗口中啟用??康倪吰ヅ?,否則工具欄無法???,為浮動狀態。

       3. ??抗ぞ邫?。

           當用戶試圖將工具欄放置在允許??康目蚣艽翱谀骋贿厱r,需要框架CFrameWndEx類調用以下函數:

           void DockPane(CBasePane* pBar,UINT nDockBarID=0,LPCRECT lpRect=NULL);

           參數pBar為要??康目刂茥l的指針,參數nDockBarID為要??康目蚣艽翱谀硹l邊的ID,可以是以下四種取值:AFX_IDW_DOCKBAR_TOP、AFX_IDW_DOCKBAR_BOTTOM、AFX_IDW_DOCKBAR_LEFT、AFX_IDW_DOCKBAR_RIGHT。

        下面我們接著看Example34的CMainFrame類的OnCreate函數實現中,工具欄的??窟^程:

C++代碼
  1. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)   
  2. {   
  3.     if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)   
  4.         return -1;   
  5.   
  6.     ......略   
  7.   
  8.     // 調用CreateEx函數創建工具欄,并調用LoadToolBar函數加載工具欄資源  
  9.     if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||   
  10.         !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))   
  11.     {   
  12.         TRACE0("Failed to create toolbar\n");   
  13.         return -1;      // fail to create   
  14.     }   
  15.   
  16.          ......略   
  17.   
  18.     // TODO: Delete these five lines if you don't want the toolbar and menubar to be dockable   
  19.     m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);   
  20.          // 為m_wndToolBar啟用???  
  21.     m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);   
  22.          // 為框架窗口啟用???  
  23.     EnableDocking(CBRS_ALIGN_ANY);   
  24.     DockPane(&m_wndMenuBar);   
  25.          // ??抗ぞ邫?  
  26.     DockPane(&m_wndToolBar);   
  27.     
  28.          ......略   
  29.   
  30.     return 0;   
  31. }  

       關于工具欄的知識就講到這里了。雞啄米感謝大家長期以來的支持。

除非特別注明,雞啄米文章均為原創
轉載請標明本文地址:http://www.028keji.com/software/217.html
2012年8月7日
作者:雞啄米 分類:軟件開發 瀏覽: 評論:6