⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lion-tut-c19.htm

📁 内有一些代码
💻 HTM
📖 第 1 页 / 共 3 页
字号:
<BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
DragMode,FALSE</B> <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .endif</B> 
<BR><B>&nbsp;&nbsp;&nbsp; .elseif uMsg==WM_NOTIFY</B> 
<BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov edi,lParam</B> 
<BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assume edi:ptr NM_TREEVIEW</B> 
<BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .if 
[edi].hdr.code==TVN_BEGINDRAG</B> 
<BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke 
SendMessage,hwndTreeView,TVM_CREATEDRAGIMAGE,0,[edi].itemNew.hItem</B> 
<BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
hDragImageList,eax</B> 
<BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke 
ImageList_BeginDrag,hDragImageList,0,0,0</B> 
<BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke 
ImageList_DragEnter,hwndTreeView,[edi].ptDrag.x,[edi].ptDrag.y</B> 
<BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke 
SetCapture,hWnd</B> 
<BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
DragMode,TRUE</B> <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .endif</B> 
<BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assume edi:nothing</B> 
<BR><B>&nbsp;&nbsp;&nbsp; .elseif uMsg==WM_DESTROY</B> 
<BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke 
PostQuitMessage,NULL</B> <BR><B>&nbsp;&nbsp;&nbsp; .else</B> 
<BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke 
DefWindowProc,hWnd,uMsg,wParam,lParam</B> 
<BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret</B> 
<BR><B>&nbsp;&nbsp;&nbsp; .endif</B> <BR><B>&nbsp;&nbsp;&nbsp; xor eax,eax</B> 
<BR><B>&nbsp;&nbsp;&nbsp; ret</B> <BR><B>WndProc endp</B> <BR><B>end start</B> 
<H3><FONT color=#ff0000>分析:</FONT></H3>在处理消息WM_CREATE的代码中,您可以创建树型视图控件。 
<UL><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke 
  CreateWindowEx,NULL,ADDR TreeViewClass,NULL,\</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  WS_CHILD+WS_VISIBLE+TVS_HASLINES+TVS_HASBUTTONS+TVS_LINESATROOT,0,\</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  0,200,400,hWnd,NULL,\</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  hInstance,NULL</B> </UL>注意: TVS_xxxx 是树型视图所特有的风格。 
<UL><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke 
  ImageList_Create,16,16,ILC_COLOR16,2,10</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov hImageList,eax</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke 
  LoadBitmap,hInstance,IDB_TREE</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov hBitmap,eax</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke 
  ImageList_Add,hImageList,hBitmap,NULL</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke 
  DeleteObject,hBitmap</B> <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  invoke SendMessage,hwndTreeView,TVM_SETIMAGELIST,0,hImageList</B> 
</UL>接下来,您可以创建一个空的图像列表,该图像列表容纳的是以像素为单位16x16大小和16位深度的图像,该图像列表初始包含两幅图像,最大可以容纳10幅。然后我们从资源中加载图像,并把它们放到图像列表中去。随后我们删除掉图像的句柄,因为我们不需要再用到它。设置好图像列表后,我们通过发送消息TVM_SETIMAGELIST把它和树型视图控件联系起来。 

<UL><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
  tvinsert.hParent,NULL</B> <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  mov tvinsert.hInsertAfter,TVI_ROOT</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
  tvinsert.u.item.imask,TVIF_TEXT+TVIF_IMAGE+TVIF_SELECTEDIMAGE</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
  tvinsert.u.item.pszText,offset Parent</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
  tvinsert.u.item.iImage,0</B> <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  mov tvinsert.u.item.iSelectedImage,1</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke 
  SendMessage,hwndTreeView,TVM_INSERTITEM,0,addr tvinsert</B> 
</UL>现在把项目插入到树型视图控件中去,首先我们从根项目开始。因为是根项目,所以成员变量hParent是NULL,hInsertAfter是TVI_ROOT。imask指定TV_ITEM结构体变量中的pszText,iImage和iSelectedImage三个成员变量的值是有效的。我们应该给这三个成员变量赋上正确的值。其中pszText显示项目的名称,iImage是图像列表中图像的索引号,该图像显示在未选中的项目名称的左边,iSelectedImage是选中的项目的图像索引号。设置好了这些值后,我们发送TVM_INSERTITEM消息给树型视图控件来把根项目加入到树型视图控件中去。 

<UL><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov hParent,eax</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov tvinsert.hParent,eax</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
  tvinsert.hInsertAfter,TVI_LAST</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
  tvinsert.u.item.pszText,offset Child1</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke 
  SendMessage,hwndTreeView,TVM_INSERTITEM,0,addr tvinsert</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
  tvinsert.u.item.pszText,offset Child2</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; invoke 
  SendMessage,hwndTreeView,TVM_INSERTITEM,0,addr tvinsert</B> 
</UL>加入完根项目后,我们再加入子项目。这时的成员变量hParent是其父项目的句柄,hInsertAfter的值是TVI_LAST。至于选中和非选中时用的图像是一样的,所以我们无需更改其它变量的值。 

<UL><B>&nbsp;&nbsp;&nbsp; .elseif uMsg==WM_NOTIFY</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov edi,lParam</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assume edi:ptr 
  NM_TREEVIEW</B> <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .if 
  [edi].hdr.code==TVN_BEGINDRAG</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  invoke SendMessage,hwndTreeView,TVM_CREATEDRAGIMAGE,0,[edi].itemNew.hItem</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
  hDragImageList,eax</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  invoke ImageList_BeginDrag,hDragImageList,0,0,0</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  invoke ImageList_DragEnter,hwndTreeView,[edi].ptDrag.x,[edi].ptDrag.y</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  invoke SetCapture,hWnd</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
  DragMode,TRUE</B> <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .endif</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assume edi:nothing</B> 
</UL>当用户拖动项目时,树型视图控件将发送WM_NOTIFY消息给它的父窗口,子消息号是TVN_BEGINDRAG。在lPAram中是指向结构体NM_TREEVIEW 
的指针,该结构体包含了一些附加信息。我们把lParam的值放到edi寄存器中,这样就可以把edi作为一个指针来使用。“assume edi:ptr 
NM_TREEVIEW ”语句用来告诉编译器MASM把edi作为指向NM_TREEVIEW 
的结构体的变量使用。我们通过发送消息TVM_CREATEDRAGIMAGE来创建一个拖动的图像。它将返回一个新创建的图像列表的句柄,该图像列表中包含拖动中的图像。我们调用ImageList_BeginDrag函数设置拖动图像的热点。调用ImageList_DragEnter函数进入操作。该函数会在特定位置显示拖动中的图像。起初显示的位置我们设在结构体NM_TREEVIEW中的成员变量ptDrag所指的位置。我们锁定鼠标的输入,并设置标志变量,表示我们进入了拖拉操作。 

<UL><B>&nbsp;&nbsp; .elseif uMsg==WM_MOUSEMOVE</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .if DragMode==TRUE</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
  eax,lParam</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and 
  eax,0ffffh</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
  ecx,lParam</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shr 
  ecx,16</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
  tvhit.pt.x,eax</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
  tvhit.pt.y,ecx</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  invoke ImageList_DragMove,eax,ecx</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  invoke ImageList_DragShowNolock,FALSE</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  invoke SendMessage,hwndTreeView,TVM_HITTEST,NULL,addr tvhit</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .if 
  eax!=NULL</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  invoke SendMessage,hwndTreeView,TVM_SELECTITEM,TVGN_DROPHILITE,eax</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  .endif</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  invoke ImageList_DragShowNolock,TRUE</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .endif</B> 
</UL>现在我们来看看WM_MOUSEMOVE消息的处理过程。当用户拖动图像时,我们的父窗口将接收到WM_MOUSEMOVE。为了响应这些消息,我们调用ImageList_DragMove来更新更新图像的位置。然后我们发送消息TVM_HITTEST给列表视图控件看看拖拉中的图像是否正好经过某些项目的上面,当然还要附带传递坐标位置等信息。如果经过的话,我们发送消息TVM_SELECTITEM并附带TVGN_DROPHILITE标志给树型视图控件,后者将会高亮度显示正被经过的项目。在高亮度显示的过程中,我们隐藏掉拖动中的图像免得显示的图像难看。 

<UL><B>&nbsp;&nbsp;&nbsp; .elseif uMsg==WM_LBUTTONUP</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .if DragMode==TRUE</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  invoke ImageList_DragLeave,hwndTreeView</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  invoke ImageList_EndDrag</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  invoke ImageList_Destroy,hDragImageList</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  invoke SendMessage,hwndTreeView,TVM_GETNEXTITEM,TVGN_DROPHILITE,0</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  invoke SendMessage,hwndTreeView,TVM_SELECTITEM,TVGN_CARET,eax</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  invoke SendMessage,hwndTreeView,TVM_SELECTITEM,TVGN_DROPHILITE,0</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  invoke ReleaseCapture</B> 
  <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov 
  DragMode,FALSE</B> <BR><B>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
  .endif</B> 
</UL>当用户释放鼠标左键后,拖拉操作就可以结束了。我们调用ImageList_DragLeave,ImageList_EndDrag和ImageList_Destroy来结束拖拉操作模式。为了使得树形视图控件好看,我们检查最后高亮度显示的项目,并且选中它。我们还必须使得其不高亮度显示,否则其它的项目被选中时就不能高亮度显示了。最后我们释放对鼠标输入事件的捕获。<BR>
<HR SIZE=1>
<DIV align=center>
<SCRIPT language=JavaScript1.1 src="../lion-tut-c13.files/textclick"></SCRIPT>
<BR></DIV><!-- 10:1 文本广告交换 -->
<DIV align=center>
<SCRIPT language=JavaScript1.1 src="../lion-tut-c13.files/c21.htm"></SCRIPT>
<!-- 10:1 文本广告交换 --></DIV>
<HR SIZE=1>
<DIV align=center>翻译:Lxx.阿龙,校对:LuoYunBin's Win32 ASM Page, <A 
href="http://asm.yeah.net/">http://asm.yeah.net/</A></DIV></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -