轉(zhuǎn)帖|使用教程|編輯:鮑佳佳|2021-05-14 10:03:17.977|閱讀 558 次
概述:MFC開發(fā)中一般情況下工具欄中的按鈕在菜單欄中都有對應(yīng)的菜單項(xiàng),兩者實(shí)現(xiàn)的功能相同,要想實(shí)現(xiàn)這種效果,只需要將工具欄按鈕的ID與對應(yīng)的菜單欄中菜單項(xiàng)的ID設(shè)置為相同值即可。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
在上一節(jié)教程中講了工具欄資源及CToolBar類,本節(jié)繼續(xù)講解工具欄的相關(guān)知識(shí),主要內(nèi)容包括工具欄的創(chuàng)建、停靠與使用。
Xtreme Toolkit Pro:是屢獲殊榮的VC界面庫,是MFC開發(fā)中最全面界面控件套包,它提供了Windows開發(fā)所需要的11種主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、Skin Framework 和Task Panel。
點(diǎn)擊下載Xtreme Toolkit Pro最新試用版
工具欄的使用
上一節(jié)中提到過,一般情況下工具欄中的按鈕在菜單欄中都有對應(yīng)的菜單項(xiàng),兩者實(shí)現(xiàn)的功能相同,要想實(shí)現(xiàn)這種效果,只需要將工具欄按鈕的ID與對應(yīng)的菜單欄中菜單項(xiàng)的ID設(shè)置為相同值即可。
在實(shí)際使用工具欄時(shí),除了前面講的資源編輯外,其他使用與菜單類似。例如,對COMMAND消息和UPDATE_COMMAND_UI消息,可以像VS2010/MFC編程入門菜單及CMenu類的使用)中的菜單應(yīng)用實(shí)例那樣為工具欄按鈕添加消息處理函數(shù)。
如果工具欄按鈕對應(yīng)的菜單項(xiàng)已經(jīng)添加了消息處理函數(shù),那么就不必再為它添加了,因?yàn)樗腎D與菜單項(xiàng)相同,所以會(huì)調(diào)用同樣的消息處理函數(shù)。這樣點(diǎn)擊工具欄按鈕與點(diǎn)擊相應(yīng)菜單項(xiàng)執(zhí)行相同的功能,在菜單項(xiàng)為選中、激活或禁用等狀態(tài)時(shí),工具欄按鈕會(huì)有一樣的狀態(tài)。
工具欄的創(chuàng)建
大家在第三十四講創(chuàng)建的Example34工程的CMainFrame類中看到,它創(chuàng)建工具欄所使用的類并不是常用的CToolBar類,而是CMFCToolBar類。CMFCToolBar類是自VS2008以來MFC提供的類,它與CToolBar類有些類似,但功能更豐富。這里要注意,CMFCToolBar類與CToolBar類并沒有任何派生關(guān)系。
這里就以CMFCToolBar類來講講工具欄的創(chuàng)建步驟:
1. 創(chuàng)建工具欄資源。
2. 構(gòu)造CMFCToolBar類的對象。
3. 調(diào)用CMFCToolBar類的Create或CreateEx成員函數(shù)創(chuàng)建工具欄。
4. 調(diào)用LoadToolBar成員函數(shù)加載工具欄資源。
大家可以對應(yīng)著看看Example34的CMainFrame類自動(dòng)生成的代碼中創(chuàng)建工具欄的過程。
工具欄IDR_MAINFRAME的資源已經(jīng)自動(dòng)創(chuàng)建好。在MainFrm.h文件對CMainFrame類的聲明中,定義了CMFCToolBar類的對象作為成員對象:CMFCToolBar m_wndToolBar;。然后在CMainFrame::OnCreate函數(shù)的實(shí)現(xiàn)中可以看到工具欄的創(chuàng)建以及加載工具欄資源的代碼,如下:
C++代碼
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWndEx::OnCreate(lpCreateStruct) == -1) return -1; ......略 // 調(diào)用CreateEx函數(shù)創(chuàng)建工具欄,并調(diào)用LoadToolBar函數(shù)加載工具欄資源 if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } ......略 return 0; }
因為創(chuàng)建框架窗口時(shí)需要調(diào)OnCreate函數(shù),所以工具欄的創(chuàng)建也是在OnCreate中完成的。
工具欄的停靠
在創(chuàng)建好工具欄后,如果想要停靠工具欄,也需要添加相應(yīng)的停靠代碼。工具欄停靠的步驟及需要調(diào)用的函數(shù)如下(前兩個(gè)步驟可以顛倒順序):
1. 在框架窗口中啟用停靠。
若要將工具欄停靠到某個(gè)框架窗口,則必須啟用該框架窗口(或目標(biāo))以允許停靠。可以在CFrameWndEx類中調(diào)用下面的成員函數(shù)來實(shí)現(xiàn):
BOOL EnableDocking(DWORD dwDockStyle);
該函數(shù)采用一個(gè)DWORD參數(shù),用來指定框架窗口的哪個(gè)邊可以接受停靠,可以有四種取值:CBRS_ALIGN_TOP(頂部)、CBRS_ALIGN_BOTTOM(底部)、CBRS_ALIGN_LEFT(左側(cè))、CBRS_ALIGN_RIGHT(右側(cè))。如果希望能夠?qū)⒖刂茥l停靠在任意位置,將CBRS_ALIGN_ANY作為參數(shù)傳遞給EnableDocking。
2. 工具欄啟用停靠。
框架窗口啟用停靠準(zhǔn)備好后,必須以相似的方式準(zhǔn)備工具欄。為想要停靠的每一個(gè)工具欄CMFCToolBar對象調(diào)用下面的函數(shù):
virtual void EnableDocking(DWORD dwAlignment);
允許工具欄停靠到框架窗口,并指定工具欄應(yīng)停靠的目標(biāo)邊。此函數(shù)指定的目標(biāo)邊必須與框架窗口中啟用停靠的邊匹配,否則工具欄無法停靠,為浮動(dòng)狀態(tài)。
3. 停靠工具欄。
當(dāng)用戶試圖將工具欄放置在允許停靠的框架窗口某一邊時(shí),需要框架CFrameWndEx類調(diào)用以下函數(shù):
void DockPane(CBasePane* pBar,UINT nDockBarID=0,LPCRECT lpRect=NULL);
參數(shù)pBar為要停靠的控制條的指針,參數(shù)nDockBarID為要停靠的框架窗口某條邊的ID,可以是以下四種取值:AFX_IDW_DOCKBAR_TOP、AFX_IDW_DOCKBAR_BOTTOM、AFX_IDW_DOCKBAR_LEFT、AFX_IDW_DOCKBAR_RIGHT。
下面我們接著看Example34的CMainFrame類的OnCreate函數(shù)實(shí)現(xiàn)中,工具欄的停靠過程:
C++代碼
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWndEx::OnCreate(lpCreateStruct) == -1) return -1; ......略 // 調(diào)用CreateEx函數(shù)創(chuàng)建工具欄,并調(diào)用LoadToolBar函數(shù)加載工具欄資源 if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME)) { TRACE0("Failed to create toolbar\n"); return -1; // fail to create } ......略 // TODO: Delete these five lines if you don't want the toolbar and menubar to be dockable m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY); // 為m_wndToolBar啟用停靠 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); // 為框架窗口啟用停靠 EnableDocking(CBRS_ALIGN_ANY); DockPane(&m_wndMenuBar); // 停靠工具欄 DockPane(&m_wndToolBar); ......略 return 0; }
關(guān)于工具欄的知識(shí)就講到這里了。感謝大家長期以來的支持。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自: