回 帖 发 新 帖 刷新版面

主题:TreeView6.0控件拖动问题!

当鼠标把项目拖动在TreeView控件后,Tree控件如何判断项目应落放在那一个节点下?不会是Tree控件的选定节点吧,我的目的是想鼠标把项目拖在哪一个节点上后,Tree控件就在这个节点下添加一个子节点名称就是与这个拖来的项目有关的,但不知道如何处理,我手上的Tree控件资料有限,就是"玩转TreeView 第二版 流星雨",我看了很久都没找到解决的办法,只是有一个属性不明(DropHighlight 属性),不知道是做什么用的,资料中没说明,故此发贴,请各位老师指点一下,在此先谢过了!!!

回复列表 (共3个回复)

沙发

DropHighlight:
Returns a reference to a Node or ListItem object and highlights the object with the system highlight

板凳

在网上找到的方法,看来很复杂,说来也简单,发到这里供朋友们参考一下,希望有能人之仕找出更好更简便的方法!代码如下:
方法说明:
    1、我用的是树型控件的DRAGDROP事件来作拖放操作的最后处理的(没有用TREE控件的OLEDRAGDROP事件);
    2、首先在表单INIT事件生成两个表单属性:nTreeFactorX和nTreeFactorY(随便你用什么名称),其作用是记住表单中水平和垂直方向每个单位坐标值所占用的象素值(我是这样理解的)。
    3、在DRAGDROP事件中,用其参数nXCoord, nYCoord,先计算出拖放操作落放在树型控件中的坐标,也就是这样:
    nXCoord=nXCoord-树型控件左边与表单最左边的距(注意不是包含树型控件容器是表单位)
    nYCoord=nYCoord-树型控件顶边与表单最顶边的距(注意不是包含树型控件容器是表单位)
    4、调用树型控件的HitTest方法,取得树型控件当中当前坐标位置的节点对象,如:
    oNode=.TRee1.HitTest(thisform.ntreefactorx*nXCoord,thisform.ntreefactory*nYCoord)
    oNode变量就是接收拖放的节点对象,如果要判断是否真正得到节点,只需用一下TYPE()函数就解决问题:
    IF type("oNode.key")="C"
        MESSAGEBOX("得到节点对象!",64,"")
    ELSE
        MESSAGEBOX("没有得到节点对象!",64,"")
    ENDIF
得到第2项单位坐标象素值代码如(以下代码全部是网上找的):
local liHWnd,liHDC,liPixelsPerInchX,liPixelsPerInchY
* 定义一些常数。
#define cnLOG_PIXELS_X 88
* 来自 WINGDI.H
#define cnLOG_PIXELS_Y 90
* 来自From WINGDI.H
#define cnTWIPS_PER_INCH 1440
* 每英寸1440 缇

* 定义一些 Windows API 函数
declare integer GetActiveWindow in WIN32API
declare integer GetDC in WIN32API integer iHDC
declare integer GetDeviceCaps in WIN32API integer iHDC, integer iIndex

* 为 VFP 取得图形设备(device context)。
liHWnd = GetActiveWindow()
liHDC = GetDC(liHWnd)

* 取得每英寸象素值。
liPixelsPerInchX = GetDeviceCaps(liHDC, cnLOG_PIXELS_X)
liPixelsPerInchY = GetDeviceCaps(liHDC, cnLOG_PIXELS_Y)

* 取得每象素缇并保存到表单属性中。
with This
.nTreeFactorX = cnTWIPS_PER_INCH/liPixelsPerInchX
.nTreeFactorY = cnTWIPS_PER_INCH/liPixelsPerInchY
ENDWITH
***清除动态库。
CLEAR DLLS "GetActiveWindow","GetDC","GetDeviceCaps"

3 楼

用不了这么复杂的!
你上网好找找,添加 3、4 条代码就可以解决的!

我来回复

您尚未登录,请登录后再回复。点此登录或注册