Windows控制窗口
Windows(Windows 95或者以上版本)提供了系列通用控制窗口,其中包括工具條(ToolBar)、狀態欄(StatusBar)、工具條提示窗口(ToolTip)。
Windows在一個DLL加載時注冊個控制窗口的“窗口類”。例如,工具條的“窗口類”是“ToolbarWindow32”,狀態欄的“窗口類”是“msctls_statusbar32”,工具條提示窗口的“窗口類”是“tooltips_class32”。為了保證該DLL被加載,使用控制“窗口類”前,應該首先調用函數InitCommonControl。MFC在窗口注冊函數AfxDeferRegisterClass中實現了這一點。見2.2.1節MFC下窗口的注冊。
創建通用控制窗口,可以使用專門的創建函數,如創建工具條的函數::CreateToolBarEx,創建狀態欄的函數::CreateStatusBarEx。也可以調用窗口創建函數::CreateWindowEx,但是需要指定預定義的“窗口類”,必要的話還要其他步驟,如使用“ToolbarWindow32”“窗口類”創建工具欄後,還需要在工具欄中添加或者插入按鈕。
一般,通用控制可以指定控制窗口風格(Style)。例如,具備風格CCS_TOP,表示該控制窗口放到父窗口客戶區的頂部,具備CCS_BOTTOM,表示該控制窗口在客戶區的底部。具體的控制窗口類可以有特別的適合於自己的風格,例如,TTS_ALWAYSTIP表示只要光標落在工具欄的按鈕上,ToolTip窗口不論激活與否都會顯示出來。
每一控制窗口類都有自己的窗口過程來處理自己的窗口消息,實現特定的功能。控制窗口類的窗口過程由Windows提供。
工具條
工具條的窗口過程處理了必要的消息,提供了標准工具條的功能,例如,工具條對客戶化特征提供內在的支持,用戶可以通過一個客戶化對話框來添加、修改、刪除或者重新安排工具條按鈕。這些特征是否可以被用戶所用或者用到什麼地步是可以由程序控制的。
工具條的窗口過程將自動設置工具條的尺寸大小和位置,如果指定了控制窗口風格CCS_TOP或者CCS_BOTTOM,則窗口過程把工具條放到父窗口客戶區的頂部或者底部。窗口過程任何時候只要收到WM_SIZE或者TB_AUTOSIZE消息就自動地調整工具條的大小和位置。
工具條的按鈕被選中後,會產生一個命令消息,它的窗口過程把該消息送給父窗口的窗口過程處理。
工具條中的按鈕並不以子窗口的形式出現,而是以字符或者位圖按鈕的方式顯示,每個按鈕大小相同,缺省是24*22個像素。每個按鈕都有一個索引,索引編號從0開始。每個按鈕包括如下屬性:
按鈕的字符串索引,位圖索引,風格,狀態,命令ID
按鈕可以有兩種風格TBSTYLE_BUTTON和TBSTYLE_CHECK,前者像一個標准按鈕那樣響應用戶的按擊,後者響應每一次按擊,在按下和跳起兩種狀態之間切換。按鈕響應用戶的動作,給父窗口發送一個包含了該按鈕對應命令ID的命令消息。一般一個按鈕的命令ID對應一個菜單項。
工具條維護兩個列表,分別用來存放工具條按鈕使用的字符串或者位圖,列表中的位圖或者字符串從0開始編號,編號和按鈕的索引相對應。
工具條可以是Dockable(泊位)或者Floatable(漂浮)的。
工具條可以有TBSTYLE_TOOLTIPS風格,如果具有這種風格,則創建和管理一個Tooltip控制,這是一個小的彈出式窗口,用來顯示描述按鈕的文本,平時該窗口隱藏,當鼠標落到按鈕上面並停留約一秒後才彈出,在鼠標附近顯示。
由於Tooltip窗口平時是隱藏的,所以不能接收鼠標消息來決定何時顯示本窗口。這樣,接收鼠標的窗口必須把鼠標消息送給Tooltip窗口,這是通過給Tooptip窗口發送消息TTM_RELAYEVENT來實現的。
狀態欄
狀態欄類似於工具條,有自己的窗口過程,可以泊位、漂浮。不過,習慣上狀態欄都位於屏幕底部。每個狀態條分成若干格(Status bar panes),每格從0開始編號,編號作為格的索引。每一個格,如同工具條的按鈕一樣,並不是一個Windows窗口。
MFC的工具條和狀態欄類
MFC使用CToolBarCtrl、CStatusBarCtrl和CToolTipCtrl窗口類分別對工具條、狀態欄、Tooltip控制窗口進行了封裝。
但是,直接使用這些類還不是很方便。MFC提供了CToolBar、CStatusBar來處理狀態欄和工具條,CToolBar、CStatusBar功能更強大,靈活。這兩個類都派生於CControlBar。
在MFC下,建議這些控制條子窗口ID介於AFX_IDW_TOOLBARFIRST(0xE800)和AFX_IDW_CONTROLBAR_LAST(0Xe8FF)之間。這256個ID中,前32個又有其特殊性,用於MFC的打印預覽中。
CControlBar派生於CWnd類,是控制條窗口類的基類,它派生出CToolBar、CStatusBar、CDockBar、CDialogBar、COleResizeBar類。CControlBar實現了以下功能:
和父窗口(邊框窗口)的頂部或者底部或者其他邊對齊。
可以包含子條目,這些條目或者是基於HWND的子窗口,或者是基於非HWND的條目。負責分配條目數組。
支持CBRS_TOP(缺省,控制條放在頂部),CBRS_BOTTOM(放在底部),CBRS_NOALIGN(父窗口大小變化時不重新放置控制條)等幾種控制風格。
支持派生類的實現。幾個派生類有一定的共性,或者其中兩個有一定的共性,這樣CControlBar實現的函數一部分只適用於某個派生類,一部分適用於兩個或者多個派生類,還有一部分適用於所有的派生類。所謂適用,這裡指派生類直接繼承了CControlBar的實現,或者覆蓋了其實現但是建立在擴展其實現的基礎上。類似地,CControlBar的成員變量也不是為所有派生類所共同適用的。
CStatusBar和CControlBar一方面建立在CControlBar的基礎之上,另一方面以Windows的通用控制狀態欄和工具條為基礎。它們繼承了CControlBar類的特性,但是所封裝的窗口句柄是相應的Windows控制窗口的句柄,如同CFormView繼承了CSrcollView的視類特性,但是其窗口句柄是無模式對話框窗口句柄一樣。