树形控件如何实现全选,急!急!

时间:2022-02-17 16:02:50
树型控件写了个递归函数,实现了全选,可是如果函数放在clicked事件中,则在点击“+”展开的时候也会触发该函数,如果放在selectionchanged里,由于oldhandle和newhandle没变不会触发该函数,树形控件有相关的checkbox事件吗?求教高手,急!

9 个解决方案

#1


树形控件没有相关的checkbox的事件。我的解决方法是在clicked事件中,通过鼠标点击的位置来判断是否点击的checkbox位置。下面是我使用的代码,你可能要调整下里面的数值

// 获取点击的X坐标
lx = UnitsToPixels(PointerX(), XUnitsToPixels!) 
// 计算CheckBox所在的X坐标
If This.Linesatroot Then 
lx1 = ltvi_Node.level * 19 
Else 
lx1 = (ltvi_Node.level - 1) * 19 
End If 

#2


引用 1 楼  的回复:
树形控件没有相关的checkbox的事件。我的解决方法是在clicked事件中,通过鼠标点击的位置来判断是否点击的checkbox位置。下面是我使用的代码,你可能要调整下里面的数值

// 获取点击的X坐标
lx = UnitsToPixels(PointerX(), XUnitsToPixels!) 
// 计算CheckBox所在的X坐标
If This.Linesatroot T……

这样做在不同的操作系统,不同的显示位置会准吗?

#3


引用楼主  的回复:
树型控件写了个递归函数,实现了全选,可是如果函数放在clicked事件中,则在点击“+”展开的时候也会触发该函数,如果放在selectionchanged里,由于oldhandle和newhandle没变不会触发该函数,树形控件有相关的checkbox事件吗?求教高手,急!


没有checkbox事件,需要写在clicked事件里

你可以判断一下当前项目是否有下一级,如果有的话,就不要触发

或者你试一下这个函数GetItemAtPointer(),是不是点击图标和项目返回值不一样,如果不一样的话,可以考虑用这个函数来判断是否需要执行你的代码

#4


引用 3 楼  的回复:
引用楼主  的回复:
树型控件写了个递归函数,实现了全选,可是如果函数放在clicked事件中,则在点击“+”展开的时候也会触发该函数,如果放在selectionchanged里,由于oldhandle和newhandle没变不会触发该函数,树形控件有相关的checkbox事件吗?求教高手,急!


没有checkbox事件,需要写在clicked事件里

你可以判断一下当前项目是否……

不行,返回的handle如同level的值,无法判断是点“+”还是“checkbox”还是“项目名称”

#5


换种方案,如果你用的pb10.5以上的话,可以用树型数据窗口

如果你用pb10.5以下的版本,你可以考虑用数据窗口来模拟

#6


树型图

#7


你在clicked加个判断是否是点击checkbox处了。
Function    integer    getiteminfo(long    hWnd,    long    uMsg,    long    wParam,    REF TVHITTESTINFO  tv)    library    "user32.dll"    Alias    For    "SendMessageA" 

在mousemove事件中加入如下代码:
tvhittestinfo   ltvitem   
tvitem   Item    
ltvitem.pt.xx   =   UnitsToPixels   (xpos,   XUnitsToPixels!   )   
ltvitem.pt.yy   =   UnitsToPixels   (ypos,   YUnitsToPixels!   )   
getiteminfo(handle(this),4369,0,ltvitem)   
IF   ltvitem.hItem   =   0   then   return   
ib_ischeckboxes = (ltvitem.flags = 64 ) 

在clicked事件中判断ib_ischeckboxes是否为真,如果是代表的是点击到checkbox否则就不是。。这样就不会出现你所说的问题了

#8



接上面,还要加几个局部结构关系
type point from structure
long xx
long yy
end type

type tvhittestinfo from structure
point pt
long flags
long hitem
end type

type RECT from structure
long left
long top
long right
long bottom
end type

type tvitem from structure
long mask
ulong hitem
long state
long statemask
long psztext
long cchtextmax
long iimage
long iselectedimage
long cchildren
long lparam
end type

#9


引用 8 楼  的回复:
接上面,还要加几个局部结构关系
type point from structure
long xx
long yy
end type

type tvhittestinfo from structure
point pt
long flags
long hitem
end type

type RECT from structure
long left
lo……


这个方法不错,同上面的,也只有判断位置来解决了,谢谢各位

#1


树形控件没有相关的checkbox的事件。我的解决方法是在clicked事件中,通过鼠标点击的位置来判断是否点击的checkbox位置。下面是我使用的代码,你可能要调整下里面的数值

// 获取点击的X坐标
lx = UnitsToPixels(PointerX(), XUnitsToPixels!) 
// 计算CheckBox所在的X坐标
If This.Linesatroot Then 
lx1 = ltvi_Node.level * 19 
Else 
lx1 = (ltvi_Node.level - 1) * 19 
End If 

#2


引用 1 楼  的回复:
树形控件没有相关的checkbox的事件。我的解决方法是在clicked事件中,通过鼠标点击的位置来判断是否点击的checkbox位置。下面是我使用的代码,你可能要调整下里面的数值

// 获取点击的X坐标
lx = UnitsToPixels(PointerX(), XUnitsToPixels!) 
// 计算CheckBox所在的X坐标
If This.Linesatroot T……

这样做在不同的操作系统,不同的显示位置会准吗?

#3


引用楼主  的回复:
树型控件写了个递归函数,实现了全选,可是如果函数放在clicked事件中,则在点击“+”展开的时候也会触发该函数,如果放在selectionchanged里,由于oldhandle和newhandle没变不会触发该函数,树形控件有相关的checkbox事件吗?求教高手,急!


没有checkbox事件,需要写在clicked事件里

你可以判断一下当前项目是否有下一级,如果有的话,就不要触发

或者你试一下这个函数GetItemAtPointer(),是不是点击图标和项目返回值不一样,如果不一样的话,可以考虑用这个函数来判断是否需要执行你的代码

#4


引用 3 楼  的回复:
引用楼主  的回复:
树型控件写了个递归函数,实现了全选,可是如果函数放在clicked事件中,则在点击“+”展开的时候也会触发该函数,如果放在selectionchanged里,由于oldhandle和newhandle没变不会触发该函数,树形控件有相关的checkbox事件吗?求教高手,急!


没有checkbox事件,需要写在clicked事件里

你可以判断一下当前项目是否……

不行,返回的handle如同level的值,无法判断是点“+”还是“checkbox”还是“项目名称”

#5


换种方案,如果你用的pb10.5以上的话,可以用树型数据窗口

如果你用pb10.5以下的版本,你可以考虑用数据窗口来模拟

#6


树型图

#7


你在clicked加个判断是否是点击checkbox处了。
Function    integer    getiteminfo(long    hWnd,    long    uMsg,    long    wParam,    REF TVHITTESTINFO  tv)    library    "user32.dll"    Alias    For    "SendMessageA" 

在mousemove事件中加入如下代码:
tvhittestinfo   ltvitem   
tvitem   Item    
ltvitem.pt.xx   =   UnitsToPixels   (xpos,   XUnitsToPixels!   )   
ltvitem.pt.yy   =   UnitsToPixels   (ypos,   YUnitsToPixels!   )   
getiteminfo(handle(this),4369,0,ltvitem)   
IF   ltvitem.hItem   =   0   then   return   
ib_ischeckboxes = (ltvitem.flags = 64 ) 

在clicked事件中判断ib_ischeckboxes是否为真,如果是代表的是点击到checkbox否则就不是。。这样就不会出现你所说的问题了

#8



接上面,还要加几个局部结构关系
type point from structure
long xx
long yy
end type

type tvhittestinfo from structure
point pt
long flags
long hitem
end type

type RECT from structure
long left
long top
long right
long bottom
end type

type tvitem from structure
long mask
ulong hitem
long state
long statemask
long psztext
long cchtextmax
long iimage
long iselectedimage
long cchildren
long lparam
end type

#9


引用 8 楼  的回复:
接上面,还要加几个局部结构关系
type point from structure
long xx
long yy
end type

type tvhittestinfo from structure
point pt
long flags
long hitem
end type

type RECT from structure
long left
lo……


这个方法不错,同上面的,也只有判断位置来解决了,谢谢各位