树型视图控件详解复习课程.doc
《树型视图控件详解复习课程.doc》由会员分享,可在线阅读,更多相关《树型视图控件详解复习课程.doc(15页珍藏版)》请在咨信网上搜索。
1、树型视图控件详解精品资料树型视图控件详解 本课中,我们将学习如何使用树型视图控件。另外还要学习如何在树型视图中完成拖-拉动作,以及如何使用图象列表。 理论:树型视图是一种特别的窗口,我们可以使用它一目了然地表示某种层次关系。譬如象在资源管理器中左边窗口中的就是树型视图。您可以调用CreateWindowEx来创建树型视图,传递一个类名“SysTreeView32”,或者您也可以把它放到一个对话框中去。不要忘了在您的代码中加入InitCommonControls函数。 树型视图有几种特有的风格。下面是几种经常使用的。 TVS_HASBUTTONS = 在父项目中显示(+)或(-)。用户可以通过点
2、击该符号来展开或收起该父项目下的子项目。如果想在根目录下也有这个符号必须指定TVS_LINESATROOT风格。TVS_HASLINES = 在层次中用线条来连接各个项目名称。 TVS_LINESATROOT = 在根目录下的项目也用线连接。如果没有指定TVS_HASLINES风格,该风格也就会被忽略。 像其它的通用控件一样,树型视图用消息来完成通信。父窗口发送一系列的消息给树型视图,而树型视图发送notification消息给它的父窗口。在这方面,树型视图和其它的通用控制没什么两样。当有事件发生时,树型视图发送一个WM_NOTIFY消息个父窗口,并在消息中附带传递一些附加信息。 WM_NOT
3、IFY wParam =控件的ID。因为该值不是唯一的,故我们不用它。我们使用NMHDR结构体中的hwndFrom或IDFrom成员变量。lParam = 指向NMHDR结构体的指针。有一些控件可能传递一个指向更大一点的结构体的指针。但该结构体必须保证它的第一个成员变量是一个NMHDR型的变量。这样,您在处理lParam变量时,至少可以得到一个NMHDR型的变量。 下面我们来看NMHDR: NMHDR struct DWORD hwndFrom DWORD ? idFrom DWORD ? code DWORD ? NMHDR ends hwndFrom是发送WM_NOTIFY消息的控件的窗口
4、句柄。idFrom是发送WM_NOTIFY消息的控件的ID。 code是控件发送给父窗口的数据。树型视图发送给父窗口的通知消息以TVN_打头。 树型视图接收到的消息以TVM_打头,譬如:TVM_CREATEDRAGIMAGE。 树型视图发送TVN_XXX消息时在code变量中放入NMHDR型变量。父窗口发送TVM_消息来控制树型视图。 在树型视图中加入项目在创建完树型视图后可以通过发送TVM_INSERTITEM消息往其中加入项目了。 TVM_INSERTITEM wParam = 0; lParam = 指向结构体TV_INSERTSTRUCT的指针; 您应当知道一些关于树型视图中的项目之间
5、关系的一些术语。 一个项目可能是一个父亲、儿子或两者都是。父项目下含有子项目,而该父项目又有可能是其它项目的子项目。一个没有父项目的项目叫根项目。在树型视图中可能有多个根项目。现在我们来看看TV_INSERTSTRUCT结构体:TV_INSERTSTRUCT STRUCT DWORD hParent DWORD ? hInsertAfter DWORD ? ITEMTYPE TV_INSERTSTRUCT ENDS hParent = 父项目的句柄。如果该值为TVI_ROOT value或NULL,该项目插在树型视图的根部。hInsertAfter = 应该插入在起后面的项目的句柄或下面的值:
6、 TVI_FIRST = 插在列表的头部。 TVI_LAST = 插在列表的尾部。 TVI_SORT = 按字母顺序插入。 ITEMTYPE UNION itemex TVITEMEX item TVITEM ITEMTYPE ENDS 我们仅使用TVITEM。 TV_ITEM STRUCT DWORD imask DWORD ? hItem DWORD ? state DWORD ? stateMask DWORD ? pszText DWORD ? cchTextMax DWORD ? iImage DWORD ? iSelectedImage DWORD ? cChildren DWOR
7、D ? lParam DWORD ? TV_ITEM ENDS 该结构体根据消息类型,用来发送或接收关于一个树型视图的项目的有关信息。譬如:对于消息TVM_INSERTITEM,它用来指定插入树型视图控件的项目的属性。而对于消息TVM_GETITEM,该结构体用来填充关于选定项目的信息。imask 用来指定TV_ITEM的那些成员变量有效。譬如,如果指定了TVIF_TEXT,这意味着pszText成员变量是有效的。您可以同时指定几个标志位。hItem 是树型视图项目的句柄。每一个项目都有它自己的句柄,就像窗口一样。如果您想要操作一个项目,就必须选择它的句柄。pszText 是一个字符串指针。它
8、是项目的标签名。cchTextMax仅在查询项目的名称时使用。由于在pszText中指定了指针,WINDOWS还要知道该缓冲去的大小。所以您必须给出该值。iImage 和 iSelectedImage用来指定图象列表以及一个索引号。这样就知道当项目被选中或没被选中时用哪个图象来表示该项目。像资源管理器中左边窗口中的文件夹等小图表就是有这两个参数来决定的。 为了在树型视图中插入一个项目,您必须至少设定hParent, hInsertAfter,另外您还要设定imask和pszText值。 把图形加到图形视图中如果您想要在项目的名称左边显示图标的话,您必须创建一个图形列表,并且把它和树形视图相关联
9、起来。您可以调用ImageList_Create来创建一个图形列表。 ImageList_Create PROTO cx:DWORD, cy:DWORD, flags:DWORD, cInitial:DWORD, cGrow:DWORD 如果创建成功的话,该函数返回一个空的图象列表的句柄。cx = 以像素为单位的图象的宽度。cy = 以像素为单位的图象的高度。图象列表中的每一幅的高度都必须相同。否则WINDOWS会对您的图象进行裁剪,如果过大的话就可能裁剪成几小块。所以您必须指定相同大小的图象。flags = 指定图象列表的图象的颜色深度。详细情况请参考WIN32 API 指南。cInitia
10、l = 指定包含的图象的数目。WINDWOS将依此来分配合适的内存。cGrow = 在增加新图象是一次增加的数目。图象列表不是窗口。仅仅是保存在那给其它的窗口使用的一种资源。 在图象列表产生后,您可以调用ImageList_Add来向其中加入图象。 ImageList_Add PROTO himl:DWORD, hbmImage:DWORD, hbmMask:DWORD 如果该函数调用失败的话,返回-1。himl = 图象列表的句柄。它是调用ImageList_Create时返回的值。hbmImage = 加入图象列表的位图的句柄。您通常把位图保存在资源中,然后调用LoadBitmap来把它加
11、载进来。 注意您没有必要指定该位图中包含的图象的数目。WINDOWS会根据它的大小,自动计算。hbmMask = 掩码位图的句柄。如果没有使用掩码位图,可以忽略该值。 通常我们加入两种图象到图象列表中。一种时被选中时显示的图象,另一种时没被选中时显示的。当图象列表准备就绪后,您可以发送消息TVM_SETIMAGELIST给树型视图来让图象列表和树型视图联系起来。 TVM_SETIMAGELIST wParam = 图象列表的状态,一共有两种: TVSIL_NORMAL 包含被选中和没有被选中两种状态的图象。 TVSIL_STATE 包含了用户自定义的状态的图象。 lParam = 图象列表的句
12、柄。 检索树型视图的信息您可以通过发送消息TVM_GETITEM来检索图形视图的信息。 TVM_GETITEM wParam = 0 lParam =指向结构体TV_ITEM的指针。该结构体将用来得到相关的信息。 在发送该消息前必须设置成员变量imask的值,以便WINDOWS能告诉相关的信息。当然,最重要的是,您必须传递您想得到信息的项目的句柄。这就引起了一个问题,您如何得到项目的句柄?要保存所有项目的句柄吗?答案是很简单的:没有必要。您可以发送消息TVM_GETNEXTITEM到树型视图以检索您想要得到其属性的项目的句柄。譬如:您可以查询第一个子项目的句柄、根目录的句柄、选中的项目的句柄等
13、等。TVM_GETNEXTITEM wParam = 标志lParam = 树型视图的句柄(仅仅当wParam的值是某些标志位时才是必须的)。 wParam中的值非常重要, 我解释如下: TVGN_CARET 选中的项目 TVGN_CHILD hitem参数指定项目的第一个子项目 TVGN_DROPHILITE 拖-拉操作的目的项目 TVGN_FIRSTVISIBLE 第一个可见项目 TVGN_NEXT 下一个同级项目 TVGN_NEXTVISIBLE 下一个可见项目,指定的项目必须可见。发送消息TVM_GETITEMRECT 来决定项目是否可见 TVGN_PARENT 指定项目的父项目 TV
14、GN_PREVIOUS 前一个同级项目 TVGN_PREVIOUSVISIBLE 前一个可见项目,指定的项目必须可见。发送消息TVM_GETITEMRECT 来决定项目是否可见 TVGN_ROOT 根项目 由此您可以通过发送该消息来得到项目的句柄,然后在发送消息TVM_GETITEM时在结构体变量TV_ITEM的成员变量hItem中放入该项目的句柄就可以得到关于该项目的有关信息了。 在树型视图中进行拖-拉操作也就是因为这一部分我才决定写这课教程。当我按照InPrise公司的WIN32帮助来运行例子时,发现它的帮助中缺少真正重要的信息。我只有通过自己做实验,最后总算弄明白来个中来由。希望您不要和
15、我一样再去走这些弯路,下面我把我所知的在树型视图中进行拖-拉操作的步骤描述如下: 当用户要拖动一个项目时,树型视图控件会给它的父窗口发送TVN_BEGINDRAG通知消息。您可以在此处创建表示项目处在拖动操作中的图象,这可以通过发送TVM_CREATEDRAGIMAGE消息给树型视图,让其为目前使用的图象产生一副缺省的图象来实现。树型视图控件将创建一个图象列表,其中仅包含一副在拖动中显示的图象,图象列表创建后,您可以得到它的句柄。 在拖拉的图象生成后,您可以通过调用ImageList_BeginDrag来指定拖动图象的热点位置。 ImageList_BeginDrag PROTO himlTr
16、ack:DWORD, iTrack:DWORD , dxHotspot:DWORD, dyHotspot:DWORD himlTrack 是包含了拖拉时显示的图象的图象列表的句柄 iTrack 是选中的图象在图象列表中的索引号。dxHotspot 因为在拖动中该图象被用来取代光标,所以我们必须指定图象中的哪一点是光标的左上角的位置。dxHotspot是水平相对位置。 dyHotspot 是垂直相对位置。iTrack等于0。如果您要想光标的热点在拖拉中显示的图象的左上角,把dxHotspot和dyHotspot都设成0。 当拖拉的图象要显示时,我们调用ImageList_DragEnter 在树
17、型视图中显示该图象。 ImageList_DragEnter PROTO hwndLock:DWORD, x:DWORD, y:DWORD hwndLock 是进行拖拉中的窗口的句柄,拖拉的动作限制在该窗口中。x 和 y是在拖拉时显示图象的初始位置的坐标值。这些值是相对于窗口的左上角而不是客户区的左上角。 既然可以显示拖动中的图象了,我们就要处理拖动操作了。在这里有一个小问题。我们监视拖动是通过监视鼠标光标的移动来实现的,譬如在移动时我们通过捕获WM_MOUSEMOVE消息来得到移动中的坐标位置,通过捕获WM_LBUTTONUP消息来获知用户的放下操作。但这时如果鼠标光标移过子窗口时父窗口就无
18、法再得到鼠标光标的移动以及鼠标的按键消息了。解决办法是调用SetCapture函数了锁定鼠标事件,这样无论鼠标移到那里和有什么动作,我们的窗口都可以知道了。 在处理WM_MOUSEMOVE消息时,您可以调用ImageList_DragMove来更新图象移动的轨迹。 该函数可以移动拖放操作中的图象位置。另外,如果您想让移动中的图象经过某些项目时高量度显示,可以调用TVM_HITTEST 来确定是否经过某个项目的上面。如果是的话,您可以发送TVM_SELECTITEM消息并设置 TVGN_DROPHILITE标志位使得那个项目高亮度显示。注意:在发送消息TVM_SELECTITEM前,您必须先隐藏
19、图象列表,否则会留下非常难看的轨迹。要隐藏拖动中的图象可以调用ImageList_DragShowNolock,在显示完高亮度的图象后再调用该函数以让拖动中的图象再正常显示。 当用户释放主键后,您必须做几件事。 如果您在高亮度显示的时候释放鼠标主键(表示您想把该项目加到此处),您必须使该项目变成正常地显示,这可以通过发送消息TVM_SELECTITEM消息并设置标志位TVGN_DROPHILITE来实现,只是这时lParam必须为0。如果您不让高亮度显示的项目恢复正常,那就会发生一个奇怪的现象:当您再选择另外的项目时,那个项目的图象会包含在一个正方形中,当时高亮度显示的项目依旧是上一个项目。接
20、下来必须调用ImageList_EndDrag和ImageList_DragLeave。还有调用ReleaseCapture来释放捕获的鼠标。如果您创建了一个图象列表,那还要调用calling ImageList来将它销毁,在拖放操作结束后您可以进行另外其它的操作。 例子代码:.386 .model flat,stdcall option casemap:none include masm32includewindows.inc include masm32includeuser32.inc include masm32includekernel32.inc include masm32inc
21、ludecomctl32.inc include masm32includegdi32.inc includelib masm32libgdi32.lib includelib masm32libcomctl32.lib includelib masm32libuser32.lib includelib masm32libkernel32.lib WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD .const IDB_TREE equ 4006 ; ID of the bitmap resource .data ClassName db TreeViewWin
22、Class,0 AppName db Tree View Demo,0 TreeViewClass db SysTreeView32,0 Parent db Parent Item,0 Child1 db child1,0 Child2 db child2,0 DragMode dd FALSE ; a flag to determine if we are in drag mode .data? hInstance HINSTANCE ? hwndTreeView dd ? ; handle of the tree view control hParent dd ? ; handle of
23、the root tree view item hImageList dd ? ; handle of the image list used in the tree view control hDragImageList dd ? ; handle of the image list used to store the drag image .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke WinMain, hInstance,NULL,NULL, SW_SHOWDEFAULT invoke ExitProc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 视图 控件 详解 复习 课程
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【丰****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【丰****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。