Custom ListIconGadget

Anfängerfragen zum Programmieren mit PureBasic.
interfind
Beiträge: 12
Registriert: 04.02.2022 10:41

Custom ListIconGadget

Beitrag von interfind »

Hallo,

ich bekomme es nicht hin beim Header eines ListViewGadget
die Farbe zu ändern.

Ich habe einen WindowCallback in dem das passieren soll.

SetTextColor_(*LVCDHeader\nmcd\hdc, #Blue) ;<--- GEHT NICHT!!!

Vielleicht kann ja mal ein Profi drüber schauen.
Sollte eigentlich nur ne Kleinigkeit sein die da nicht passt ;)

Hier der Code dazu:

Code: Alles auswählen

Global FontReg  = LoadFont(0, "Arial", 8)
Global FontBold = LoadFont(1, "Arial", 8, #PB_Font_Bold)

Procedure NotifyCallback(WindowID, Message, wParam, lParam)
; Textfarbe, Hintergrund, Font bei ListView Zeilen und Spalten ändern
  ; process NOTIFY message only
  If Message = #WM_NOTIFY
    ; set stucture pointer
    *LVCDHeader.NMLVCUSTOMDRAW = lParam
    ; CUSTOMDRAW message from desired gadget?
    If *LVCDHeader\nmcd\hdr\hWndFrom = GadgetID(200) And *LVCDHeader\nmcd\hdr\code = #NM_CUSTOMDRAW
      Select *LVCDHeader\nmcd\dwDrawStage
        Case #CDDS_PREPAINT
          ProcedureReturn #CDRF_NOTIFYITEMDRAW
        Case #CDDS_ITEMPREPAINT
          Protected *NMCUSTOMDRAW.NMCUSTOMDRAW

       SetTextColor_(*LVCDHeader\nmcd\hdc, #Blue) ;<--- GEHT NICHT!!!
          
          SendMessage_(*LVCDHeader\nmcd\hdr\hwndFrom, #WM_SETFONT, FontBold, 1)
          
          ProcedureReturn #CDRF_NOTIFYSUBITEMDRAW
        Case #CDDS_SUBITEMPREPAINT

          Row = *LVCDHeader\nmcd\dwItemSpec
          Col = *LVCDHeader\iSubItem

          If Row=0
            SelectObject_(*LVCDHeader\nmcd\hDC, FontBold)
          Else
            SelectObject_(*LVCDHeader\nmcd\hDC, FontReg)
          EndIf

          If Row=1
            *LVCDHeader\clrText = RGB(255, 255, 255)
            *LVCDHeader\clrTextBk = RGB(0, 255, 0)
          If Col=1
            *LVCDHeader\clrText = RGB(250, 0, 0)
          EndIf

          Else
           *LVCDHeader\clrTextBk = RGB(210, 210, 210)

          If Col = 3
           *LVCDHeader\clrText = RGB(0, 0, 255)
          EndIf

          EndIf
          ProcedureReturn #CDRF_NEWFONT
      EndSelect
    EndIf
  Else
    ProcedureReturn #PB_ProcessPureBasicEvents
  EndIf
EndProcedure



If OpenWindow(0, #PB_Ignore, #PB_Ignore, 400, 300, "Custom ListView Gadget",
              #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
  ListIconGadget(200, 10, 10, 380, 280, "Custom", 70, #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
  For a=1 To 5: AddGadgetColumn(200, a, "Spalte " + Str(a), 60): Next a
  AddGadgetItem(200, -1, "Zeile 1" + Chr(#LF) + "1" + Chr(#LF) + "2"+ Chr(#LF) + "3" + Chr(#LF) + "4" + Chr(#LF) + "5")
  AddGadgetItem(200, -1, "Zeile 2" + Chr(#LF) + "1" + Chr(#LF) + "2"+ Chr(#LF) + "3" + Chr(#LF) + "4" + Chr(#LF) + "5")
EndIf


SetWindowCallback(@NotifyCallback())


Repeat
    Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
End
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: Custom ListIconGadget

Beitrag von Shardik »

Schaue einmal in diesen Thread im englischen Forum, in dem ich gezeigt habe, wie man in einem ListIconGadget die Textfarbe in der Titelzeile von allen Spalten oder nur von einer Spalte (späteres Posting) ändert.
interfind
Beiträge: 12
Registriert: 04.02.2022 10:41

Re: Custom ListIconGadget

Beitrag von interfind »

Hab ich mir schon angesehen.
Ich würde aber gerne im gleichen Callback
auch die Farbe der einzelnen Zeilen ändern können.
interfind
Beiträge: 12
Registriert: 04.02.2022 10:41

Re: Custom ListIconGadget

Beitrag von interfind »

Guten Morgen,

hab es jetzt selbst rausgefunden und was zusammengebastelt.
Seht ihr hier noch Optimierungsmöglichkeiten?

Code: Alles auswählen

Global FontStd  = LoadFont(0, "Arial", 8)
Global FontBold = LoadFont(1, "Arial", 8, #PB_Font_Bold)

;Textfarbe, Hintergrund, Fontstyle bei ListView Zeilen und Spalten ändern
Procedure NotifyCallback(WindowID, Message, wParam, lParam)

  If Message = #WM_NOTIFY
    
    *LVCDHeader.NMLVCUSTOMDRAW = lParam; Stucturepointer
    LVHeader = SendMessage_(GadgetID(200), #LVM_GETHEADER, 0, 0); hwnd vom Header
    LVList   = GadgetID(200); hwnd des Listeninhalts

    ;Listview-Header Schriftfarbe=Rot / Fontstyle=Fett
    If *LVCDHeader\nmcd\hdr\hWndFrom = LVHeader And *LVCDHeader\nmcd\hdr\code = #NM_CUSTOMDRAW
      Select *LVCDHeader\nmcd\dwDrawStage
        Case #CDDS_PREPAINT
          ProcedureReturn #CDRF_NOTIFYITEMDRAW
        Case #CDDS_ITEMPREPAINT
          Protected *NMCUSTOMDRAW.NMCUSTOMDRAW
          SetTextColor_(*LVCDHeader\nmcd\hdc, #Red)  
          SelectObject_(*LVCDHeader\nmcd\hdc, FontBold)
          ProcedureReturn #CDRF_NOTIFYSUBITEMDRAW         
        Case #CDDS_SUBITEMPREPAINT         
          ProcedureReturn #CDRF_NEWFONT   
      EndSelect
     EndIf

     ;ListView-Listeninhalt Schriftfarbe, Hintergrund und Fontstyle
     If *LVCDHeader\nmcd\hdr\hWndFrom = LVList And *LVCDHeader\nmcd\hdr\code = #NM_CUSTOMDRAW
      Select *LVCDHeader\nmcd\dwDrawStage
        Case #CDDS_PREPAINT
          ProcedureReturn #CDRF_NOTIFYITEMDRAW
        Case #CDDS_ITEMPREPAINT
         ProcedureReturn #CDRF_NOTIFYSUBITEMDRAW
        Case #CDDS_SUBITEMPREPAINT

          Row = *LVCDHeader\nmcd\dwItemSpec
          Col = *LVCDHeader\iSubItem

          If Row = 0
            SelectObject_(*LVCDHeader\nmcd\hdc, FontBold)
          Else
            SelectObject_(*LVCDHeader\nmcd\hdc, FontStd)
          EndIf

          If Row = 1
            *LVCDHeader\clrText = RGB(255, 255, 255)
            *LVCDHeader\clrTextBk = RGB(0, 255, 0)
          If Col=1
            *LVCDHeader\clrText = RGB(250, 0, 0)
          EndIf

          Else
           *LVCDHeader\clrTextBk = RGB(220, 220, 220)

          If Col = 3
           *LVCDHeader\clrText = RGB(0, 0, 255)
          EndIf

          EndIf
          ProcedureReturn #CDRF_NEWFONT
      EndSelect
    EndIf
  Else
    ProcedureReturn #PB_ProcessPureBasicEvents
  EndIf
EndProcedure

If OpenWindow(0, #PB_Ignore, #PB_Ignore, 400, 300, "Custom ListView Gadget",
              #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered)
  ListIconGadget(200, 10, 10, 380, 280, "Custom", 70, #PB_ListIcon_GridLines|#PB_ListIcon_FullRowSelect)
  For a=1 To 5: AddGadgetColumn(200, a, "Spalte " + Str(a), 60): Next a
  AddGadgetItem(200, -1, "Zeile 1" + Chr(#LF) + "1" + Chr(#LF) + "2"+ Chr(#LF) + "3" + Chr(#LF) + "4" + Chr(#LF) + "5")
  AddGadgetItem(200, -1, "Zeile 2" + Chr(#LF) + "1" + Chr(#LF) + "2"+ Chr(#LF) + "3" + Chr(#LF) + "4" + Chr(#LF) + "5")
EndIf

SetWindowCallback(@NotifyCallback(), 0)

Repeat: Until WaitWindowEvent() = #PB_Event_CloseWindow
End
Antworten