在以前關于MFC工具條類的討論專題中,我曾答應提供一個在版本6中工具條的外觀演示。有一個很好的消息,那就是你現在用CToolBar所作的所有工作在新的版本中都是有效的,包括那些在以前的欄目中所描述的一些擴展功能。因此,你將很容易修改現存的程序以獲得象Internet Explorer和Visual Studio中那樣“酷”的界面。此外,并沒有什么壞消息。
工具條的新特色
早在版本4中,CToolBar就已被MFC庫完全實現了。一旦公用控件動態鏈接庫(命名為comctl32.dll)變得無所不在了,CToolBar就成了如今已包含在操作系統中的工具條控件的代名詞了。然而,CToolBar并沒有揭示公用工具條控件的所有能力。如今,通過CreateEx()函數,它成功了。
公用控件動態鏈接庫現在包含了至少三類風格:最初的、在Internet Explorer3.0中加入的以及在Internet Explorer 4.0中加入的。雖然這些版本理論上是向下兼容的,但某些專業人員曾寫出一些不能在后來版本中正常運行的應用程序,這可能是這些程序采用了一些沒有公開的功能,而這些功能并沒有被包含在所有的版本中。
Visual C 程序員沒有這樣的經歷,因為在Visual C 4.0或5.0中comctl32.dll并不是一個可以再分發的組件,它在安裝Internet Explorer時被更新,因此MFC程序員無法依靠最新版本的某些功能來用于他們的程序。這就是CToolBar僅僅具有最初的DLL的有限功能的原因。CToolBar能夠實現最新的特色意味著微軟將在Visual C 6.0中包含最新的DLL并將其作為一個可以再分發的組件。
絕大多數新特色將由在調用CreateEx()和其它CToolBar成員函數時指定的新的風格標志來確定。下面是commctrl.h的一部分,它定義了TBSTYLE類標識符:
#define TBSTYLE_BUTTON 0x0000
#define TBSTYLE_SEP 0x0001
#define TBSTYLE_CHECK 0x0002
#define TBSTYLE_GROUP 0x0004
#define TBSTYLE_CHECKGROU TBSTYLE_GROUP | TBSTYLE_CHECK)
#if (_WIN32_IE $#@62;= 0x0300)
#define TBSTYLE_DROPDOWN 0x0008
#endif
#if (_WIN32_IE $#@62;= 0x0400)
#define TBSTYLE_AUTOSIZE 0x0010
#define TBSTYLE_NOPREFIX 0x0020
#endif
#define TBSTYLE_TOOLTIPS 0x0100
#define TBSTYLE_WRAPABLE 0x0200
#define TBSTYLE_ALTDRAG 0x0400
#if (_WIN32_IE $#@62;= 0x0300)
#define TBSTYLE_FLAT 0x0800
#define TBSTYLE_LIST 0x1000
#define TBSTYLE_CUSTOMERASE 0x2000
#endif
#if (_WIN32_IE $#@62;= 0x0400)
#define TBSTYLE_REGISTERDROP 0x4000
#define TBSTYLE_TRANSPARENT 0x8000
#define TBSTYLE_EX_DRAWDDARROWS 0x00000001
#endif
你會注意到其中的一些采用了條件編譯,依賴于_WIN32_IE的值,它缺省指的是Internet Explorer 4.0(即取值為0x0400)。對于Internet Explorer 3.0(即取值為0x0300)以前的版本,大多數的TBSTYLE標識符指的是按鈕或是一組按鈕。Internet Explorer3.0引入了扁平鈕、文本標簽、下拉列表和自定義繪制。Internet Explorer 4.0增強了下拉列表和自定義繪制功能,并且增加了支持OLE拖動目標到一個工具條。
扁平鈕和把手
在過去的18個月中我常常被問及該如何獲得象Internet Explorer和Visual Studio中的工具條一樣不使用浮雕按鈕而是用扁平鈕并且帶有便于移動和定位的把手那樣酷的界面。這些特色并不被MFC所支持,因此最簡單獲取的方法就是購買一個擴展庫。而對于Visual C 6.0來說卻無須多此一舉,因為它使得CToolBar類實現了對扁平鈕、把手和其它新的視覺效果的支持。
在預覽版中,AppWizard并不會自動包括這些新特色,但它們卻很容易被加入。表1顯示了AppWizard創建的主框架窗口的OnCreate()函數,表2顯示了需要做哪些修改以獲得具有扁平鈕和把手的工具條。圖1顯示了表1創建出的工具條,而圖2顯示出了表2實現的工具條。
表 1: CMainFrame::OnCreate as generated by AppWizard
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if(!m_wndToolBar.Create(this)||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if(!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)))
圖1
表2: Adding flat buttons and the gripper
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if(!m_wndToolBar.CreateEx(this)||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if(!m_wndStatusBar.Create(this)||!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// TODO: Remove this if you dont want tool tips or a resizeable toolbar