TreeGadget Item Font

Für allgemeine Fragen zur Programmierung mit PureBasic.
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

TreeGadget Item Font

Beitrag 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
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: TreeGadget Item Font

Beitrag von c4s »

Ja.
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
The Shark
Beiträge: 37
Registriert: 03.03.2011 00:03

Re: TreeGadget Item Font

Beitrag von The Shark »

Oder um es anders auszudrücken: Wo ist die Frage?
Bild
Bild
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: TreeGadget Item Font

Beitrag 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.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: TreeGadget Item Font

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: TreeGadget Item Font

Beitrag 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.
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: TreeGadget Item Font

Beitrag von Lambda »

Vielen Dank Danilo :allright: so geht es.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: TreeGadget Item Font

Beitrag 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. ;)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: TreeGadget Item Font

Beitrag von Lambda »

Wie kommt es eigentlich das die Farbe bei XP-Skin nichtmehr genommen wird ^^
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: TreeGadget Item Font

Beitrag 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.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten