WIN32汇编: 19.树型视图控件[3]

[入库:2005年8月19日] [更新:2007年3月24日]

本文简介:选择自 goddragon 的 blog

x 和 y是在拖拉时显示图象的初始位置的坐标值。这些值是相对于窗口的左上角而不是客户区的左上角。

  • 既然可以显示拖动中的图象了,我们就要处理拖动操作了。在这里有一个小问题。我们监视拖动是通过监视鼠标光标的移动来实现的,譬如在移动时我们通过捕获wm_mousemove消息来得到移动中的坐标位置,通过捕获wm_lbuttonup消息来获知用户的放下操作。但这时如果鼠标光标移过子窗口时父窗口就无法再得到鼠标光标的移动以及鼠标的按键消息了。解决办法是调用setcapture函数了锁定鼠标事件,这样无论鼠标移到那里和有什么动作,我们的窗口都可以知道了。
  • 在处理wm_mousemove消息时,您可以调用imagelist_dragmove来更新图象移动的轨迹。 该函数可以移动拖放操作中的图象位置。另外,如果您想让移动中的图象经过某些项目时高量度显示,可以调用tvm_hittest 来确定是否经过某个项目的上面。如果是的话,您可以发送tvm_selectitem消息并设置 tvgn_drophilite标志位使得那个项目高亮度显示。注意:在发送消息tvm_selectitem前,您必须先隐藏图象列表,否则会留下非常难看的轨迹。要隐藏拖动中的图象可以调用imagelist_dragshownolock,在显示完高亮度的图象后再调用该函数以让拖动中的图象再正常显示。
  • 当用户释放主键后,您必须做几件事。 如果您在高亮度显示的时候释放鼠标主键(表示您想把该项目加到此处),您必须使该项目变成正常地显示,这可以通过发送消息tvm_selectitem消息并设置标志位tvgn_drophilite来实现,只是这时lparam必须为0。如果您不让高亮度显示的项目恢复正常,那就会发生一个奇怪的现象:当您再选择另外的项目时,那个项目的图象会包含在一个正方形中,当时高亮度显示的项目依旧是上一个项目。接下来必须调用imagelist_enddrag和imagelist_dragleave。还有调用releasecapture来释放捕获的鼠标。如果您创建了一个图象列表,那还要调用calling imagelist来将它销毁,在拖放操作结束后您可以进行另外其它的操作。
  • 例子代码:

    .386
    .model flat,stdcall
    option casemap:none
    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    include \masm32\include\comctl32.inc
    include \masm32\include\gdi32.inc
    includelib \masm32\lib\gdi32.lib
    includelib \masm32\lib\comctl32.lib
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib

    winmain proto :dword,:dword,:dword,:dword
    .const
    idb_tree equ 4006                ; id of the bitmap resource
    .data
    classname  db "treeviewwinclass",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 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 exitprocess,eax
        invoke initcommoncontrols

    winmain proc hinst:hinstance,hprevinst:hinstance,cmdline:lpstr,cmdshow:dword
        local wc:wndclassex
        local msg:msg
        local hwnd:hwnd
        mov   wc.cbsize,sizeof wndclassex
        mov   wc.style, cs_hredraw or cs_vredraw
        mov   wc.lpfnwndproc, offset wndproc
        mov   wc.cbclsextra,null
        mov   wc.cbwndextra,null
        push  hinst
        pop   wc.hinstance
        mov   wc.hbrbackground,color_appworkspace
        mov   wc.lpszmenuname,null
        mov   wc.lpszclassname,offset classname
        invoke loadicon,null,idi_application
        mov   wc.hicon,eax
        mov   wc.hiconsm,eax
        invoke loadcursor,null,idc_arrow
        mov   wc.hcursor,eax
        invoke registerclassex, addr wc
        invoke createwindowex,ws_ex_clientedge,addr classname,addr appname,\           ws_overlapped+ws_caption+ws_sysmenu+ws_minimizebox+ws_maximizebox+ws_visible,cw_usedefault,\
               cw_usedefault,200,400,null,null,\

    本文关键:asm
     

    本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

    go top