




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、(一)工具條控制的主要功能所謂工具條就是具有位圖和分隔符組成的一組命令按鈕,位圖按鈕部分可以是下推按鈕、檢查盒按鈕、無線按 鈕等。工具條對象類派生于主窗口架框類cframewnd或cmdiframewnd,其類控制ctoolbar:gettoolbarctrl是 mfc類庫中封裝的一個(gè)成員函數(shù),允許使用類庫中提供的一般控制和附加功能,ctoolbar類控制成員控制提供了windows一般控制的所有功能,然 而,通過調(diào)用 gettoolbarctrl成員函數(shù)取得引用后,可以使工具條具有更強(qiáng)的特性。工具條的創(chuàng)建具有四個(gè)步聚:首先是建立工具條資源;然后建立工具條對象結(jié)構(gòu);其次通過調(diào)用建立函數(shù)建立工具
2、條對象并綁定;最后調(diào)用loadtoolbar調(diào)入工具條資源。另外,還可以通過直接加載位圖的方法來建立,步驟如下:首先建立工具條對象;然后通過調(diào)用建立函數(shù)建立工具條并綁定對象;其次調(diào)入包含按鈕的位圖;最后利用setbuttons 函數(shù)設(shè)置按鈕的風(fēng)格并與位圖建立聯(lián)系。其中,所有按鈕位圖均存放在一個(gè)位圖文件中,按鈕位圖的大小相同,默認(rèn)為16點(diǎn)寬、15點(diǎn)高,位圖必須從左至右存放。設(shè)置按鈕函數(shù)具有指向一組控制標(biāo)識(shí)符id的指針和索引值,用來確定每個(gè)按鈕的位置,如果存在分隔符id_separator, 那么該圖像就不存在索引值。正常情況下工具條中的按鈕都是單排從左至右排列的,可以通過setbuttoninf
3、o函數(shù)改變排序規(guī)則。 工具條中最終形成的按鈕大小相同,均為24 x 22 象素,每個(gè)按鈕只對象一幅圖像。工具條中的按鈕默認(rèn)為下推按鈕,通過設(shè)置tbbs_checkbox風(fēng)格可以實(shí)現(xiàn)檢查盒按鈕,通過調(diào)用setradio成員函數(shù)可以實(shí)現(xiàn)無線按鈕。(二)工具條控制的對象結(jié)構(gòu)1、工具條的對象結(jié)構(gòu)(1)工具條的建立方法ctoolbar toolbar 建立工具條對象結(jié)構(gòu)create 建立工具條對象并綁定工具條類ctoolbar:create 的調(diào)用格式如下:bool create( cwnd* pparentwnd, dword dwstyle = ws_child | ws_visible | cbr
4、s_top, uint nid = afx_idw_toolbar );其中參數(shù)pparentwnd用來確定指向工具條父窗口的指針;參數(shù)dwstyle用來確定工具條的風(fēng)格,其取值如下;參數(shù)nid用來確定工具條子窗口的標(biāo)識(shí)符。cbrs_top 表示工具條在框架窗口的頂部cbrs_bottom 表示工具條在框架窗口的底部cbrs_noalign 表示工具條在父窗口改變大小時(shí)不響應(yīng)cbrs_tooltips 表示工具條具有動(dòng)態(tài)提示功能cbrs_size_dynamic 表示工具條是靜態(tài)的不能改變cbrs_size_fixed 表示工具條是動(dòng)態(tài)的可以改變cbrs_floating 表示工具條是浮動(dòng)的c
5、brs_flyby 表示狀態(tài)條上顯示工具條中按鈕的信息 cbrs_hide_inplace 表示工具條隱藏除以上函數(shù)外,還包括設(shè)置按鈕和位圖的大小setsizes、設(shè)置工具條的高度setheight、調(diào)入工具條資源loadtoolbar、調(diào)入工具條按鈕位圖loadbitmap、設(shè)置工具條按鈕位圖setbitmap、設(shè)置工具條中位圖按鈕的風(fēng)格和索 引值setbuttons等控制函數(shù)。(2)工具條的類屬性工具條控制類的屬性包括取得標(biāo)識(shí)符id對象按鈕索引commandtoindex、取得索引對應(yīng)的命令 標(biāo)識(shí)符id或分隔符getitemid、取得索引對應(yīng)的矩形區(qū)域getitemrect、取得按鈕風(fēng)格
6、getbuttonstyle、設(shè)置按鈕風(fēng)格setbuttonstyle、取得按鈕的id標(biāo)識(shí)風(fēng)格圖象數(shù)getbuttoninfo、設(shè)置按鈕id 標(biāo)識(shí)風(fēng)格圖象數(shù)setbuttoninfo、取得按鈕提示文本getbuttontext、設(shè)置按鈕提示文本setbuttontext和取得工具條 直接存取控制gettoolbarctrl等。2、工具條控制的對象結(jié)構(gòu)(1)工具條控制的建立方法ctoolbarctrl &toolbarctrl 建立工具條控制對象結(jié)構(gòu)create 建立工具條控制對象并綁定工具條控制類ctoolbarctrl:create的調(diào)用格式如下:bool create( dword dws
7、tyle, const rect& rect, cwnd* pparentwnd, uint nid );其中參數(shù)dwstyle用來確定工具條控制的風(fēng)格,必須存在ws_child風(fēng)格;參數(shù)rect用來確定工具條控制的大小和位置;參數(shù)pparentwnd用來確定工具條控制的父窗口指針,不能為null;參數(shù)nid用來確定工具條控制的標(biāo)識(shí)符??梢岳脀s_child、ws_visible和ws_disabled來設(shè)置工具條窗口的風(fēng)格,但必須合理設(shè)置如下控制風(fēng)格:ccs_adjustable 允許用戶處理工具條窗口大小,如果存在工具條窗口必須處理相應(yīng)信ccs_bottom 使控制處于父窗口客戶區(qū)域底部
8、并與窗口同樣寬ccs_nodivider 禁止在控制的頂部繪制2個(gè)象素的高亮條ccs_nohilite 禁止在控制的頂部繪制1個(gè)象素的高亮條ccs_nomovey 使控制改變大小和移動(dòng)時(shí)自動(dòng)水平對齊,垂直對齊必須處理wm_size消息如果ccs_noresize風(fēng)格有效,則該風(fēng)格無效ccs_noparentalign禁止控制自動(dòng)移到父窗口頂部或底部,如果ccs_top或 ccs_bottom風(fēng)格有效,則高度調(diào)整為默認(rèn)而寬度可以改變ccs_noresize 禁止設(shè)置新的大小或無效值時(shí)使用默認(rèn)寬度和高度值,而使用建立值ccs_top 使控制自動(dòng)??吭诟复翱诳蛻魠^(qū)域頂部并與父窗口同樣寬度最后,還必須
9、利用下面的風(fēng)格來控制工具條tbstyle_tooltips 使工具條建立并管理動(dòng)態(tài)提示控制tbstyle_wrapable 使工具條控制按鈕具有多行排列格式(2)工具條控制中的數(shù)據(jù)結(jié)構(gòu)工具條控制中最常用的數(shù)據(jù)結(jié)構(gòu)為tbbutton,其具體結(jié)構(gòu)如下:typedef struct _tbbutton int ibitmap; / 基于0的位圖索引值int idcommand; / 按鈕按下時(shí)發(fā)送的命令值byte fsstate; / 按鈕的狀態(tài)byte fsstyle; / 按鈕的風(fēng)格dword dwdata; / 應(yīng)用程序定義的數(shù)據(jù)int istring; / 基于0的按鈕標(biāo)簽字符串索引值 tb
10、button;其中按鈕狀態(tài)fsstate的值如下:tbstate_checked 表示按鈕具有tbstyle_checked風(fēng)格并且被按下tbstate_enabled 表示按鈕允許接受輸入,否則變灰不接受任何輸入tbstate_hidden 表示按鈕不可見并且不接受任何輸入tbstate_indeterminate 表示按鈕是變灰的tbstate_pressed 表示按鈕正被按下tbstate_wrap 表示按鈕具有換行特性,該按鈕必須具有tbstate_enabled狀態(tài)按鈕風(fēng)格style可以是下列值的組合:tbstyle_button 表示建立標(biāo)準(zhǔn)下推按鈕tbstyle_check 表示
11、建立檢查狀態(tài)按鈕tbstyle_checkgroup表示建立檢查按鈕群tbstyle_group 表示建立按下狀態(tài)按鈕群tbstyle_sep 表示建立按鈕分隔符()工具條控制的類屬性工具條控制的類屬性必然的聯(lián)系判斷按鈕使能狀態(tài)isbuttonenabled、判斷按鈕檢查狀態(tài) isbuttonchecked、判斷按鈕按下狀態(tài)isbuttonpressed、判斷按鈕是否隱藏isbuttonhidden、判斷按鈕變灰狀態(tài) isbuttonindeterminate、設(shè)置按鈕狀態(tài)setstate、取得按鈕狀態(tài)getstate、取得按鈕有關(guān)信息getbutton、取得 按鈕總數(shù)getbuttoncou
12、nt、取得按鈕矩形區(qū)域getitemrect、設(shè)置按鈕結(jié)構(gòu)大小setbuttonstructsize、設(shè)置按鈕大 小setbuttonsize、設(shè)置按鈕位圖大小setbitmapsize、取得按鈕提示控制gettooltips、設(shè)置按鈕提示控制 settooltips等。(4)工具條控制類的操作方法工具條控制類的操作方法包括使能按鈕enablebutton、檢查按鈕checkbutton、按下 按鈕pressbutton、隱藏按鈕hidebutton、變灰按鈕indeterminate、增加按鈕addbuttons、插入按鈕 insertbutton、刪除按鈕deletebutton、取得控制
13、符id對應(yīng)的索引commandtoindex、恢復(fù)工具條狀態(tài) restorestate、保存工具條狀態(tài)savestate和重新確定工具條大小autosize等。(三)工具條控制的應(yīng)用技巧可以這樣說,工具條和上述常用控制是應(yīng)用程序中不可缺少的功能元素,它的優(yōu)劣會(huì)直接影響程序的基本功能和操作特性。所以這里將對工具條的建立技巧、狀態(tài)保存與恢復(fù)、平面特性、??课恢?、排序方法、消息映射、狀態(tài)更新、控制使用和屬性控制等方面,全面闡述工具條的使用技巧。1、工具條的建立技巧(1)普通工具條的建立方法如果應(yīng)用程序在建立時(shí)就具有工具條,則只需對工具條中的按鈕圖標(biāo)進(jìn)行簡單的增加、修改和刪除等操作就可滿足要求。如果未
14、建立或者想增加其它工具條,則應(yīng)按步驟追加建立。首先打開已建立好的基于單文檔的框架工程文件ctool并選擇insert-resource-toolbar選項(xiàng),插入工具條資源并設(shè)置資源標(biāo)識(shí)符;然后編輯工具欄中的按鈕圖標(biāo)和相應(yīng)的按鈕標(biāo)識(shí)符,并利用類向?qū)lasswizard 為按鈕消息增加command和update_command_ui兩種處理函數(shù);在資源文件中增加和修改工具條圖標(biāo)的動(dòng)態(tài)提示等內(nèi)容;打開mainfrm.h包含文件在ctoolbar m_wndmaintoolbar后增加ctoolbar m_wndtesttoolbar 等來創(chuàng)建增加的工具條對象;在mainfrm.h 中設(shè)置建立函數(shù)
15、所需的成員變量,如顏色變量為m_bcolor、動(dòng)態(tài)提示功能變量為m_btooltips 等,注意成員變量名與其獲取的參數(shù)應(yīng)完全對應(yīng)以便使用;最后在mainfrm.cpp中的oncreate()建立函數(shù)中按下述示例規(guī)則增加控制代碼,其實(shí)現(xiàn)具體步驟如下:在mainfrm.h中增加工具條對象控制和成員變量#define toolleft 18class cmainframe:public cframewnd./其它代碼public:bool m_btooltips;/工具條提示功能./其它代碼protected:/工具條控制成員變量cstatusbar m_wndstatusbar; /框架程序的狀
16、態(tài)條ctesttoolbar m_wndmaintoolbar;/框架程序的工具條ctesttoolbar m_wndtesttoolbar;/新增工具條ctesttoolbar m_wnddocktoolbar;/浮動(dòng)工具條ctesttoolbar m_wnddocknextbar;/浮動(dòng)工具條./其它代碼框架程序中工具條的控制類正常應(yīng)為ctoolbar,可以是自己設(shè)計(jì)的派生類ctesttoolbar(為筆者擴(kuò)充平面特性等功能后的新工具條控制類名)等,具體根據(jù)實(shí)際需要而定。利用cdialogbar類和cstylebar 類還可以建立擴(kuò)展類型的工具條,詳見后面工具條中控制應(yīng)用技巧,但在該文件頭
17、處必須包含如下命令:#ifndef _afxext_h_#include /直接存取ctoolbar和cstatusbar#endif在mainfrm.cpp中完善窗口建立函數(shù)int cmainframe:oncreate(lpcreatestruct lpcreatestruct) if (cframewnd:oncreate(lpcreatestruct) = -1)return -1;windowplacement wp;/保存主窗口及工具欄窗口位置狀態(tài)if (readwindowplacement(&wp)/讀取位置狀態(tài)信息setwindowplacement(&wp); /設(shè)置位置狀
18、態(tài)信息m_btooltips=(afxgetapp()-getprofileint(/讀提示功能_t(general),_t(tooltips),1)!=0); /默認(rèn)值為1m_wndmaintoolbar.setstate(toolleft,true);/設(shè)置初始狀態(tài)enabledocking(cbrs_align_any);/停靠位置,必須提前位置if (!m_wndmaintoolbar.create(this,ws_child|ws_visible|cbrs_size_dynamic|cbrs_top|(m_btooltips)?(cbrs_tooltips|cbrs_flyby):0
19、),idr_mainframe)|!m_wndmaintoolbar.loadtoolbar(idr_mainframe) /cbrs_size_dynamic為鎖定位置風(fēng)格trace0(主工具條mainframe建立失敗n);return -1; / 建立失敗處理./建立其它工具條代碼,基本相同if (!m_wndstatusbar.create(this)|!m_wndstatusbar.setindicators(indicators,sizeof(indicators)/sizeof(uint) /建立狀態(tài)條trace0(failed to create status barn);re
20、turn -1; / fail to createm_wndmaintoolbar.setwindowtext(_t(主工具欄);/設(shè)置標(biāo)題m_wndmaintoolbar.enabledocking(cbrs_align_any);/停靠位置/m_wndmaintoolbar.modifystyle(0,tbstyle_flat);/平面特性./設(shè)置其它工具條位置代碼,基本相同dockcontrolbar(&m_wndmaintoolbar,afx_idw_dockbar_top);/鎖定位置dockcontrolbarleftof(&m_wndtesttoolbar,&m_wndmaint
21、oolbar);/連接工具條dockcontrolbar(&m_wnddocktoolbar,afx_idw_dockbar_right);m_wnddocktoolbar.setcolumns(afxgetapp()-getprofileint(_t(general),_t(columns),3);/恢復(fù)列格式,默認(rèn)為3dockcontrolbarleftof(&m_wnddocknextbar,&m_wnddocktoolbar);m_wnddocknextbar.setcolumns(afxgetapp()-getprofileint(_t(general),_t(columns),3)
22、;loadbarstate(_t(general);/恢復(fù)保存的狀態(tài)和位置return 0;以上建立過程除工具條建立和資源調(diào)用函數(shù)外,還涉及到了窗口和工具條的狀態(tài)保存和恢復(fù)函數(shù)、注冊表參數(shù) 讀取函數(shù)、工具條??课恢煤瘮?shù)、工具條標(biāo)題修改函數(shù)、工具條連接函數(shù)、工具條列格式控制函數(shù)和工具條風(fēng)格修改函數(shù),其中工具條建立函數(shù)中的風(fēng)格設(shè)置很重 要,如果建立的工具條需要重新設(shè)置多行多列的排序功能,除正確設(shè)置工具條停靠位置參數(shù)外,還必須設(shè)置cbrs_size_fixed 風(fēng)格,即允許程序改變工具條窗口的尺寸,如果工具條不需要重新排序,則必須設(shè)置為cbrs_size_dynamic 風(fēng)格,否則工具欄不但不能進(jìn)行
23、重新排序和正確停靠到理想的位置,而且也無法正確保存和恢復(fù)工具條的位置和狀態(tài),這一點(diǎn)應(yīng)引起編程者高度重視。其余函數(shù)以后 分別介紹。(2)浮動(dòng)工具條的建立方法如果要建立浮動(dòng)工具條,必須使用如下工具條的控制方法:cpoint pt(getsystemmetrics(sm_cxscreen)-100,getsystemmetrics(sm_cyscreen)/3);floatcontrolbar(&m_wndpalettebar,pt);/浮動(dòng)工具條(3)多位圖工具條的建立方法如果工具條存在多幅按鈕位圖,如單色和彩色等,則必須將工具條按鈕存在在位圖資源文件中而不是工具條資源中,并如下建立:if(!m_
24、wnddocktoolbar.create(this,ws_child|ws_visible|cbrs_size_fixed|cbrs_top|cbrs_tooltips,id_palettebar)|!m_wnddocktoolbar.loadbitmap(idr_docktoolbar)|!m_wnddocktoolbar.setbuttons(docktool,sizeof(docktool)/sizeof(uint)其中docktool為按鈕ids數(shù)據(jù)結(jié)構(gòu),其定義方法如下:static uint based_code docktool= id_separator,id_style_le
25、ft,id_style_centered,id_style_right,id_style_justified,;上述建立過程中的enabledocking 函數(shù)必須放在所有工具條建立函數(shù)之前,否則可能出現(xiàn)很難發(fā)現(xiàn)的錯(cuò)誤,如特殊工具條初始位置控制等。工具條的所有特性均在上述建立函數(shù)中確定,所以其建立過程是實(shí)現(xiàn)理想工具條的關(guān)鍵環(huán)節(jié)。2、工具條狀態(tài)保存和恢復(fù)很多應(yīng)用程序中都具有保存和恢復(fù)應(yīng)用程序及其工具條等狀態(tài)的功能,即下次啟動(dòng)應(yīng)用程序后進(jìn)入上次的運(yùn)行狀態(tài),這種功能只需進(jìn)行一次界面布局便可永久保存,極大方便用戶。要正確保存和恢復(fù)應(yīng)用程序界面狀態(tài),必須對應(yīng)用程序窗口和工具條窗口等均進(jìn)行保存和恢復(fù),這需
26、要完善應(yīng)用程序的建立和關(guān)閉過程。具體步驟如下:(1)首先利用類向?qū)lasswizard為應(yīng)用程序增加窗口關(guān)閉wm_close消息處理功能onclose();(2)在mainfrm.cpp中為應(yīng)用程序狀態(tài)設(shè)置成員變量static tchar based_code szsection=_t(settings);static tchar based_code szwindowpos=_t(windowpos);static tchar szformat=_t(%u,%u,%d,%d,%d,%d,%d,%d,%d,%d);(3)編制窗口位置狀態(tài)讀取和寫入函數(shù)static bool pascal ne
27、ar readwindowplacement(lpwindowplacement pwp) /窗口位置狀態(tài)讀取函數(shù),從ini文件中cstring strbuffer=afxgetapp()-getprofilestring(szsection,szwindowpos);if (strbuffer.isempty() return false;windowplacement wp;/窗口位置數(shù)據(jù)結(jié)構(gòu)int nread=_stscanf(strbuffer,szformat,&wp.flags,&wp.showcmd,/為數(shù)據(jù)結(jié)構(gòu)讀取數(shù)值&wp.ptminposition.x,&wp.ptminp
28、osition.y,&wp.ptmaxposition.x,&wp.ptmaxposition.y,&wp.rcnormalposition.left,&wp.rcnormalposition.top,&wp.rcnormalposition.right,&wp.rcnormalposition.bottom);if (nread!=10) return false;wp.length=sizeof wp;/結(jié)構(gòu)大小*pwp=wp; /結(jié)構(gòu)指針return true;static void pascal near writewindowplacement(lpwindowplacement p
29、wp) /窗口位置狀態(tài)寫入函數(shù),寫到ini文件tchar szbuffersizeof(-32767)*8+sizeof(65535)*2;wsprintf(szbuffer,szformat,/將參數(shù)值轉(zhuǎn)換為字符串pwp-flags,pwp-showcmd,pwp-ptminposition.x,pwp-ptminposition.y,pwp-ptmaxposition.x,pwp-ptmaxposition.y,pwp-rcnormalposition.left,pwp-rcnormalposition.top,pwp-rcnormalposition.right,pwp-rcnormal
30、position.bottom);afxgetapp()-writeprofilestring(szsection,szwindowpos,szbuffer);(4)在應(yīng)用程序建立函數(shù)oncreate()中增加狀態(tài)讀取和設(shè)置功能windowplacement wp;/保存主窗口及工具條窗口位置狀態(tài)if (readwindowplacement(&wp)/讀取位置狀態(tài)信息setwindowplacement(&wp); /設(shè)置位置狀態(tài)信息(5)在應(yīng)用程序建立函數(shù)oncreate()中增加工具條狀態(tài)恢復(fù)功能m_wnddocktoolbar.setcolumns(afxgetapp()-getpro
31、fileint(_t(general),_t(columns),3);/恢復(fù)列格式,默認(rèn)為3m_wnddocknextbar.setcolumns(afxgetapp()-getprofileint(_t(general),_t(columns),3);loadbarstate(_t(general);/恢復(fù)保存的狀態(tài)和位置(6)在應(yīng)用程序關(guān)閉函數(shù)onclose()中完善狀態(tài)保存功能void cmainframe:onclose() /保存工具條等的狀態(tài)savebarstate(_t(general);/保存工具條狀態(tài)afxgetapp()-writeprofileint(_t(general
32、),/寫入列數(shù)_t(columns),m_wnddocktoolbar.getcolumns();afxgetapp()-writeprofileint(_t(general),_t(tooltips),(m_btooltips!=0);/寫入提示功能windowplacement wp;wp.length=sizeof wp;if (getwindowplacement(&wp)wp.flags=0;if (iszoomed() wp.flags|=wpf_restoretomaximized;/如果窗口被放大,則保存為最大化狀態(tài)writewindowplacement(&wp);cfram
33、ewnd:onclose();雖然savebarstate()和loadbarstate()函數(shù)保存和恢復(fù)了工具條的所有默認(rèn)位 置狀態(tài),但在實(shí)際自己實(shí)現(xiàn)的功能參數(shù)部分并不能被保存,所以應(yīng)單獨(dú)編寫這些參數(shù)的保存代碼,如工具欄的排列格式列參數(shù)值、顏色狀態(tài)標(biāo)志和是否存在動(dòng)態(tài)提示 功能標(biāo)志等,在實(shí)際編程時(shí)一定要注意。3、工具條的平面特性工具條的平面特性給人耳目一新之感,很多大型應(yīng)用程序中的工具條都采用這一特性,并取得了巨大成功。利 用vc+5中的comctl32.dll動(dòng)態(tài)鏈接庫可以實(shí)現(xiàn)平面式工具條,其主要解決問題包括:由于mfc使用風(fēng)格控制位來控制工具條的外觀,所以在建 立工具條時(shí)不能直接設(shè)置這種風(fēng)
34、格,必須在建立后利用setflatlookstyle()函數(shù)來修改;工具條控制本身也不在各級按鈕之間繪制分隔線,其另 一個(gè)任務(wù)就是截取wm_paint消息,并在相應(yīng)的位置處增加分隔線;工具條控制也不繪制左邊的把手(gripper) ,最后的任務(wù)就是調(diào)整客戶區(qū)域并繪制并繪制相應(yīng)的gripper。顯然,實(shí)際工作中需要?jiǎng)討B(tài)鏈接庫comctl32.dll支持的上述方法很不方便。盡管最簡便的方法是 利用vc+ 5中的未公開工具欄風(fēng)格tbstyle_flat,可以得到工具條的平面特性,只需在工具條建立后簡單地增加一條代碼 m_wndmaintoolbar.modifystyle(0,tbstyle_fla
35、t),但筆者經(jīng)試驗(yàn)發(fā)現(xiàn)這種方法存在兩個(gè)嚴(yán)重錯(cuò)誤:其一是所 建立的平面工具條在移動(dòng)時(shí),不能自動(dòng)清除移動(dòng)前的按鈕圖標(biāo),使工具條畫面雜亂無章;其二是當(dāng)建立的平面工具條具有浮動(dòng)特性時(shí),只要鼠標(biāo)指針移動(dòng)到浮動(dòng)工具 條上,整個(gè)應(yīng)用程序窗口就會(huì)自動(dòng)消失。所以第二種方法根本不可行。實(shí)現(xiàn)平面工具條的最好方法是在派生類中自己來完成,雖然這一過程比較復(fù)雜普通用戶很難做 到,但如果存在一個(gè)完美的平面工具條控制類,在自己的應(yīng)用程序中增加相應(yīng)控制類就是一件很容易的事了。下面是筆者實(shí)現(xiàn)完美平面工具條派生類的步驟:(1)首先利用類向?qū)lasswizard為工具條控制類派生一個(gè)新類ctesttoolbar ,并設(shè)置相應(yīng)的派生
36、類實(shí)現(xiàn)文件名。由于新類的基類無法直接選擇ctoolbar,所以在選擇新類的基類時(shí)先選擇ctoolbarctrl為基類,當(dāng)派生類 生成后再將實(shí)現(xiàn)文件中的所有ctoolbarctrl類名修改為ctoolbar控制類,并利用classwizard 為新類增加消息wm_paint、wm_ncpaint、wm_mousemove、wm_lbuttondown和wm_lbuttonup消息處理功 能函數(shù),以便實(shí)現(xiàn)新類中平面工具條的各種特性。同時(shí),要在mainfrm.cpp中增加包含文件testtoolbar.h。(2)完善派生類實(shí)現(xiàn)文件testtoolbar.h內(nèi)容class ctesttoolbar :
37、 public ctoolbar./其它代碼public:ctesttoolbar(); /新類構(gòu)造函數(shù)uint getcolumns() return m_ncolumns;/取得列數(shù)void setstate(uint nleft,bool nstated);/設(shè)置列數(shù)和狀態(tài)void ondrawborder(int index,cdc &dc,int flag);/畫邊框void oneraseborder(int index,cdc &dc);/刪除邊框void ondrawborders();/畫平面特性void ondrawsep(int index,cdc &dc);/畫分隔線v
38、oid ondrawgrapper();/畫把手./其它代碼#ifdef _debug /增加插入控制virtual void assertvalid() const;virtual void dump(cdumpcontext& dc) const;#endifprotected: /增加成員變量uint m_ncolumns; /工具欄按鈕列數(shù)uint m_nflags; /鼠標(biāo)按鍵標(biāo)志int m_nindex; /按下的按鈕號(hào)int m_nflagl; /左鍵按下標(biāo)志uint m_nstated; /工具欄狀態(tài)crect rt; /關(guān)閉按鈕矩形區(qū)域./其它代碼(3)完善派生類實(shí)現(xiàn)文件te
39、sttoolbar.cpp內(nèi)容./其它代碼#define toolleft 18#define lbuttondown 1#define lbuttonup 2./其它代碼ctesttoolbar:ctesttoolbar() /在構(gòu)造函數(shù)中初始化變量m_ncolumns=0; /工具欄按鈕列數(shù)m_cxleftborder=16; /左邊界m_cxrightborder=3; /右邊界m_cytopborder=3; /頂邊界m_cybottomborder=3;/底邊界m_nflags=0; /按鍵標(biāo)志成員變量m_nindex=0xffff; /按下的按鈕號(hào)m_nflagl=0; /左鍵按下
40、標(biāo)志m_nstated=true; /工具欄狀態(tài)./其它代碼#ifdef _debug/插入代碼完善void ctesttoolbar:assertvalid() const ctoolbar:assertvalid(); void ctesttoolbar:dump(cdumpcontext& dc) const ctoolbar:dump(dc); #endif /_debug./其它代碼雖然需要實(shí)現(xiàn)的函數(shù)比較多,但總起來說不過是取得客戶區(qū)域或窗口所有區(qū)域的文本設(shè)備、建立畫筆和繪圖函數(shù)的集合,所以這里只給出了畫按鈕凸凹邊線的函數(shù),其它函數(shù)可仿造實(shí)現(xiàn)。void ctesttoolbar:on
41、drawborder(int index,cdc &dc,int flag) /畫按鈕邊線flag=0凸=1凹crect rect;getitemrect(index,&rect);/取得客戶區(qū)域rect.right-;rect.bottom-;cpen *oldpen;uint color1,color2;if (flag=0)/兩種狀態(tài)的顏色處理color1=color_btnhilight;/按鈕高度顏色color2=color_btnshadow; /按鈕陰影顏色 else color1=color_btnshadow;color2=color_btnhilight;cpen pen1
42、(ps_solid,1,:getsyscolor(color1);cpen pen2(ps_solid,1,:getsyscolor(color2);dc.selectstockobject(null_brush);oldpen=dc.selectobject(&pen1);dc.moveto(rect.right,rect.top);/畫按鈕邊亮線dc.lineto(rect.left,rect.top);dc.lineto(rect.left,rect.bottom);dc.selectobject(&pen2); /畫按鈕邊暗線dc.moveto(rect.right,rect.top)
43、;dc.lineto(rect.right,rect.bottom);dc.lineto(rect.left,rect.bottom);/dc.selectstockobject(black_pen);/畫按鈕邊黑線/dc.moveto(rect.right+1,rect.top);/dc.lineto(rect.right+1,rect.bottom+1);/dc.lineto(rect.left,rect.bottom+1);dc.selectobject(oldpen);deleteobject(pen1);deleteobject(pen2);void ctesttoolbar:ond
44、rawborders() /實(shí)現(xiàn)平面工具條crect rect;cpoint pt;getcursorpos(&pt); /取得鼠標(biāo)指針screentoclient(&pt);/變成窗口坐標(biāo)int index;int count=getcount();/工具條按鈕總數(shù)cclientdc dc(this); /窗口客戶區(qū)域tbbutton button; /按鈕數(shù)據(jù)結(jié)構(gòu)ctoolbarctrl &toolbarctrl=gettoolbarctrl();ondrawgrapper(); /畫把手for(index=0;indexcount;index+)getitemrect(index,&re
45、ct);/取得按鈕矩形區(qū)域rect.left+;rect.top+;toolbarctrl.getbutton(index,&button);/取得按鈕信息if(button.fsstate&(tbstate_checked|tbstate_hidden)continue;if(button.fsstyle&tbstyle_sep)/畫分隔線if(m_nnew!=0) ondrawsep(index,dc); else if (m_nindex=index)|button.fsstate&tbstate_pressed)/凹按鈕oneraseborder(index,dc);/刪除按鈕邊界if
46、 (rect.ptinrect(pt) ondrawborder(index,dc,1);/繪下凹按鈕else ondrawborder(index,dc,0);/繪凸出按鈕 else if (!rect.ptinrect(pt)|m_nflags=lbuttonup|!(button.fsstate&tbstate_enabled)oneraseborder(index,dc);/刪除按鈕邊界 else if (m_nflags!=lbuttondown)/凸按鈕oneraseborder(index,dc);/刪除按鈕邊界if(m_nflagl=0)/鼠標(biāo)按下防止再次重新出現(xiàn)凸起ondra
47、wborder(index,dc,0);/繪按鈕邊界m_nflags=0;/按下后移動(dòng)后不正常凸起releasedc(&dc);void ctesttoolbar:onpaint() /完善重繪按鈕功能ctoolbar:onpaint();ondrawborders();/處理所有按鈕邊界void ctesttoolbar:onlbuttondown(uint nflags, cpoint point) /完善鼠標(biāo)左鍵按下功能m_nflags=lbuttondown;/設(shè)置鼠標(biāo)按鍵標(biāo)志m_nflagl=1;ctoolbar:onlbuttondown(nflags,point);/調(diào)原函數(shù)in
48、t index;int count=getcount();/工具欄按鈕總數(shù)tbbutton button;ctoolbarctrl &toolbarctrl=gettoolbarctrl();for(index=0;indexcount;index+)toolbarctrl.getbutton(index,&button);/取得按鈕信息if (button.fsstate&tbstate_pressed) /記錄按下按鈕號(hào)m_nindex=index;void ctesttoolbar:onlbuttonup(uint nflags, cpoint point) /完善鼠標(biāo)釋放功能m_nfl
49、ags=lbuttonup;/設(shè)置鼠標(biāo)按鍵標(biāo)志m_nflagl=0;ctoolbar:onlbuttonup(nflags, point);/調(diào)原函數(shù)crect rect;cpoint pt;getcursorpos(&pt);/取得光標(biāo)位置screentoclient(&pt);/變成窗口坐標(biāo)cclientdc dc(this);/窗口客戶區(qū)域if (m_nindex!=0xffff)/判斷按下按鈕執(zhí)行功能時(shí)仍下凹getitemrect(m_nindex,&rect);/取得矩形區(qū)域rect.left+;rect.top+;oneraseborder(m_nindex,dc);/刪除按鈕邊界
50、if (rect.ptinrect(pt) ondrawborder(m_nindex,dc,1);/繪下凹按鈕m_nindex=0xffff;void ctesttoolbar:onmousemove(uint nflags, cpoint point) /完善鼠標(biāo)移動(dòng)功能ctoolbar:onmousemove(nflags, point);int index;int count=getcount();/工具欄按鈕總數(shù)crect rect;if (nflags&mk_lbutton) m_nflagl=1;/防止再次重新出現(xiàn)凸起else m_nflagl=0;ondrawborders()
51、;/繪制所有按鈕for(index=0;indexcount;index+)/判斷鼠標(biāo)在哪個(gè)按鈕上getitemrect(index,&rect);rect.left+;rect.top+;if (rect.ptinrect(point)&/取得移動(dòng)過程中輸入焦點(diǎn)!(getbuttonstyle(index)&tbbs_separator)setcapture();/設(shè)置鼠標(biāo)輸入焦點(diǎn)return;if (nflags&mk_lbutton)/防止移出而失去輸入焦點(diǎn)setcapture();/設(shè)置鼠標(biāo)輸入焦點(diǎn)m_nflagl=1;return; else m_nflagl=0;releaseca
52、pture();return;void ctesttoolbar:onncpaint() /背景重畫函數(shù)ctoolbar:onncpaint();ondrawgrapper();void ctesttoolbar:setstate(uint nleft,bool nstated) /狀態(tài)設(shè)置函數(shù)m_cxleftborder=nleft;/左邊界m_nstated=nstated; /工具欄狀態(tài)(4)有關(guān)派生類函數(shù)幾點(diǎn)說明畫按鈕凹凸邊線函數(shù)ondrawborder()正常工具條中的按鈕具有黑色的邊線,使按鈕凹凸感更強(qiáng)烈,但在平面工具條中的這種按鈕并不美觀,所以應(yīng) 省略黑色邊線部分,并且必須使用系統(tǒng)的api函數(shù)getsyscolor函數(shù)來取得邊線顏色,以便系統(tǒng)改變顏色時(shí)按鈕邊線也隨之改變,同時(shí)由于凹凸按鈕邊 線畫法完全相同,只是顏色相反,所以兩者完全可由這個(gè)函數(shù)來實(shí)現(xiàn);畫分隔線函數(shù)ondrawsep()畫分隔線時(shí)應(yīng)遍歷每個(gè)按鈕,來取得分隔線的位置,并且利用客戶區(qū)域文本描述表就可實(shí)現(xiàn),只需畫亮暗兩條線就可實(shí)現(xiàn);畫把手函數(shù)ondrawgripper()畫把手時(shí)應(yīng)使用整個(gè)窗口的文本描述表,因?yàn)榭蛻魠^(qū)域描述表不能在窗口的非客戶區(qū)域畫線,而且還必須判斷按鈕是否以多行多列方式排列,根據(jù)不同的排列方式畫水平或垂直把手,同時(shí)還要實(shí)現(xiàn)畫關(guān)閉按鈕功能,以和vc+5 等界面工具欄功
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鄉(xiāng)鎮(zhèn)船舶安全知識(shí)培訓(xùn)課件會(huì)
- 志愿者服務(wù)管理流程及考核辦法
- 工廠設(shè)備故障分析及維修流程報(bào)告
- 二次函數(shù)性質(zhì)教學(xué)課件
- 礦業(yè)并購法律規(guī)制-洞察及研究
- 教育內(nèi)容質(zhì)量與合規(guī)性審核服務(wù)創(chuàng)新創(chuàng)業(yè)項(xiàng)目商業(yè)計(jì)劃書
- 養(yǎng)老照護(hù)服務(wù)創(chuàng)新創(chuàng)業(yè)項(xiàng)目商業(yè)計(jì)劃書
- 小學(xué)課件古詩詞教學(xué)
- 基于同態(tài)加密的隱私數(shù)據(jù)挖掘-洞察及研究
- 葉子拼貼畫教學(xué)課件
- 石油監(jiān)督考試試題及答案
- 2025年花卉栽培技術(shù)人員花卉栽培技術(shù)知識(shí)考核試卷及答案
- 學(xué)堂在線 高技術(shù)與現(xiàn)代局部戰(zhàn)爭 章節(jié)測試答案
- YY/T 1846-2022內(nèi)窺鏡手術(shù)器械重復(fù)性使用腹部沖吸器
- GB/T 4056-2019絕緣子串元件的球窩聯(lián)接尺寸
- GB 15892-2020生活飲用水用聚氯化鋁
- 全科醫(yī)學(xué)科學(xué)研究課件
- DB32 3747-2020 半導(dǎo)體行業(yè)污染物排放標(biāo)準(zhǔn)
- 體育場館使用登記表
- Inspector-1000使用培訓(xùn)教材ppt課件
- 《鋼琴基礎(chǔ)》課程教學(xué)大綱
評論
0/150
提交評論