CToolBar的使用总结_第1页
CToolBar的使用总结_第2页
CToolBar的使用总结_第3页
CToolBar的使用总结_第4页
CToolBar的使用总结_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、(一)工具条控制的主要功能所谓工具条就是具有位图和分隔符组成的一组命令按钮,位图按钮部分可以是下推按钮、检查盒按钮、无线按 钮等。工具条对象类派生于主窗口架框类cframewnd或cmdiframewnd,其类控制ctoolbar:gettoolbarctrl是 mfc类库中封装的一个成员函数,允许使用类库中提供的一般控制和附加功能,ctoolbar类控制成员控制提供了windows一般控制的所有功能,然 而,通过调用 gettoolbarctrl成员函数取得引用后,可以使工具条具有更强的特性。工具条的创建具有四个步聚:首先是建立工具条资源;然后建立工具条对象结构;其次通过调用建立函数建立工具

2、条对象并绑定;最后调用loadtoolbar调入工具条资源。另外,还可以通过直接加载位图的方法来建立,步骤如下:首先建立工具条对象;然后通过调用建立函数建立工具条并绑定对象;其次调入包含按钮的位图;最后利用setbuttons 函数设置按钮的风格并与位图建立联系。其中,所有按钮位图均存放在一个位图文件中,按钮位图的大小相同,默认为16点宽、15点高,位图必须从左至右存放。设置按钮函数具有指向一组控制标识符id的指针和索引值,用来确定每个按钮的位置,如果存在分隔符id_separator, 那么该图像就不存在索引值。正常情况下工具条中的按钮都是单排从左至右排列的,可以通过setbuttoninf

3、o函数改变排序规则。 工具条中最终形成的按钮大小相同,均为24 x 22 象素,每个按钮只对象一幅图像。工具条中的按钮默认为下推按钮,通过设置tbbs_checkbox风格可以实现检查盒按钮,通过调用setradio成员函数可以实现无线按钮。(二)工具条控制的对象结构1、工具条的对象结构(1)工具条的建立方法ctoolbar toolbar 建立工具条对象结构create 建立工具条对象并绑定工具条类ctoolbar:create 的调用格式如下:bool create( cwnd* pparentwnd, dword dwstyle = ws_child | ws_visible | cbr

4、s_top, uint nid = afx_idw_toolbar );其中参数pparentwnd用来确定指向工具条父窗口的指针;参数dwstyle用来确定工具条的风格,其取值如下;参数nid用来确定工具条子窗口的标识符。cbrs_top 表示工具条在框架窗口的顶部cbrs_bottom 表示工具条在框架窗口的底部cbrs_noalign 表示工具条在父窗口改变大小时不响应cbrs_tooltips 表示工具条具有动态提示功能cbrs_size_dynamic 表示工具条是静态的不能改变cbrs_size_fixed 表示工具条是动态的可以改变cbrs_floating 表示工具条是浮动的c

5、brs_flyby 表示状态条上显示工具条中按钮的信息 cbrs_hide_inplace 表示工具条隐藏除以上函数外,还包括设置按钮和位图的大小setsizes、设置工具条的高度setheight、调入工具条资源loadtoolbar、调入工具条按钮位图loadbitmap、设置工具条按钮位图setbitmap、设置工具条中位图按钮的风格和索 引值setbuttons等控制函数。(2)工具条的类属性工具条控制类的属性包括取得标识符id对象按钮索引commandtoindex、取得索引对应的命令 标识符id或分隔符getitemid、取得索引对应的矩形区域getitemrect、取得按钮风格

6、getbuttonstyle、设置按钮风格setbuttonstyle、取得按钮的id标识风格图象数getbuttoninfo、设置按钮id 标识风格图象数setbuttoninfo、取得按钮提示文本getbuttontext、设置按钮提示文本setbuttontext和取得工具条 直接存取控制gettoolbarctrl等。2、工具条控制的对象结构(1)工具条控制的建立方法ctoolbarctrl &toolbarctrl 建立工具条控制对象结构create 建立工具条控制对象并绑定工具条控制类ctoolbarctrl:create的调用格式如下:bool create( dword dws

7、tyle, const rect& rect, cwnd* pparentwnd, uint nid );其中参数dwstyle用来确定工具条控制的风格,必须存在ws_child风格;参数rect用来确定工具条控制的大小和位置;参数pparentwnd用来确定工具条控制的父窗口指针,不能为null;参数nid用来确定工具条控制的标识符。可以利用ws_child、ws_visible和ws_disabled来设置工具条窗口的风格,但必须合理设置如下控制风格:ccs_adjustable 允许用户处理工具条窗口大小,如果存在工具条窗口必须处理相应信ccs_bottom 使控制处于父窗口客户区域底部

8、并与窗口同样宽ccs_nodivider 禁止在控制的顶部绘制2个象素的高亮条ccs_nohilite 禁止在控制的顶部绘制1个象素的高亮条ccs_nomovey 使控制改变大小和移动时自动水平对齐,垂直对齐必须处理wm_size消息如果ccs_noresize风格有效,则该风格无效ccs_noparentalign禁止控制自动移到父窗口顶部或底部,如果ccs_top或 ccs_bottom风格有效,则高度调整为默认而宽度可以改变ccs_noresize 禁止设置新的大小或无效值时使用默认宽度和高度值,而使用建立值ccs_top 使控制自动停靠在父窗口客户区域顶部并与父窗口同样宽度最后,还必须

9、利用下面的风格来控制工具条tbstyle_tooltips 使工具条建立并管理动态提示控制tbstyle_wrapable 使工具条控制按钮具有多行排列格式(2)工具条控制中的数据结构工具条控制中最常用的数据结构为tbbutton,其具体结构如下:typedef struct _tbbutton int ibitmap; / 基于0的位图索引值int idcommand; / 按钮按下时发送的命令值byte fsstate; / 按钮的状态byte fsstyle; / 按钮的风格dword dwdata; / 应用程序定义的数据int istring; / 基于0的按钮标签字符串索引值 tb

10、button;其中按钮状态fsstate的值如下:tbstate_checked 表示按钮具有tbstyle_checked风格并且被按下tbstate_enabled 表示按钮允许接受输入,否则变灰不接受任何输入tbstate_hidden 表示按钮不可见并且不接受任何输入tbstate_indeterminate 表示按钮是变灰的tbstate_pressed 表示按钮正被按下tbstate_wrap 表示按钮具有换行特性,该按钮必须具有tbstate_enabled状态按钮风格style可以是下列值的组合:tbstyle_button 表示建立标准下推按钮tbstyle_check 表示

11、建立检查状态按钮tbstyle_checkgroup表示建立检查按钮群tbstyle_group 表示建立按下状态按钮群tbstyle_sep 表示建立按钮分隔符()工具条控制的类属性工具条控制的类属性必然的联系判断按钮使能状态isbuttonenabled、判断按钮检查状态 isbuttonchecked、判断按钮按下状态isbuttonpressed、判断按钮是否隐藏isbuttonhidden、判断按钮变灰状态 isbuttonindeterminate、设置按钮状态setstate、取得按钮状态getstate、取得按钮有关信息getbutton、取得 按钮总数getbuttoncou

12、nt、取得按钮矩形区域getitemrect、设置按钮结构大小setbuttonstructsize、设置按钮大 小setbuttonsize、设置按钮位图大小setbitmapsize、取得按钮提示控制gettooltips、设置按钮提示控制 settooltips等。(4)工具条控制类的操作方法工具条控制类的操作方法包括使能按钮enablebutton、检查按钮checkbutton、按下 按钮pressbutton、隐藏按钮hidebutton、变灰按钮indeterminate、增加按钮addbuttons、插入按钮 insertbutton、删除按钮deletebutton、取得控制

13、符id对应的索引commandtoindex、恢复工具条状态 restorestate、保存工具条状态savestate和重新确定工具条大小autosize等。(三)工具条控制的应用技巧可以这样说,工具条和上述常用控制是应用程序中不可缺少的功能元素,它的优劣会直接影响程序的基本功能和操作特性。所以这里将对工具条的建立技巧、状态保存与恢复、平面特性、停靠位置、排序方法、消息映射、状态更新、控制使用和属性控制等方面,全面阐述工具条的使用技巧。1、工具条的建立技巧(1)普通工具条的建立方法如果应用程序在建立时就具有工具条,则只需对工具条中的按钮图标进行简单的增加、修改和删除等操作就可满足要求。如果未

14、建立或者想增加其它工具条,则应按步骤追加建立。首先打开已建立好的基于单文档的框架工程文件ctool并选择insert-resource-toolbar选项,插入工具条资源并设置资源标识符;然后编辑工具栏中的按钮图标和相应的按钮标识符,并利用类向导classwizard 为按钮消息增加command和update_command_ui两种处理函数;在资源文件中增加和修改工具条图标的动态提示等内容;打开mainfrm.h包含文件在ctoolbar m_wndmaintoolbar后增加ctoolbar m_wndtesttoolbar 等来创建增加的工具条对象;在mainfrm.h 中设置建立函数

15、所需的成员变量,如颜色变量为m_bcolor、动态提示功能变量为m_btooltips 等,注意成员变量名与其获取的参数应完全对应以便使用;最后在mainfrm.cpp中的oncreate()建立函数中按下述示例规则增加控制代码,其实现具体步骤如下:在mainfrm.h中增加工具条对象控制和成员变量#define toolleft 18class cmainframe:public cframewnd./其它代码public:bool m_btooltips;/工具条提示功能./其它代码protected:/工具条控制成员变量cstatusbar m_wndstatusbar; /框架程序的状

16、态条ctesttoolbar m_wndmaintoolbar;/框架程序的工具条ctesttoolbar m_wndtesttoolbar;/新增工具条ctesttoolbar m_wnddocktoolbar;/浮动工具条ctesttoolbar m_wnddocknextbar;/浮动工具条./其它代码框架程序中工具条的控制类正常应为ctoolbar,可以是自己设计的派生类ctesttoolbar(为笔者扩充平面特性等功能后的新工具条控制类名)等,具体根据实际需要而定。利用cdialogbar类和cstylebar 类还可以建立扩展类型的工具条,详见后面工具条中控制应用技巧,但在该文件头

17、处必须包含如下命令:#ifndef _afxext_h_#include /直接存取ctoolbar和cstatusbar#endif在mainfrm.cpp中完善窗口建立函数int cmainframe:oncreate(lpcreatestruct lpcreatestruct) if (cframewnd:oncreate(lpcreatestruct) = -1)return -1;windowplacement wp;/保存主窗口及工具栏窗口位置状态if (readwindowplacement(&wp)/读取位置状态信息setwindowplacement(&wp); /设置位置状

18、态信息m_btooltips=(afxgetapp()-getprofileint(/读提示功能_t(general),_t(tooltips),1)!=0); /默认值为1m_wndmaintoolbar.setstate(toolleft,true);/设置初始状态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为锁定位置风格trace0(主工具条mainframe建立失败n);return -1; / 建立失败处理./建立其它工具条代码,基本相同if (!m_wndstatusbar.create(this)|!m_wndstatusbar.setindicators(indicators,sizeof(indicators)/sizeof(uint) /建立状态条trace0(failed to create status barn);re

20、turn -1; / fail to createm_wndmaintoolbar.setwindowtext(_t(主工具栏);/设置标题m_wndmaintoolbar.enabledocking(cbrs_align_any);/停靠位置/m_wndmaintoolbar.modifystyle(0,tbstyle_flat);/平面特性./设置其它工具条位置代码,基本相同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);/恢复列格式,默认为3dockcontrolbarleftof(&m_wnddocknextbar,&m_wnddocktoolbar);m_wnddocknextbar.setcolumns(afxgetapp()-getprofileint(_t(general),_t(columns),3)

22、;loadbarstate(_t(general);/恢复保存的状态和位置return 0;以上建立过程除工具条建立和资源调用函数外,还涉及到了窗口和工具条的状态保存和恢复函数、注册表参数 读取函数、工具条停靠位置函数、工具条标题修改函数、工具条连接函数、工具条列格式控制函数和工具条风格修改函数,其中工具条建立函数中的风格设置很重 要,如果建立的工具条需要重新设置多行多列的排序功能,除正确设置工具条停靠位置参数外,还必须设置cbrs_size_fixed 风格,即允许程序改变工具条窗口的尺寸,如果工具条不需要重新排序,则必须设置为cbrs_size_dynamic 风格,否则工具栏不但不能进行

23、重新排序和正确停靠到理想的位置,而且也无法正确保存和恢复工具条的位置和状态,这一点应引起编程者高度重视。其余函数以后 分别介绍。(2)浮动工具条的建立方法如果要建立浮动工具条,必须使用如下工具条的控制方法:cpoint pt(getsystemmetrics(sm_cxscreen)-100,getsystemmetrics(sm_cyscreen)/3);floatcontrolbar(&m_wndpalettebar,pt);/浮动工具条(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数据结构,其定义方法如下:static uint based_code docktool= id_separator,id_style_le

25、ft,id_style_centered,id_style_right,id_style_justified,;上述建立过程中的enabledocking 函数必须放在所有工具条建立函数之前,否则可能出现很难发现的错误,如特殊工具条初始位置控制等。工具条的所有特性均在上述建立函数中确定,所以其建立过程是实现理想工具条的关键环节。2、工具条状态保存和恢复很多应用程序中都具有保存和恢复应用程序及其工具条等状态的功能,即下次启动应用程序后进入上次的运行状态,这种功能只需进行一次界面布局便可永久保存,极大方便用户。要正确保存和恢复应用程序界面状态,必须对应用程序窗口和工具条窗口等均进行保存和恢复,这需

26、要完善应用程序的建立和关闭过程。具体步骤如下:(1)首先利用类向导classwizard为应用程序增加窗口关闭wm_close消息处理功能onclose();(2)在mainfrm.cpp中为应用程序状态设置成员变量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)编制窗口位置状态读取和写入函数static bool pascal ne

27、ar readwindowplacement(lpwindowplacement pwp) /窗口位置状态读取函数,从ini文件中cstring strbuffer=afxgetapp()-getprofilestring(szsection,szwindowpos);if (strbuffer.isempty() return false;windowplacement wp;/窗口位置数据结构int nread=_stscanf(strbuffer,szformat,&wp.flags,&wp.showcmd,/为数据结构读取数值&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;/结构大小*pwp=wp; /结构指针return true;static void pascal near writewindowplacement(lpwindowplacement p

29、wp) /窗口位置状态写入函数,写到ini文件tchar szbuffersizeof(-32767)*8+sizeof(65535)*2;wsprintf(szbuffer,szformat,/将参数值转换为字符串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)在应用程序建立函数oncreate()中增加状态读取和设置功能windowplacement wp;/保存主窗口及工具条窗口位置状态if (readwindowplacement(&wp)/读取位置状态信息setwindowplacement(&wp); /设置位置状态信息(5)在应用程序建立函数oncreate()中增加工具条状态恢复功能m_wnddocktoolbar.setcolumns(afxgetapp()-getpro

31、fileint(_t(general),_t(columns),3);/恢复列格式,默认为3m_wnddocknextbar.setcolumns(afxgetapp()-getprofileint(_t(general),_t(columns),3);loadbarstate(_t(general);/恢复保存的状态和位置(6)在应用程序关闭函数onclose()中完善状态保存功能void cmainframe:onclose() /保存工具条等的状态savebarstate(_t(general);/保存工具条状态afxgetapp()-writeprofileint(_t(general

32、),/写入列数_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;/如果窗口被放大,则保存为最大化状态writewindowplacement(&wp);cfram

33、ewnd:onclose();虽然savebarstate()和loadbarstate()函数保存和恢复了工具条的所有默认位 置状态,但在实际自己实现的功能参数部分并不能被保存,所以应单独编写这些参数的保存代码,如工具栏的排列格式列参数值、颜色状态标志和是否存在动态提示 功能标志等,在实际编程时一定要注意。3、工具条的平面特性工具条的平面特性给人耳目一新之感,很多大型应用程序中的工具条都采用这一特性,并取得了巨大成功。利 用vc+5中的comctl32.dll动态链接库可以实现平面式工具条,其主要解决问题包括:由于mfc使用风格控制位来控制工具条的外观,所以在建 立工具条时不能直接设置这种风

34、格,必须在建立后利用setflatlookstyle()函数来修改;工具条控制本身也不在各级按钮之间绘制分隔线,其另 一个任务就是截取wm_paint消息,并在相应的位置处增加分隔线;工具条控制也不绘制左边的把手(gripper) ,最后的任务就是调整客户区域并绘制并绘制相应的gripper。显然,实际工作中需要动态链接库comctl32.dll支持的上述方法很不方便。尽管最简便的方法是 利用vc+ 5中的未公开工具栏风格tbstyle_flat,可以得到工具条的平面特性,只需在工具条建立后简单地增加一条代码 m_wndmaintoolbar.modifystyle(0,tbstyle_fla

35、t),但笔者经试验发现这种方法存在两个严重错误:其一是所 建立的平面工具条在移动时,不能自动清除移动前的按钮图标,使工具条画面杂乱无章;其二是当建立的平面工具条具有浮动特性时,只要鼠标指针移动到浮动工具 条上,整个应用程序窗口就会自动消失。所以第二种方法根本不可行。实现平面工具条的最好方法是在派生类中自己来完成,虽然这一过程比较复杂普通用户很难做 到,但如果存在一个完美的平面工具条控制类,在自己的应用程序中增加相应控制类就是一件很容易的事了。下面是笔者实现完美平面工具条派生类的步骤:(1)首先利用类向导classwizard为工具条控制类派生一个新类ctesttoolbar ,并设置相应的派生

36、类实现文件名。由于新类的基类无法直接选择ctoolbar,所以在选择新类的基类时先选择ctoolbarctrl为基类,当派生类 生成后再将实现文件中的所有ctoolbarctrl类名修改为ctoolbar控制类,并利用classwizard 为新类增加消息wm_paint、wm_ncpaint、wm_mousemove、wm_lbuttondown和wm_lbuttonup消息处理功 能函数,以便实现新类中平面工具条的各种特性。同时,要在mainfrm.cpp中增加包含文件testtoolbar.h。(2)完善派生类实现文件testtoolbar.h内容class ctesttoolbar :

37、 public ctoolbar./其它代码public:ctesttoolbar(); /新类构造函数uint getcolumns() return m_ncolumns;/取得列数void setstate(uint nleft,bool nstated);/设置列数和状态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; /工具栏按钮列数uint m_nflags; /鼠标按键标志int m_nindex; /按下的按钮号int m_nflagl; /左键按下标志uint m_nstated; /工具栏状态crect rt; /关闭按钮矩形区域./其它代码(3)完善派生类实现文件te

39、sttoolbar.cpp内容./其它代码#define toolleft 18#define lbuttondown 1#define lbuttonup 2./其它代码ctesttoolbar:ctesttoolbar() /在构造函数中初始化变量m_ncolumns=0; /工具栏按钮列数m_cxleftborder=16; /左边界m_cxrightborder=3; /右边界m_cytopborder=3; /顶边界m_cybottomborder=3;/底边界m_nflags=0; /按键标志成员变量m_nindex=0xffff; /按下的按钮号m_nflagl=0; /左键按下

40、标志m_nstated=true; /工具栏状态./其它代码#ifdef _debug/插入代码完善void ctesttoolbar:assertvalid() const ctoolbar:assertvalid(); void ctesttoolbar:dump(cdumpcontext& dc) const ctoolbar:dump(dc); #endif /_debug./其它代码虽然需要实现的函数比较多,但总起来说不过是取得客户区域或窗口所有区域的文本设备、建立画笔和绘图函数的集合,所以这里只给出了画按钮凸凹边线的函数,其它函数可仿造实现。void ctesttoolbar:on

41、drawborder(int index,cdc &dc,int flag) /画按钮边线flag=0凸=1凹crect rect;getitemrect(index,&rect);/取得客户区域rect.right-;rect.bottom-;cpen *oldpen;uint color1,color2;if (flag=0)/两种状态的颜色处理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() /实现平面工具条crect rect;cpoint pt;getcursorpos(&pt); /取得鼠标指针screentoclient(&pt);/变成窗口坐标int index;int count=getcount();/工具条按钮总数cclientdc dc(this); /窗口客户区域tbbutton button; /按钮数据结构ctoolbarctrl &toolbarctrl=gettoolbarctrl();ondrawgrapper(); /画把手for(index=0;indexcount;index+)getitemrect(index,&re

45、ct);/取得按钮矩形区域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)/鼠标按下防止再次重新出现凸起ondra

47、wborder(index,dc,0);/绘按钮边界m_nflags=0;/按下后移动后不正常凸起releasedc(&dc);void ctesttoolbar:onpaint() /完善重绘按钮功能ctoolbar:onpaint();ondrawborders();/处理所有按钮边界void ctesttoolbar:onlbuttondown(uint nflags, cpoint point) /完善鼠标左键按下功能m_nflags=lbuttondown;/设置鼠标按键标志m_nflagl=1;ctoolbar:onlbuttondown(nflags,point);/调原函数in

48、t index;int count=getcount();/工具栏按钮总数tbbutton button;ctoolbarctrl &toolbarctrl=gettoolbarctrl();for(index=0;indexcount;index+)toolbarctrl.getbutton(index,&button);/取得按钮信息if (button.fsstate&tbstate_pressed) /记录按下按钮号m_nindex=index;void ctesttoolbar:onlbuttonup(uint nflags, cpoint point) /完善鼠标释放功能m_nfl

49、ags=lbuttonup;/设置鼠标按键标志m_nflagl=0;ctoolbar:onlbuttonup(nflags, point);/调原函数crect rect;cpoint pt;getcursorpos(&pt);/取得光标位置screentoclient(&pt);/变成窗口坐标cclientdc dc(this);/窗口客户区域if (m_nindex!=0xffff)/判断按下按钮执行功能时仍下凹getitemrect(m_nindex,&rect);/取得矩形区域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) /完善鼠标移动功能ctoolbar:onmousemove(nflags, point);int index;int count=getcount();/工具栏按钮总数crect rect;if (nflags&mk_lbutton) m_nflagl=1;/防止再次重新出现凸起else m_nflagl=0;ondrawborders()

51、;/绘制所有按钮for(index=0;indexcount;index+)/判断鼠标在哪个按钮上getitemrect(index,&rect);rect.left+;rect.top+;if (rect.ptinrect(point)&/取得移动过程中输入焦点!(getbuttonstyle(index)&tbbs_separator)setcapture();/设置鼠标输入焦点return;if (nflags&mk_lbutton)/防止移出而失去输入焦点setcapture();/设置鼠标输入焦点m_nflagl=1;return; else m_nflagl=0;releaseca

52、pture();return;void ctesttoolbar:onncpaint() /背景重画函数ctoolbar:onncpaint();ondrawgrapper();void ctesttoolbar:setstate(uint nleft,bool nstated) /状态设置函数m_cxleftborder=nleft;/左边界m_nstated=nstated; /工具栏状态(4)有关派生类函数几点说明画按钮凹凸边线函数ondrawborder()正常工具条中的按钮具有黑色的边线,使按钮凹凸感更强烈,但在平面工具条中的这种按钮并不美观,所以应 省略黑色边线部分,并且必须使用系统的api函数getsyscolor函数来取得边线颜色,以便系统改变颜色时按钮边线也随之改变,同时由于凹凸按钮边 线画法完全相同,只是颜色相反,所以两者完全可由这个函数来实现;画分隔线函数ondrawsep()画分隔线时应遍历每个按钮,来取得分隔线的位置,并且利用客户区域文本描述表就可实现,只需画亮暗两条线就可实现;画把手函数ondrawgripper()画把手时应使用整个窗口的文本描述表,因为客户区域描述表不能在窗口的非客户区域画线,而且还必须判断按钮是否以多行多列方式排列,根据不同的排列方式画水平或垂直把手,同时还要实现画关闭按钮功能,以和vc+5 等界面工具栏功

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论