CustomDraw treegadget

Windows specific forum
User avatar
DoubleDutch
Addict
Addict
Posts: 3220
Joined: Thu Aug 07, 2003 7:01 pm
Location: United Kingdom
Contact:

CustomDraw treegadget

Post by DoubleDutch »

The following code will custom draw a treegadget, it will change some of the text in the gadget just before its drawn.

Code: Select all

Enumeration
  #MainWindow
  #TreeGadget
EndEnumeration

#DT_WORD_ELLIPSIS = $40000 
#DT_END_ELLIPSIS = $8000 
#DT_PATH_ELLIPSIS = $4000 
#DT_MODIFYSTRING = $10000 

#CDIS_CHECKED = 8 
#CDIS_DEFAULT = $20 
#CDIS_DISABLED = 4 
#CDIS_FOCUS = $10 
#CDIS_GRAYED = 2 
#CDIS_HOT = $40 
#CDIS_INDETERMINATE = $100 
#CDIS_MARKED = $80 
#CDIS_SELECTED = 1 
#CDIS_SHOWKEYBOARDCUES = $200 

#CDDS_ITEM = $10000 
#CDDS_MAPPART = 5 
#CDDS_POSTERASE = 4 
#CDDS_POSTPAINT = 2 
#CDDS_PREERASE = 3 
#CDDS_PREPAINT = 1 
#CDDS_ITEMPOSTERASE = #CDDS_ITEM | #CDDS_POSTERASE 
#CDDS_ITEMPOSTPAINT = #CDDS_ITEM | #CDDS_POSTPAINT 
#CDDS_ITEMPREERASE = #CDDS_ITEM | #CDDS_PREERASE 
#CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT 
#CDDS_SUBITEM = $20000 

#CDRF_DODEFAULT = 0 
#CDRF_NEWFONT = 2 
#CDRF_NOTIFYITEMDRAW = $20 
#CDRF_NOTIFYPOSTERASE = $40 
#CDRF_NOTIFYPOSTPAINT = $10 
#CDRF_NOTIFYSUBITEMDRAW = $20 
#CDRF_SKIPDEFAULT = 4

Procedure MyWindowCallback(WindowID,Message,wParam,lParam) 
  Result=#PB_ProcessPureBasicEvents
  Select Message
    Case  #WM_NOTIFY
      *tvCD.NMTVCUSTOMDRAW=lparam
      If *tvCD\nmcd\hdr\hwndFrom=GadgetID(#TreeGadget) And *tvCD\nmcd\hdr\code=#NM_CUSTOMDRAW    
        Select *tvCD\nmcd\dwDrawStage
          Case #CDDS_PREPAINT:ProcedureReturn (#CDRF_NOTIFYITEMDRAW)
          Case #CDDS_ITEMPREPAINT
            thisItem=*tvCD\nmcd\dwItemSpec
            ;tvItemRect.RECT\left=#TVIR_LABEL
            tvItemRect.RECT\left=thisItem
            SendMessage_(GadgetID(#TreeGadget),#TVM_GETITEMRECT,#True,@tvItemRect)
            tvi.TV_ITEM 
            tvi$ = Space(256) 
            tvi\mask = #TVIF_HANDLE | #TVIF_PARAM | #TVIF_TEXT 
            tvi\pszText = @tvi$ 
            tvi\cchTextMax = 256 
            tvi\hItem=thisitem
            tvFlags=#DT_END_ELLIPSIS
            SendMessage_(GadgetID(#TreeGadget),#TVM_GETITEM,0,tvi)
            tvi$=ReplaceString(tvi$,"[name]","Anthony")
            tvItemRect\right+200  ; add some - it seems to clip okay
            SetTextColor_(*tvCD\nmcd\hDC,RGB(255,255,255))  
            SetBkColor_(*tvCD\nmcd\hDC,RGB(90,30,40))  
            DrawText_(*tvCD\nmcd\hDC,tvi$,Len(tvi$),tvItemRect,tvFlags)
            ProcedureReturn(#CDRF_SKIPDEFAULT)
        EndSelect
      EndIf
  EndSelect 
  ProcedureReturn Result 
EndProcedure 


If OpenWindow(#MainWindow,0,0,355,180,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"TreeGadget") And CreateGadgetList(WindowID(0))
  TreeGadget(#TreeGadget, 10,10,330,160)  
    AddGadgetItem (#TreeGadget,-1,"The following bit will change [name], heheh!") 
    AddGadgetItem (#TreeGadget,-1,"This is a node, click slightly to the left of the text")
    OpenTreeGadgetNode(#TreeGadget)
      AddGadgetItem(#TreeGadget,-1,"sub text")
      AddGadgetItem(#TreeGadget,-1,"another change test: [name] !!!")
    CloseTreeGadgetNode(#TreeGadget)
  SetWindowCallback(@MyWindowCallback()) 
  Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
The problem is how can I get the icon to draw to the left of the text showing that there is a node to open?

Do I just draw an icon? How do I do this?
https://deluxepixel.com <- My Business website
https://reportcomplete.com <- School end of term reports system
Sparkie
PureBatMan Forever
PureBatMan Forever
Posts: 2307
Joined: Tue Feb 10, 2004 3:07 am
Location: Ohio, USA

Post by Sparkie »

Try this...

Code: Select all

ProcedureReturn (#CDRF_NEWFONT)
instead of...

Code: Select all

ProcedureReturn (#CDRF_SKIPDEFAULT)
What goes around comes around.

PB 5.21 LTS (x86) - Windows 8.1
User avatar
DoubleDutch
Addict
Addict
Posts: 3220
Joined: Thu Aug 07, 2003 7:01 pm
Location: United Kingdom
Contact:

Post by DoubleDutch »

If you use newfont then the text isn't changed.... see that the text is changed to Anthony instead of [name]....

-Anthony
https://deluxepixel.com <- My Business website
https://reportcomplete.com <- School end of term reports system
Sparkie
PureBatMan Forever
PureBatMan Forever
Posts: 2307
Joined: Tue Feb 10, 2004 3:07 am
Location: Ohio, USA

Post by Sparkie »

Ooops, I missed that part :oops:

Will this work :?:

Code: Select all

Enumeration 
  #MainWindow 
  #TreeGadget 
EndEnumeration 

#DT_WORD_ELLIPSIS = $40000 
#DT_END_ELLIPSIS = $8000 
#DT_PATH_ELLIPSIS = $4000 
#DT_MODIFYSTRING = $10000 

#CDIS_CHECKED = 8 
#CDIS_DEFAULT = $20 
#CDIS_DISABLED = 4 
#CDIS_FOCUS = $10 
#CDIS_GRAYED = 2 
#CDIS_HOT = $40 
#CDIS_INDETERMINATE = $100 
#CDIS_MARKED = $80 
#CDIS_SELECTED = 1 
#CDIS_SHOWKEYBOARDCUES = $200 

#CDDS_ITEM = $10000 
#CDDS_MAPPART = 5 
#CDDS_POSTERASE = 4 
#CDDS_POSTPAINT = 2 
#CDDS_PREERASE = 3 
#CDDS_PREPAINT = 1 
#CDDS_ITEMPOSTERASE = #CDDS_ITEM | #CDDS_POSTERASE 
#CDDS_ITEMPOSTPAINT = #CDDS_ITEM | #CDDS_POSTPAINT 
#CDDS_ITEMPREERASE = #CDDS_ITEM | #CDDS_PREERASE 
#CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT 
#CDDS_SUBITEM = $20000 

#CDRF_DODEFAULT = 0 
#CDRF_NEWFONT = 2 
#CDRF_NOTIFYITEMDRAW = $20 
#CDRF_NOTIFYPOSTERASE = $40 
#CDRF_NOTIFYPOSTPAINT = $10 
#CDRF_NOTIFYSUBITEMDRAW = $20 
#CDRF_SKIPDEFAULT = 4 

Procedure MyWindowCallback(WindowID,Message,wParam,lParam) 
  result=#PB_ProcessPureBasicEvents 
  Select Message 
    Case  #WM_NOTIFY 
      *tvCD.NMTVCUSTOMDRAW=lParam 
      If *tvCD\nmcd\hdr\hwndFrom=GadgetID(#TreeGadget) And *tvCD\nmcd\hdr\code=#NM_CUSTOMDRAW    
        Select *tvCD\nmcd\dwDrawStage 
          Case #CDDS_PREPAINT:ProcedureReturn (#CDRF_NOTIFYITEMDRAW) 
          Case #CDDS_ITEMPREPAINT : ProcedureReturn(#CDRF_NOTIFYPOSTPAINT)
          Case #CDDS_ITEMPOSTPAINT
            thisItem=*tvCD\nmcd\dwItemSpec 
            ;tvItemRect.RECT\left=#TVIR_LABEL 
            tvItemRect.RECT\left=thisItem 
            SendMessage_(GadgetID(#TreeGadget),#TVM_GETITEMRECT,#True,@tvItemRect) 
            tvi.TV_ITEM 
            tvi$ = Space(256) 
            tvi\mask = #TVIF_HANDLE | #TVIF_PARAM | #TVIF_TEXT 
            tvi\pszText = @tvi$ 
            tvi\cchTextMax = 256 
            tvi\hItem=thisItem 
            tvFlags=#DT_END_ELLIPSIS 
            SendMessage_(GadgetID(#TreeGadget),#TVM_GETITEM,0,tvi) 
            tvi$=ReplaceString(tvi$,"[name]","Anthony") 
            tvItemRect\right+200  ; add some - it seems to clip okay 
            SetTextColor_(*tvCD\nmcd\hDC,RGB(255,255,255))  
            SetBkColor_(*tvCD\nmcd\hDC,RGB(90,30,40))  
            DrawText_(*tvCD\nmcd\hDC,tvi$,Len(tvi$),tvItemRect,tvFlags) 
            ProcedureReturn #CDRF_SKIPDEFAULT
        EndSelect 
      EndIf 
  EndSelect 
  ProcedureReturn result 
EndProcedure 


If OpenWindow(#MainWindow,0,0,355,180,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"TreeGadget") And CreateGadgetList(WindowID(0)) 
  TreeGadget(#TreeGadget, 10,10,330,160)  
  AddGadgetItem (#TreeGadget,-1,"The following bit will change [name], heheh!") 
  AddGadgetItem (#TreeGadget,-1,"This is a node, click slightly to the left of the text") 
  OpenTreeGadgetNode(#TreeGadget) 
  AddGadgetItem(#TreeGadget,-1,"sub text") 
  AddGadgetItem(#TreeGadget,-1,"another change test: [name] !!!") 
  CloseTreeGadgetNode(#TreeGadget) 
  SetWindowCallback(@MyWindowCallback()) 
  Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow 
EndIf
What goes around comes around.

PB 5.21 LTS (x86) - Windows 8.1
User avatar
DoubleDutch
Addict
Addict
Posts: 3220
Joined: Thu Aug 07, 2003 7:01 pm
Location: United Kingdom
Contact:

Post by DoubleDutch »

It works much better, but you can still see the old text behind the redraw. I wonder if you can skip the pre-draw, but draw the post. ???

-Anthony
https://deluxepixel.com <- My Business website
https://reportcomplete.com <- School end of term reports system
Sparkie
PureBatMan Forever
PureBatMan Forever
Posts: 2307
Joined: Tue Feb 10, 2004 3:07 am
Location: Ohio, USA

Post by Sparkie »

I add bits and pieces to your code and this seems to work pretty good. :)

Code: Select all

Enumeration 
  #MainWindow 
  #TreeGadget 
EndEnumeration 

#DT_WORD_ELLIPSIS = $40000 
#DT_END_ELLIPSIS = $8000 
#DT_PATH_ELLIPSIS = $4000 
#DT_MODIFYSTRING = $10000 

#CDIS_CHECKED = 8 
#CDIS_DEFAULT = $20 
#CDIS_DISABLED = 4 
#CDIS_FOCUS = $10 
#CDIS_GRAYED = 2 
#CDIS_HOT = $40 
#CDIS_INDETERMINATE = $100 
#CDIS_MARKED = $80 
#CDIS_SELECTED = 1 
#CDIS_SHOWKEYBOARDCUES = $200 

#CDDS_ITEM = $10000 
#CDDS_MAPPART = 5 
#CDDS_POSTERASE = 4 
#CDDS_POSTPAINT = 2 
#CDDS_PREERASE = 3 
#CDDS_PREPAINT = 1 
#CDDS_ITEMPOSTERASE = #CDDS_ITEM | #CDDS_POSTERASE 
#CDDS_ITEMPOSTPAINT = #CDDS_ITEM | #CDDS_POSTPAINT 
#CDDS_ITEMPREERASE = #CDDS_ITEM | #CDDS_PREERASE 
#CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT 
#CDDS_SUBITEM = $20000 

#CDRF_DODEFAULT = 0 
#CDRF_NEWFONT = 2 
#CDRF_NOTIFYITEMDRAW = $20 
#CDRF_NOTIFYPOSTERASE = $40 
#CDRF_NOTIFYPOSTPAINT = $10 
#CDRF_NOTIFYSUBITEMDRAW = $20 
#CDRF_SKIPDEFAULT = 4 

#TVM_SETBKCOLOR = #TV_FIRST + 29

hBrush = CreateSolidBrush_(RGB(90,30,40))
Global hBrush
Procedure myWindowCallback(WindowID,Message,wparam,lParam) 
  result=#PB_ProcessPureBasicEvents 
  Select Message 
    Case  #WM_NOTIFY 
      *tvCD.NMTVCUSTOMDRAW=lParam 
      If *tvCD\nmcd\hdr\hwndFrom=GadgetID(#TreeGadget) And *tvCD\nmcd\hdr\code=#NM_CUSTOMDRAW    
        Select *tvCD\nmcd\dwDrawStage 
          Case #CDDS_PREPAINT:ProcedureReturn #CDRF_NOTIFYITEMDRAW
          Case #CDDS_ITEMPREPAINT: ProcedureReturn #CDRF_NOTIFYPOSTPAINT
          Case #CDDS_ITEMPOSTPAINT 
            thisItem=*tvCD\nmcd\dwItemSpec 
            tvItemRect.RECT\left=thisItem 
            SendMessage_(GadgetID(#TreeGadget),#TVM_GETITEMRECT,#True,@tvItemRect) 
            tvi.TV_ITEM 
            tvi$ = Space(256) 
            tvi\mask = #TVIF_HANDLE | #TVIF_PARAM | #TVIF_TEXT 
            tvi\pszText = @tvi$ 
            tvi\cchTextMax = 256 
            tvi\hItem=thisItem 
            tvFlags=#DT_END_ELLIPSIS 
            SendMessage_(GadgetID(#TreeGadget),#TVM_GETITEM,0,tvi) 
            tvi$=ReplaceString(tvi$,"[name]","Anthony") 
            SetTextColor_(*tvCD\nmcd\hdc,RGB(255,255,255))  
            FillRect_(*tvCD\nmcd\hdc, tvItemRect, hBrush)
            If *tvCD\nmcd\uItemState = #CDIS_FOCUS | #CDIS_SELECTED
              SetBkColor_(*tvCD\nmcd\hdc,RGB(190,130,140)) 
            Else
              SetBkColor_(*tvCD\nmcd\hdc,RGB(90,30,40)) 
            EndIf
            DrawText_(*tvCD\nmcd\hdc,tvi$,Len(tvi$),tvItemRect,tvFlags) 
            ProcedureReturn #CDRF_DODEFAULT
        EndSelect 
      EndIf 
  EndSelect 
  ProcedureReturn result 
EndProcedure 

If OpenWindow(#MainWindow,0,0,355,180,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"TreeGadget") And CreateGadgetList(WindowID(0)) 
  TreeGadget(#TreeGadget, 10,10,330,160)  
  AddGadgetItem (#TreeGadget,-1,"The following bit will change [name], heheh!") 
  AddGadgetItem (#TreeGadget,-1,"This is a node, click slightly to the left of the text") 
  OpenTreeGadgetNode(#TreeGadget) 
  AddGadgetItem(#TreeGadget,-1,"sub text") 
  AddGadgetItem(#TreeGadget,-1,"another change test: [name] !!!") 
  CloseTreeGadgetNode(#TreeGadget) 
  SetWindowCallback(@myWindowCallback()) 
  SendMessage_(GadgetID(#TreeGadget), #TVM_SETBKCOLOR, 0, RGB(90,30,40))
  Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow 
  DeleteObject_(hBrush)
EndIf
What goes around comes around.

PB 5.21 LTS (x86) - Windows 8.1
User avatar
DoubleDutch
Addict
Addict
Posts: 3220
Joined: Thu Aug 07, 2003 7:01 pm
Location: United Kingdom
Contact:

Post by DoubleDutch »

That appears to work great, thanks! :)
https://deluxepixel.com <- My Business website
https://reportcomplete.com <- School end of term reports system
Post Reply