Seite 1 von 2

TreeGadget Item Font

Verfasst: 22.04.2012 23:34
von Lambda
Ich möchte die Schriftart eines einzelnen Items ändern. Habe dazu schon ein Code gefunden, allerdings werden die TreeGadgets in eine LinkedList gespeichert. Zudem kommt das durch den Wert von SetGadgetItemData() bestimmt wird wie es "umgestyled" wird.

Code: Alles auswählen

#CDDS_ITEM = $10000
#CDDS_PREPAINT = 1
#CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT
#CDRF_NEWFONT = 2
#CDRF_NOTIFYITEMDRAW = $20
#CDRF_DODEFAULT = 0
; --> Load our underline font
Global hFont
hFont = LoadFont(0, "Courier New", 8, #PB_Font_Underline)

Procedure WinCallback(hwnd, msg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents
  Select msg
    Case #WM_NOTIFY
      *pNMHDR.NMHDR = lParam
      If *pNMHDR\code = #NM_CUSTOMDRAW And *pNMHDR\hwndFrom = GadgetID(1)
        *pTVcd.NMTVCUSTOMDRAW = lParam
        Select *pTVcd\nmcd\dwDrawStage
          Case #CDDS_PREPAINT
            result = #CDRF_NOTIFYITEMDRAW
          Case #CDDS_ITEMPREPAINT
            ; --> Here we get the text of the TreeGadget item being drawn
            tvi.TV_ITEM\mask = #TVIF_TEXT | #TVIF_HANDLE
            tviText$ = Space(100)
            tvi\pszText = @tviText$
            tvi\cchTextMax = 100
            tvi\hItem = *pTVcd\nmcd\dwItemSpec
            SendMessage_(*pNMHDR\hwndFrom, #TVM_GETITEM, 0, @tvi)
            ; --> Now we underline "Item 0" and "Item 4" in blue
            Select tviText$
              Case "Item 0"
                ; --> Select underlined font into item 0 dc
                SelectObject_(*pTVcd\nmcd\hdc, hFont)
                SetTextColor_(*pTVcd\nmcd\hdc, RGB(0, 0, 255))
                result = #CDRF_NEWFONT
              Case "Item 4"
                ; --> Select underlined font into item 4 dc
                SelectObject_(*pTVcd\nmcd\hdc, hFont)
                SetTextColor_(*pTVcd\nmcd\hdc, RGB(0, 200, 255))
                result = #CDRF_NEWFONT
              Default
                result = #CDRF_DODEFAULT
            EndSelect
        EndSelect
      EndIf
  EndSelect
  ProcedureReturn result
EndProcedure
If OpenWindow(0, 0, 0, 355, 180, "",#PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0))
  TreeGadget(1, 10, 10, 160, 160)

  SetWindowCallback(@WinCallback())
  For i = 0 To 10
    AddGadgetItem (1, -1, "Item "+Str(i))
    SetGadgetItemData(1,0,-1)
  Next i
  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow
EndIf
End

Re: TreeGadget Item Font

Verfasst: 23.04.2012 00:00
von c4s
Ja.

Re: TreeGadget Item Font

Verfasst: 23.04.2012 08:30
von The Shark
Oder um es anders auszudrücken: Wo ist die Frage?

Re: TreeGadget Item Font

Verfasst: 23.04.2012 10:31
von Lambda
Um es kurz zu fassen :D ich muss aus *pNMHDR\hwndFrom wieder die PureBasic GadgetNummer bekommen da ich durch den Wert von GetGadgetData() prüfe ob das Gadget geändert wird.

Re: TreeGadget Item Font

Verfasst: 23.04.2012 10:45
von Danilo
cOoki3druqs hat geschrieben:Um es kurz zu fassen :D ich muss aus *pNMHDR\hwndFrom wieder die PureBasic GadgetNummer bekommen da ich durch den Wert von GetGadgetData() prüfe ob das Gadget geändert wird.

Code: Alles auswählen

gadget = GetWindowLongPtr_(*pNMHDR\hwndFrom,#GWL_ID)
Und das Item ist dann tvi\lParam:

Code: Alles auswählen

#CDDS_ITEM = $10000
#CDDS_PREPAINT = 1
#CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT
#CDRF_NEWFONT = 2
#CDRF_NOTIFYITEMDRAW = $20
#CDRF_DODEFAULT = 0
; --> Load our underline font
Global hFont
hFont = LoadFont(0, "Arial", 8, #PB_Font_Underline)

Procedure WinCallback(hwnd, msg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents
  Select msg
    Case #WM_NOTIFY
      *pNMHDR.NMHDR = lParam
      gadget = GetWindowLongPtr_(*pNMHDR\hwndFrom,#GWL_ID)
      If *pNMHDR\code = #NM_CUSTOMDRAW And *pNMHDR\hwndFrom = GadgetID(2)
        *pTVcd.NMTVCUSTOMDRAW = lParam
        Select *pTVcd\nmcd\dwDrawStage
          Case #CDDS_PREPAINT
            result = #CDRF_NOTIFYITEMDRAW
          Case #CDDS_ITEMPREPAINT

            tvi.TV_ITEM\mask = #TVIF_PARAM | #TVIF_HANDLE
            tvi\hItem = *pTVcd\nmcd\dwItemSpec
            SendMessage_(*pNMHDR\hwndFrom, #TVM_GETITEM, 0, @tvi)

            If GetGadgetItemData(gadget,tvi\lParam) = 1
                SelectObject_(*pTVcd\nmcd\hdc, hFont)
                SetTextColor_(*pTVcd\nmcd\hdc, RGB(0, 0, 255))
                result = #CDRF_NEWFONT|#CDRF_DODEFAULT
            Else
                result = #CDRF_DODEFAULT
            EndIf
        EndSelect
      EndIf
  EndSelect
  ProcedureReturn result
EndProcedure
If OpenWindow(0, 0, 0, 355, 180, "",#PB_Window_SystemMenu | #PB_Window_ScreenCentered) ;And CreateGadgetList(WindowID(0))
  TreeGadget(2, 10, 10, 160, 160)

  SetWindowCallback(@WinCallback())
  For i = 0 To 10
    AddGadgetItem (2, -1, "Item "+Str(i))
    SetGadgetItemData(2,0,-1)
  Next i
  SetGadgetItemData(2,0,1) ; item 0 and 5
  SetGadgetItemData(2,5,1)
  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow
EndIf
Item 0 und 5 bekommen hier ein SetGadgetItemData mit 1, also wird diesen Items
ein neuer Font zugewiesen.

Re: TreeGadget Item Font

Verfasst: 23.04.2012 11:11
von Lambda
Hm, also wParam gibt scheinbar schon die GadgetID zurück. Anfangs funktioniert es noch, doch ändert sich das TreeGadget wird die Änderung gelöscht

Code: Alles auswählen

Select GetGadgetItemData(wParam, tvi\hItem)
              Case -1
                ; --> Select underlined font into item 0 dc
                SelectObject_(*pTVcd\nmcd\hdc, FontID(Font_MB))
                SetTextColor_(*pTVcd\nmcd\hdc, RGB(0, 0, 255))
                result = #CDRF_NEWFONT
              Default
                result = #CDRF_DODEFAULT
EndSelect
Das Item hat weiterhin -1 als Wert.

Re: TreeGadget Item Font

Verfasst: 23.04.2012 11:15
von Lambda
Vielen Dank Danilo :allright: so geht es.

Re: TreeGadget Item Font

Verfasst: 23.04.2012 11:16
von Danilo
tvi\hItem ist das Handle des Items, das musst Du noch übersetzen. Siehe mein letzter Code, dann ist
die Item-Nummer in tvi\lParam.

EDIT: OK, bissl zeitliche Überschneidungen hier, oder Fehler in der Matrix. ;)

Re: TreeGadget Item Font

Verfasst: 23.04.2012 11:23
von Lambda
Wie kommt es eigentlich das die Farbe bei XP-Skin nichtmehr genommen wird ^^

Re: TreeGadget Item Font

Verfasst: 23.04.2012 11:35
von Danilo
cOoki3druqs hat geschrieben:Wie kommt es eigentlich das die Farbe bei XP-Skin nichtmehr genommen wird ^^
Ist wohl so ein Style-Ding. Mußt Du es eben alles selbst zeichnen.

Code: Alles auswählen

#CDDS_ITEM = $10000
#CDDS_PREPAINT = 1
#CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT
#CDRF_NEWFONT = 2
#CDRF_NOTIFYITEMDRAW = $20
#CDRF_DODEFAULT = 0
; --> Load our underline font
Global hFont
hFont = LoadFont(0, "Arial", 8, #PB_Font_Underline)

Procedure WinCallback(hwnd, msg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents
  Select msg
    Case #WM_NOTIFY
      *pNMHDR.NMHDR = lParam
      gadget = GetWindowLongPtr_(*pNMHDR\hwndFrom,#GWL_ID)
      If *pNMHDR\code = #NM_CUSTOMDRAW And *pNMHDR\hwndFrom = GadgetID(2)
        *pTVcd.NMTVCUSTOMDRAW = lParam
        Select *pTVcd\nmcd\dwDrawStage
          Case #CDDS_PREPAINT
            result = #CDRF_NOTIFYITEMDRAW
          Case #CDDS_ITEMPREPAINT
            tvi.TV_ITEM\mask = #TVIF_TEXT | #TVIF_HANDLE | #TVIF_PARAM
            tviText$ = Space(100)
            tvi\pszText = @tviText$
            tvi\cchTextMax = 100
            tvi\hItem = *pTVcd\nmcd\dwItemSpec
            SendMessage_(*pNMHDR\hwndFrom, #TVM_GETITEM, 0, @tvi)

            If GetGadgetItemData(gadget,tvi\lParam) = 1
                SelectObject_(*pTVcd\nmcd\hdc, hFont)
                SetTextColor_(*pTVcd\nmcd\hdc, RGB(0, 0, 255))
                
                *pTVcd\nmcd\rc\left = 25
                DrawText_(*pTVcd\nmcd\hdc,tviText$,Len(tviText$),*pTVcd\nmcd\rc,0)
                
                result = #CDRF_NEWFONT|#CDRF_SKIPDEFAULT
            Else
                result = #CDRF_DODEFAULT
            EndIf
        EndSelect
      EndIf
  EndSelect
  ProcedureReturn result
EndProcedure
If OpenWindow(0, 0, 0, 355, 180, "",#PB_Window_SystemMenu | #PB_Window_ScreenCentered) ;And CreateGadgetList(WindowID(0))
  TreeGadget(2, 10, 10, 160, 160)

  SetWindowCallback(@WinCallback())
  For i = 0 To 10
    AddGadgetItem (2, -1, "Item "+Str(i))
    SetGadgetItemData(2,0,-1)
  Next i
  SetGadgetItemData(2,0,1) ; item 0 and 5
  SetGadgetItemData(2,5,1)
  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow
EndIf
EDIT:

Alle Items selbst gezeichnet:

Code: Alles auswählen

#CDDS_ITEM = $10000
#CDDS_PREPAINT = 1
#CDDS_ITEMPREPAINT = #CDDS_ITEM | #CDDS_PREPAINT
#CDRF_NEWFONT = 2
#CDRF_NOTIFYITEMDRAW = $20
#CDRF_DODEFAULT = 0
; --> Load our underline font
Global hFont
hFont = LoadFont(0, "Arial", 8, #PB_Font_Underline)

Procedure WinCallback(hwnd, msg, wParam, lParam)
  result = #PB_ProcessPureBasicEvents
  Select msg
    Case #WM_NOTIFY
      *pNMHDR.NMHDR = lParam
      gadget = GetWindowLongPtr_(*pNMHDR\hwndFrom,#GWL_ID)
      If *pNMHDR\code = #NM_CUSTOMDRAW And *pNMHDR\hwndFrom = GadgetID(2)
        *pTVcd.NMTVCUSTOMDRAW = lParam
        Select *pTVcd\nmcd\dwDrawStage
          Case #CDDS_PREPAINT
            result = #CDRF_NOTIFYITEMDRAW
          Case #CDDS_ITEMPREPAINT
            tvi.TV_ITEM\mask = #TVIF_TEXT | #TVIF_HANDLE | #TVIF_PARAM
            tviText$ = Space(100)
            tvi\pszText = @tviText$
            tvi\cchTextMax = 100
            tvi\hItem = *pTVcd\nmcd\dwItemSpec
            SendMessage_(*pNMHDR\hwndFrom, #TVM_GETITEM, 0, @tvi)

            If GetGadgetItemData(gadget,tvi\lParam) = 1
                SelectObject_(*pTVcd\nmcd\hdc, hFont)
                SetTextColor_(*pTVcd\nmcd\hdc, RGB(0, 0, 255))
            EndIf

            rc.RECT = *pTVcd\nmcd\rc
            rc\left = 15
            rc\right = 20
            rc\top   + 5
            rc\bottom - 6
            Rectangle_(*pTVcd\nmcd\hdc,rc\left,rc\top,rc\right,rc\bottom)
            *pTVcd\nmcd\rc\left = 25
            DrawText_(*pTVcd\nmcd\hdc,tviText$,Len(tviText$),*pTVcd\nmcd\rc,0)
                
            result = #CDRF_SKIPDEFAULT
        EndSelect
      EndIf
  EndSelect
  ProcedureReturn result
EndProcedure
If OpenWindow(0, 0, 0, 355, 180, "",#PB_Window_SystemMenu | #PB_Window_ScreenCentered) ;And CreateGadgetList(WindowID(0))
  TreeGadget(2, 10, 10, 160, 160)

  SetWindowCallback(@WinCallback())
  For i = 0 To 10
    AddGadgetItem (2, -1, "Item "+Str(i))
    SetGadgetItemData(2,0,-1)
  Next i
  SetGadgetItemData(2,0,1) ; item 0 and 5
  SetGadgetItemData(2,5,1)
  Repeat
    event = WaitWindowEvent()
  Until event = #PB_Event_CloseWindow
EndIf
Du musst also auch die Linien vor den Item selbst zeichnen. Im letzten Beispiel kleine Rechtecke.