Extended TreeView

BlitzPlus Forums/BlitzPlus Programming/Extended TreeView

Phoenix(Posted 2006) [#1]
Hi!

I'm working on an application in B+, and I am using a treeview. http://phoenixoft.com/Designer.rar It would be great to modify the treeview a little, to make it support two extra things: Name modification, so that you can change the name of a treeview node by clicking on it twice. And drag & drop, so that you can move the nodes however you want.

I know this can be done with SetWindowLong, SendMessage etc.
I have tried to make it work, but without success. Here's my code:
; Treeview constants
Const TVS_HASBUTTONS        = $0001
Const TVS_HASLINES          = $0002
Const TVS_LINESATROOT       = $0004
Const TVS_EDITLABELS        = $0008
Const TVS_DISABLEDRAGDROP   = $0010
Const TVS_SHOWSELALWAYS     = $0020
Const TVS_RTLREADING        = $0040
Const TVS_NOTOOLTIPS        = $0080
Const TVS_CHECKBOXES        = $0100
Const TVS_TRACKSELECT       = $0200
Const TVS_SINGLEEXPAND 	    = $0400
Const TVS_INFOTIP      	    = $0800
Const TVS_FULLROWSELECT	    = $1000
Const TVS_NOSCROLL     	    = $2000
Const TVS_NONEVENHEIGHT	    = $4000

Const TVS_SHAREDIMAGELISTS  = $0000
Const TVS_PRIVATEIMAGELISTS = $0400

; Create the gadgets
window = CreateWindow( "Extended TreeView Test", 200, 200, 220, 140, Desktop( ), 1 )
	tree   = CreateTreeView( 10, 10, 200, 100, window )
		node   = AddTreeViewNode( "TEXT", TreeViewRoot( tree ) )

	; Modify the treeview
	; api_SetWindowLong( QueryObject( tree, 1 ), ?, ? )

; Loop
While WaitEvent( )<>$803

Wend


I think that the standard blitz treeview has the flag TVS_DISABLEDRAGDROP, so I have to remove that, and I have to add TVS_EDITLABELS.

There are people here who can solve this problem, please help me out.


Phoenix(Posted 2006) [#2]
I managed to get checkboxes and underlined nodes, but still no luck on the other things...


Phoenix(Posted 2006) [#3]
Yes! I fixed the TVS_EDITLABELS constant, but I still have a problem, when I've entered the text, it doesn't change the text of the node...

; TVS Constants
Const TVS_HASBUTTONS        = $0001
Const TVS_HASLINES          = $0002
Const TVS_LINESATROOT       = $0004
Const TVS_EDITLABELS        = $0008
Const TVS_DISABLEDRAGDROP   = $0010
Const TVS_SHOWSELALWAYS     = $0020
Const TVS_RTLREADING        = $0040
Const TVS_NOTOOLTIPS        = $0080
Const TVS_CHECKBOXES        = $0100
Const TVS_TRACKSELECT       = $0200
Const TVS_SINGLEEXPAND 	    = $0400
Const TVS_INFOTIP      	    = $0800
Const TVS_FULLROWSELECT	    = $1000
Const TVS_NOSCROLL     	    = $2000
Const TVS_NONEVENHEIGHT	    = $4000

Const TVS_SHAREDIMAGELISTS  = $0000
Const TVS_PRIVATEIMAGELISTS = $0400

; Style, do NOT modify!
Const GWL_STYLE = -16

; Create the gadgets
window = CreateWindow( "Extended TreeView Test", 200, 200, 220, 140, Desktop( ), 1 )
	tree   = CreateTreeView( 10, 10, 200, 90, window )
		node   = AddTreeViewNode( "TEXT",  TreeViewRoot( tree ) )
		node2  = AddTreeViewNode( "TEXT2", node                 )
		node3  = AddTreeViewNode( "TEXT3", TreeViewRoot( tree ) )
		node4  = AddTreeViewNode( "TEXT4", TreeViewRoot( tree ) )

	; Modify the treeview
	Treehwnd = QueryObject( tree, 1 )
	style = api_GetWindowLong( Treehwnd, GWL_STYLE )
	api_SetWindowLong( Treehwnd, GWL_STYLE, style + TVS_EDITLABELS )

; Loop
While WaitEvent( )<>$803

Wend



Kev(Posted 2006) [#4]
hi

the problem with trying this using blitz+ is when treeview nodes are edited there event comes through WM_NOTIFY, as TVN_ENDLABELEDIT now lParam will give a pointer TV_DISPINFO and from this structure you need to get a pointer to TV_ITEM structure only then will you be-able to get the text the user has typed in.

treeview checkbox might be possable you would need to setup a function to get the contents of the treeview node, then check the state mask.

kev


Phoenix(Posted 2006) [#5]
So, there is no way to get the text the user typed in?


Kev(Posted 2006) [#6]
hi

yes using a .dll if you code using c, then you could setup a hook using SetWindowsHookEx() using WH_CALLWNDPROCRET or WH_CALLWNDPROC hook then you could process the messages before or after blitz+ gets them.

somthing this this

HHOOK HookRET = SetWindowsHookEx(WH_CALLWNDPROCRET,GLOBAL_HOOKED_MESSAGE_WINPROC_RET,0,GetCurrentThreadId());


where GLOBAL_HOOKED_MESSAGE_WINPROC_RET is a callback, ie.

LRESULT CALLBACK GLOBAL_HOOKED_MESSAGE_WINPROC_RET(int code,WPARAM wParam,LPARAM lParam){
    if(code<<HC_ACTION){
                    return CallNextHookEx(HookRET,code,wParam,lParam);
            }else{
                    CWPRETSTRUCT *msg = (CWPRETSTRUCT*)lParam;
                    // process you hooked events here
    }
}


kev


Phoenix(Posted 2006) [#7]
Windows programming has never been my strong side, I'll just skip the whole edit label part...