The following code illustrates a problem using treeviews. If you select a node it sends a %TVN_SELCHANGING message to the WM_NOTIFY event handler. If you want to click the same treeview item again no message is sent. You have to move to another item in the treeview and then back again to make it fire (when using the mouse or using enter). Someone may know the answer without the code below.
To see the problem run the program and click a treenode. The caption bar will show the time. If you click a different node the time will change. If you click the same node twice several seconds apart the time will not change. How do you get around this?
Thanks,
Bob Mechler
To see the problem run the program and click a treenode. The caption bar will show the time. If you click a different node the time will change. If you click the same node twice several seconds apart the time will not change. How do you get around this?
Thanks,
Bob Mechler
Code:
#PBFORMS CREATED V1.51 #COMPILE EXE #DIM ALL '------------------------------------------------------------------------------ ' ** Includes ** '------------------------------------------------------------------------------ #PBFORMS BEGIN INCLUDES #IF NOT %DEF(%WINAPI) #INCLUDE "WIN32API.INC" #ENDIF #IF NOT %DEF(%COMMCTRL_INC) #INCLUDE "COMMCTRL.INC" #ENDIF #INCLUDE "PBForms.INC" #PBFORMS END INCLUDES '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Constants ** '------------------------------------------------------------------------------ #PBFORMS BEGIN CONSTANTS %IDD_DIALOG1 = 101 %TRV_SYSTREEVIEW32_1 = 1001 #PBFORMS END CONSTANTS '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Declarations ** '------------------------------------------------------------------------------ DECLARE CALLBACK FUNCTION ShowDIALOG1Proc() DECLARE FUNCTION SampleTreeViewInsertItem(BYVAL hTree AS DWORD, BYVAL hParent _ AS DWORD, sItem AS STRING) AS LONG DECLARE FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG #PBFORMS DECLARATIONS '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Main Application Entry Point ** '------------------------------------------------------------------------------ FUNCTION TVGetText(BYVAL hTree AS LONG, BYVAL hTVItem AS LONG) AS STRING LOCAL zText AS ASCIIZ * 255 LOCAL lTVItem AS TV_ITEM lTVItem.hItem = hTVItem lTVItem.Mask = %TVIF_TEXT lTVItem.pszText = VARPTR(zText) lTVItem.cchTextMax = 255 TreeView_GetItem(hTree, lTVItem) FUNCTION = zText END FUNCTION FUNCTION PBMAIN() PBFormsInitComCtls (%ICC_WIN95_CLASSES OR %ICC_DATE_CLASSES OR _ %ICC_INTERNET_CLASSES) ShowDIALOG1 %HWND_DESKTOP END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** CallBacks ** '------------------------------------------------------------------------------ CALLBACK FUNCTION ShowDIALOG1Proc() STATIC hTreeItem AS LONG,hTreeView AS LONG DIM lpNmh AS NMHDR PTR SELECT CASE AS LONG CBMSG CASE %WM_INITDIALOG ' Initialization handler CASE %WM_NCACTIVATE STATIC hWndSaveFocus AS DWORD IF ISFALSE CBWPARAM THEN ' Save control focus hWndSaveFocus = GetFocus() ELSEIF hWndSaveFocus THEN ' Restore control focus SetFocus(hWndSaveFocus) hWndSaveFocus = 0 END IF CASE %WM_NOTIFY SELECT CASE CBCTL CASE %TRV_SYSTREEVIEW32_1 CONTROL HANDLE CBHNDL, %TRV_SYSTREEVIEW32_1 TO hTreeView& lpNmh = CBLPARAM IF @lpNmh.code = %TVN_SELCHANGING THEN SetWindowText CBHNDL, TVGetText(hTreeView&, hTreeItem&) + TIME$ END IF END SELECT CASE %WM_COMMAND ' Process control notifications SELECT CASE AS LONG CBCTL CASE %TRV_SYSTREEVIEW32_1 END SELECT END SELECT END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Sample Code ** '------------------------------------------------------------------------------ FUNCTION SampleTreeViewInsertItem(BYVAL hTree AS DWORD, BYVAL hParent AS _ DWORD, sItem AS STRING) AS LONG LOCAL tTVItem AS TV_ITEM LOCAL tTVInsert AS TV_INSERTSTRUCT IF hParent THEN tTVItem.mask = %TVIF_CHILDREN OR %TVIF_HANDLE tTVItem.hItem = hParent tTVItem.cchildren = 1 TreeView_SetItem hTree, tTVItem END IF tTVInsert.hParent = hParent tTVInsert.Item.Item.mask = %TVIF_TEXT tTVInsert.Item.Item.pszText = STRPTR(sItem) tTVInsert.Item.Item.cchTextMax = LEN(sItem) FUNCTION = TreeView_InsertItem(hTree, tTVInsert) END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ FUNCTION SampleTreeView(BYVAL hDlg AS DWORD, BYVAL lID AS LONG, BYVAL lCount _ AS LONG) AS LONG LOCAL i AS LONG LOCAL j AS LONG LOCAL k AS LONG LOCAL hCtl AS DWORD LOCAL hRoot AS DWORD LOCAL hParent AS DWORD CONTROL HANDLE hDlg, lID TO hCtl FOR i = 1 TO lCount hRoot = SampleTreeViewInsertItem(hCtl, %NULL, USING$("Root#", i)) FOR j = 1 TO lCount hParent = SampleTreeViewInsertItem(hCtl, hRoot, USING$("Item#", j)) FOR k = 1 TO lCount CALL SampleTreeViewInsertItem(hCtl, hParent, USING$("SubItem#_.#", j, _ k)) NEXT k NEXT j NEXT i END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Dialogs ** '------------------------------------------------------------------------------ FUNCTION ShowDIALOG1(BYVAL hParent AS DWORD) AS LONG LOCAL lRslt AS LONG #PBFORMS BEGIN DIALOG %IDD_DIALOG1->-> LOCAL hDlg AS DWORD DIALOG NEW hParent, "Dialog1", 90, 69, 399, 304, %WS_POPUP OR %WS_BORDER OR _ %WS_DLGFRAME OR %WS_SYSMENU OR %WS_CLIPSIBLINGS OR %WS_VISIBLE OR _ %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR %DS_SETFONT, _ %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR _ %WS_EX_RIGHTSCROLLBAR, TO hDlg CONTROL ADD "SysTreeView32", hDlg, %TRV_SYSTREEVIEW32_1, "SysTreeView32_1", _ 44, 28, 252, 184, %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP OR _ %TVS_HASBUTTONS OR %TVS_HASLINES OR %TVS_LINESATROOT OR _ %TVS_SHOWSELALWAYS, %WS_EX_LEFT OR %WS_EX_CLIENTEDGE OR _ %WS_EX_RIGHTSCROLLBAR #PBFORMS END DIALOG SampleTreeView hDlg, %TRV_SYSTREEVIEW32_1, 3 DIALOG SHOW MODAL hDlg, CALL ShowDIALOG1Proc TO lRslt #PBFORMS BEGIN CLEANUP %IDD_DIALOG1 #PBFORMS END CLEANUP FUNCTION = lRslt END FUNCTION '------------------------------------------------------------------------------
Comment