ListIcon Multiline teilweiße färben

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

ListIcon Multiline teilweiße färben

Beitrag von Lambda »

ist es möglich eine multiline ListIcon zelle mit 2
unterschiedlichen schriftfarben zu erstellen?

wenn die zellengröße vergrößert wurde kann
ja ein umbruch durch chr(13) eingefügt werden, aber
ich möchte den text der nächsten zeile in grau.

api guru gesucht ^^
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: ListIcon Multiline teilweiße färben

Beitrag von ts-soft »

Angepasste Version: ListIcon_Font+Color.pb (CodeArchiv)

Code: Alles auswählen

; German forum:
; Author: RedZack (updated for PB4.00 by blbltheworm)
; Date: 06. November 2002
; OS: Windows
; Demo: No

; Edit 31.5.2003 by Andre - removed FakeEndSelect
; Edit 18.06.2011 by ts-soft (div. aktualisierungen)
; ------------------------------------------------------------ 
;   Zeilen in einem ListIconGadget einfärben und 
;   verschiedene Zeichensätze benutzen 
; ------------------------------------------------------------ 
; 
; Benötigte Strukturen und Konstanten 
; 
EnableExplicit

#CDDS_PREPAINT       = $00000001 
#CDRF_NOTIFYITEMDRAW = $00000020 
#CDRF_NEWFONT        = $00000002 
#CDDS_ITEM           = $00010000 

#CDDS_ITEMPREPAINT   = #CDDS_ITEM |  #CDDS_PREPAINT 

#LI_ICON_GADGET      = 1 
#LI_ICON1_GADGET     = 2 

; 
; Hier werden die Zeile eingefärbt 
; 

Procedure Color_ListIconGadger ( lParam, color, colorbk) 
  Protected Result = 0 
  Protected *nml.NMLVCUSTOMDRAW = lParam 
  ; CustomDraw Struktur kopieren 
  
  Select *nml\nmcd\dwDrawStage 
      ; Windows mitteilen das jede Zeile einzeln gezeichnet werden 
      ; sollen 
    Case #CDDS_PREPAINT     : Result = #CDRF_NOTIFYITEMDRAW 
      
    Case #CDDS_ITEMPREPAINT :  ;Den 2ten Eintrag von #LI_ICON_GADGET gesondert einfärben 
      If *nml\nmcd\dwItemSpec = 2 And *nml\nmcd\hdr\idFrom = #LI_ICON_GADGET 
        *nml\clrTextBk = $00EAEA00 
        *nml\clrText = $00FF0000 
        ; 
        ; Einen neuen Zeichensatz 
        SelectObject_(*nml\nmcd\hDC, LoadFont (0, "Courier", 3)); 
        ; Das Ganze zurück 
        Result = #CDRF_NEWFONT 
      Else 
        If *nml\nmcd\dwItemSpec % 2 = 0 
          *nml\clrTextBk = colorbk 
          *nml\clrText = color 
          ; 
          ; Einen neuen Zeichensatz 
          SelectObject_(*nml\nmcd\hDC, LoadFont (0, "Courier", 3)); 
          ; Das Ganze zurück 
          Result = #CDRF_NEWFONT 
        Else 
          ;Bei jedem 4ten Listeneintrag die 
          ; Farbe und Font ändern 
          If *nml\nmcd\dwItemSpec % 4 = 1 
            *nml\clrTextBk = color 
            *nml\clrText = colorbk 
            ; Einen neuen Zeichensatz 
            SelectObject_(*nml\nmcd\hDC, LoadFont (0, "Verdana", 6))
            Result = #CDRF_NEWFONT 
          EndIf 
        EndIf 
      EndIf    
  EndSelect 
  
  ProcedureReturn Result 
EndProcedure 

; 
; Windows messages verarbeiten 
; 

Procedure WndProc(hWnd,Msg,wParam,lParam) 
  Protected *hdr.NMHDR, colorbk, color
  
  Select Msg 
      ; MW_NOTIFY message auswerten 
    Case #WM_NOTIFY : *hdr.NMHDR = lParam 
      ; Das ListIconGadget steht in wParam 
      ; EventGadgetID() funktioniert hier leider nicht 
      If wParam = #LI_ICON_GADGET Or wParam = #LI_ICON1_GADGET 
        Select wParam 
          Case #LI_ICON_GADGET  : colorbk = $00EAEAEA 
            color   = $00303030 
            
          Case #LI_ICON1_GADGET : colorbk = $00303030 
            color   = $0000FFFF 
            
        EndSelect 
        ; Zeichnet das ListIconGadget ? 
        If *hdr\code = #NM_CUSTOMDRAW 
          ; Ja, dann einfärben 
          ; FakeEndSelect ist einfach Sch....., bei anderen 
          ; Programmiersprachen  geht das auch ohne! 
          ProcedureReturn Color_ListIconGadger ( lParam, color, colorbk ) 
        EndIf 
      EndIf 
    Default
      ProcedureReturn #PB_ProcessPureBasicEvents 
  EndSelect 
  
  
  ProcedureReturn 0 
EndProcedure 

; 
; Programmstart 
; 

Define x

If OpenWindow(1, 250, 250, 420, 215, "Color - ListIconGadget Demo", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget) 
  
  SetWindowCallback(@WndProc()) 
  
  ListIconGadget(#LI_ICON1_GADGET,10,10, 95,191," Sonst was ",75, #PB_ListIcon_FullRowSelect) 
  For x = 0 To 20 
    AddGadgetItem(#LI_ICON1_GADGET ,-1, "Eintrag " + Str(x)) 
  Next 
  
  ListIconGadget(#LI_ICON_GADGET ,110,10,300,191,"Spalte 1",100,#PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect) 
  AddGadgetColumn(#LI_ICON_GADGET ,2, "Spalte 2", 100) 
  AddGadgetColumn(#LI_ICON_GADGET ,3, "Spalte 3", 100)    
  For x = 0 To 20 
    AddGadgetItem(#LI_ICON_GADGET ,-1, "Eintrag " + Str(x) + Chr(10) + "Irgendwas " + Chr(10) + "Irgendwas " ) 
  Next 
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow 
  
EndIf 
Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: ListIcon Multiline teilweiße färben

Beitrag von Lambda »

danke aber das ist leider nicht die richtige lösung^^

wenn das hier eine zelle wär
_______________
|Das ist ein text |
|aber hier anders |
also innerhalb der zelle den text umfärben nach dem zeilenumbruch.
hab schon auf msdn gesucht aber ich stoße nur auf LVM_SETINSERTMARKCOLOR
aber ich weiß nicht ob das das richtige ist.. bzw wie es angewendet wird.,
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: ListIcon Multiline teilweiße färben

Beitrag von ts-soft »

Ganz falsch ist das obiges Beispiel aber nicht. Über *nml\nmcd\ kommst Du an den hDC sowie an RC,
also die Grösse und den DeviceContext zum malen. Jetzt muss da nur noch mit DrawText_() API hinein-
gemalt werden. Aber beim Malen und berechnen muss Dir jetzt noch ein anderer Helfen, ist nicht mein
Ding :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten