工具欄設(shè)計(jì)及與菜單命令的聯(lián)動(dòng)
工具欄上通常有一系列的工具按鈕,所有的按鈕圖像都具有相同的尺寸,一般是15像素高,16像素寬,借助它們可以提高用戶的工作效率,并且將常用的菜單命令也放在工具欄上,它們實(shí)際是命令不同的用戶方式。
1. 添加并設(shè)計(jì)工具欄
(1) 將解決方案資源管理器窗口切換到"資源視圖",展開后右擊Toolbar,在彈出的快捷菜單中單擊"插入Toolbar"。這樣,一個(gè)工具欄資源就添加到項(xiàng)目中,默認(rèn)的標(biāo)識(shí)為IDR_TOOLBAR1。
(2) 添加并設(shè)計(jì)2個(gè)工具按鈕,結(jié)果如圖10所示。

圖11 工具按鈕的設(shè)計(jì)
由于其編輯操作與Windows的畫圖相類似,故這里僅列出操作的一些技巧:
① 單擊空白按鈕后就可以編輯其圖像,同時(shí)系統(tǒng)在隨后的位置自動(dòng)添加一個(gè)空白按鈕。
?、?用鼠標(biāo)可以將一個(gè)按鈕拖放到工具欄上的其他位置上。若拖動(dòng)時(shí)按下Ctrl鍵,則復(fù)制一個(gè)工具按鈕。若將工具按鈕拖出工具欄,則該工具按鈕被刪除。
?、?按Delete鍵可以將當(dāng)前工具按鈕的圖像用背景色填充。
?、?在工具按鈕之間添加間隔時(shí),可按不同情況來操作。若工具按扭前沒有任何間隔,拖動(dòng)該工具按鈕向右直到它覆蓋相鄰工具按鈕的一半以上后,釋放鼠標(biāo)鍵,則此工具按鈕前出現(xiàn)間隔。若工具按鈕前面有間隔而后面沒有間隔,拖動(dòng)該工具按鈕向左直到它的左邊界接觸到它前面的工具按鈕為止,釋放鼠標(biāo)鍵,則此工具按鈕后面將出現(xiàn)間隔。
⑤ 若工具按鈕前后均有間隔,拖動(dòng)該工具按鈕向右直到它接觸相鄰工具按鈕,則此工具按鈕前的間隔保留,工具按鈕后的間隔消失。反之,若拖動(dòng)該工具按鈕向左直到它接觸相鄰的前一個(gè)工具按鈕,則此工具按鈕前面的間隔消失,后面的間隔仍保留。
⑥ 刪除工具按鈕間隔時(shí),只要將間隔一端的工具按鈕拖向間隔另一端的工具按鈕,直到與另一個(gè)按鈕重疊一半以上即可。
(3) 單擊第一個(gè)工具按鈕,在工具按鈕的屬性窗口中,將其ID號(hào)選擇為ID_FORMAT_TXTFONT,這是將工具按鈕與菜單命令聯(lián)動(dòng)的關(guān)鍵。將其Prompt屬性內(nèi)容改成"改變顯示的字體\n字體"。Prompt屬性是用來指定工具按鈕的提示文本。例如若為"改變顯示的字體\n字體"時(shí),則表示當(dāng)鼠標(biāo)移至該工具按鈕時(shí),在狀態(tài)欄中就會(huì)顯示"改變顯示的字體",稍等片刻后還會(huì)彈出一個(gè)小的提示窗口,顯示出"字體"字樣。注意:提示窗口顯示的內(nèi)容是Prompt屬性字符串中"\n"后的內(nèi)容。
(4) 將第二個(gè)工具按鈕的ID號(hào)選擇為ID_FORMAT_TXTCOLOR,Prompt設(shè)為"改變文本的顯示顏色\n顏色"。
2. 工具欄代碼的實(shí)現(xiàn)
(1) 在CMainFrame類中添加一個(gè)成員變量m_wndFormatBar,變量類型為CToolBar。CToolBar類封裝了工具欄的操作。
(2) 在CMainFrame::OnCreate()函數(shù)中添加工具欄的創(chuàng)建代碼,如圖11所示的加框部分。

圖12 添加的工具欄的創(chuàng)建代碼
程序說明:
?、?主框架類CMainFrame用來負(fù)責(zé)窗口的菜單欄、工具欄和狀態(tài)欄的創(chuàng)建和更新工作。因此我們將工具欄的創(chuàng)建代碼添加在CMainFrame的OnCreate()函數(shù)中。
② CreateEx()是CToolBar類的成員函數(shù),用來創(chuàng)建一個(gè)工具欄對(duì)象。
?、?if語(yǔ)句的LoadToolBar()函數(shù)是用來裝載工具欄資源。若CreateEx()或LoadToolBar()的返回值為0,即調(diào)用不成功,則顯示診斷信息"未能創(chuàng)建工具欄"。TRACE0是一個(gè)用于程序調(diào)試的跟蹤宏。OnCreate()函數(shù)返回-1時(shí),主框架窗口被清除。
?、?應(yīng)用程序中的工具欄一般具有停靠或浮動(dòng)特性,m_wndFormatBar.EnableDocking()使得m_wndFormatBar對(duì)象可以停靠,CBRS_ALIGN_ANY表示可以??吭诖翱诘娜我贿?。 EnableDocking(CBRS_ALIGN_ANY)是調(diào)用的是CFrameWnd類的成員函數(shù),用來讓工具欄或其他控制條在主框架窗口可以進(jìn)行停靠操作。DockControlBar()也是CFrameWnd類的成員函數(shù),用來將指定的工具欄或其他控制條進(jìn)行停靠。
?、?AFX_IDW_TOOLBAR是系統(tǒng)內(nèi)部的工具欄子窗口標(biāo)識(shí),并將AFX_IDW_TOOLBAR+1的值表示默認(rèn)的狀態(tài)欄子窗口標(biāo)識(shí)。如果在創(chuàng)建新的工具欄時(shí)沒有指定相應(yīng)的子窗口標(biāo)識(shí),則會(huì)使用默認(rèn)的AFX_IDW_TOOLBAR。這樣,當(dāng)打開"視圖"菜單時(shí),單擊"工具欄"菜單時(shí),顯示或隱藏的工具欄不是原來的工具欄而是新添加的工具欄。因此,我們需要重新指定工具欄子窗口的標(biāo)識(shí),并使其值等于AFX_IDW_TOOLBAR + 10。
(3) 運(yùn)行程序,可以看到新添加的工具欄,如圖12所示,左圖是工具欄開始的??壳闆r,右圖是工具欄浮動(dòng)的情形。


圖13 新工具欄的??亢透?dòng)
需要說明的是,上述工具按鈕是與菜單命令聯(lián)動(dòng),因此無需進(jìn)行工具按鈕命令的消息映射,因?yàn)樵撁钜言诓藛尾僮髟撁钜延成溥^。若是單獨(dú)一個(gè)工具按鈕,則需要對(duì)該工具按鈕進(jìn)行命令消息的映射,否則按鈕是灰顯的。工具按鈕的命令消息映射方法與菜單命令相同。
|