[Résolu] EditorGadget/ListIconGadget lignes en couleurs ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

[Résolu] EditorGadget/ListIconGadget lignes en couleurs ?

Message par Golfy »

Bonjour,

Dans un EditorGadget (en lecture seule pour éviter une saisie manuelle) je voudrais changer de couleur en fonction d'un état de flux : VERT pour un flux entrant et BLEU pour un flux sortant.
L'objectif est de faire une sorte d'analyseur réseau Velbus

Exemple d'affichage :
-> 0FF834020501D804
<- 0FFB2202E101CC04
...

Est-ce possible facilement et sous tous les OS (Linux, Windows, MAC éventuellement plus tard avec la 4.70)

Même question pour un ListIconGadget ?
Dernière modification par Golfy le mar. 14/août/2012 12:50, modifié 1 fois.
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: EditorGadget et/ou ListIconGadget ave lignes en couleurs

Message par kernadec »

bonjour Golfy
voilà, j'ai celui là...

Cordialement

Code : Tout sélectionner

;auteur cristian  forum english

;-- SetLIGadgetItemColor
#NM_CUSTOMDRAW       = -12   ; $FFFFFFF4

#CDRF_DODEFAULT = $0
#CDDS_PREPAINT       = 1     ; $00000001
#CDRF_NOTIFYITEMDRAW = 32    ; $00000020
#CDRF_NEWFONT        = 2     ; $00000002
#CDDS_ITEM           = 65536 ; $00010000

#CDDS_ITEMPREPAINT   = #CDDS_ITEM | #CDDS_PREPAINT

;- Constants
#Window_Main_ID = 0
#Window_Main_Width = 500
#Window_Main_Height = 500

#Gadget_ListIcon_ID = 0

;- Variables
Global WMID.l ; - Handle of the main window

;- Procedures
Procedure SetLIGadgetItemColor(GadgetID.l, lParam.l) 
  *nml.NMLVCUSTOMDRAW = lParam
  ; - Copy CustomDraw Structure 
  
  Select *nml\nmcd\dwDrawStage
    Case #CDDS_PREPAINT                        ; - tell Windows that every line has to be painted seperatly
      Result = #CDRF_NOTIFYITEMDRAW
      
    Case #CDDS_ITEMPREPAINT                    ; - colorize lines
      If *nml\nmcd\hdr\idFrom = GadgetID
        For a = 0 To CountGadgetItems(GadgetID)
          If *nml\nmcd\dwItemSpec = a
            ; - paint text red if column 2 is non-zero
            If GetGadgetItemText(GadgetID, a, 1) <> "0"
              *nml\clrTextBk = RGB(Random(200),Random(200),Random(200)) ; Background Color
              *nml\clrText   = RGB(255, 255, 255) ; Text Color
            Else
              *nml\clrTextBk = RGB(255, 255, 255) ; Background Color
              *nml\clrText   = RGB(  0,   0,   0) ; Text Color
            EndIf
            
            Result = #CDRF_NEWFONT
          EndIf
        Next a
      EndIf
  EndSelect
  
  ProcedureReturn Result
EndProcedure

Procedure ColorCallback(WindowID, Message, wParam, lParam)
  Result = #PB_ProcessPureBasicEvents 
  Select Message
      
    Case #WM_NOTIFY
      *hdr.NMHDR = lParam
      Select wParam
        Case #Gadget_ListIcon_ID ; - Your ListIconGadget
          If *hdr\code = #NM_CUSTOMDRAW
            Result = SetLIGadgetItemColor(#Gadget_ListIcon_ID, lParam)
          EndIf
      EndSelect
      
  EndSelect
  
  ProcedureReturn Result
EndProcedure

;- Program
WMID = OpenWindow(#Window_Main_ID, 0, 0, #Window_Main_Width, #Window_Main_Height, "ListIcon with Colored Lines", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If WMID
  
  ListIconGadget(#Gadget_ListIcon_ID, 0, 0, WindowWidth(#Window_Main_ID), WindowHeight(#Window_Main_ID), "Column 1", 150, #PB_ListIcon_FullRowSelect)
  AddGadgetColumn(#Gadget_ListIcon_ID, 1, "Column 2", WindowWidth(#Window_Main_ID)-155)
  For a = 0 To 50
    AddGadgetItem(#Gadget_ListIcon_ID, -1, "Line "+Str(a)+Chr(10)+"0")
    AddGadgetItem(#Gadget_ListIcon_ID, -1, "Line "+Str(a)+Chr(10)+"Non-Zero")
  Next a
  
  SetWindowCallback(@ColorCallback())
  
  Repeat
    Select WaitWindowEvent()
        
      Case #PB_Event_CloseWindow
        quit = #True 
        
    EndSelect
  Until quit = #True
EndIf

Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: EditorGadget et/ou ListIconGadget ave lignes en couleurs

Message par Backup »

....
Dernière modification par Backup le mar. 19/août/2014 10:13, modifié 1 fois.
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: EditorGadget et/ou ListIconGadget ave lignes en couleurs

Message par Golfy »

Merci Kermadec et Dobro.

@Dobro: Est-ce que je me trompe, ou bien à chaque fois que je vois un _ à la fin du procédure, cela signifie un appel à une API Windows ?
Dans ce cas, comment je gère le bidule sous Linux ? existe-t-il le même type d'API sous KDE ou Gnome ?
Exemple : SendMessage_

@Kermadec : question un peu identique sur la commande SetWindowCallback(@ColorCallback())
D'après la doc : Pour programmeurs expérimentés. Cette fonction est seulement disponible sous Microsoft Windows.

J'en conclus donc que si je veux être multi-plateforme, je vais devoir rester très sobre : ça tombe bien, j'aime bien le noir :roll:
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: EditorGadget et/ou ListIconGadget ave lignes en couleurs

Message par kernadec »

celui là devrait être multi... :D

Code : Tout sélectionner

;auteur kernadec aout 2012

OpenWindow(0,0,0,340,340, "test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)
ListIconGadget(0, 20, 20, 312, 290,"",0, #PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines|#PB_ListIcon_MultiSelect)
SetGadgetColor(0, #PB_Gadget_LineColor, RGB(255,0,0))
AddGadgetColumn(0, 1,"N°", 30)
AddGadgetColumn(0, 2,"Nom", 140)
AddGadgetColumn(0, 3,"Tel", 140)

For i = 1 To 36
  Str0$ = Str(i)
  Str1$ = "Nom"
  Str2$ = "1234567890"
  AddGadgetItem (0, -1,Chr(10)+Str0$+Chr(10)+Str1$+Chr(10)+Str2$)
  SetGadgetItemColor(0,i-1,#PB_Gadget_BackColor, RGB(100+Random(155),100+Random(155),100+Random(155)))
  SetGadgetItemColor(0,i-1,#PB_Gadget_FrontColor, RGB(Random(255),Random(255),Random(255)))
Next


Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow    
Dernière modification par kernadec le lun. 13/août/2012 20:42, modifié 3 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: EditorGadget et/ou ListIconGadget ave lignes en couleurs

Message par Backup »

Golfy a écrit :Merci Kermadec et Dobro.

@Dobro: Est-ce que je me trompe, ou bien à chaque fois que je vois un _ à la fin du procédure, cela signifie un appel à une API Windows ?
ha oui ... :oops: désolé
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: EditorGadget et/ou ListIconGadget ave lignes en couleurs

Message par Golfy »

kernadec a écrit :celui là devrait être multi... :D

Code : Tout sélectionner

;auteur kernadec aout 2012

OpenWindow(0,0,0,340,340, "test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)
ListIconGadget(0, 20, 20, 282, 290, "N°",0, #PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines|#PB_ListIcon_MultiSelect)
SetGadgetColor(0, #PB_Gadget_LineColor, RGB(255,0,0))
AddGadgetColumn(0, 1, "Nom", 130)
AddGadgetColumn(0, 2, "Tel", 130)

For i = 1 To 36
		Str0$=Str(i)
		Str1$ = "Nom"
		Str2$ = "1234567890"
		AddGadgetItem (0, -1,  Str0$+Chr(10)+Str1$+Chr(10)+Str2$)
		SetGadgetItemColor(0,i-1,#PB_Gadget_BackColor, RGB(100+Random(155),100+Random(155),100+Random(155)))
		SetGadgetItemColor(0,i-1,#PB_Gadget_FrontColor, RGB(Random(255),Random(255),Random(255)))
Next


Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow    
GEANT !
Merci Kermadec !!! je n'aurais pas cru qu'un code aussi simple soit suffisant : comme disait mon prof d'électronique :"ce qui se conçoit bien s'énonce clairement !"
Dernière modification par Golfy le lun. 13/août/2012 19:44, modifié 1 fois.
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: EditorGadget et/ou ListIconGadget ave lignes en couleurs

Message par Golfy »

Dobro a écrit :
Golfy a écrit : ha oui ... :oops: désolé
Pas grave... mon soucis étant de faire un outil pédagogique et utile, je recherche les codes les plus compatibles : c'est d'ailleurs pour ça que j'ai choisi Purebasic ! :)
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: EditorGadget et/ou ListIconGadget ave lignes en couleurs

Message par kernadec »

bonsoir Golfy
oui mais j'ai rencontré un problème que j'essaye de résoudre depuis tout a l'heure
la colonne n° refuse de se coller au départ du gadget, et laisse une bande sans couleur moche
je sais pas pourquoi :roll:

peut être à cause des checkbox ?

Cordialement

Code : Tout sélectionner

;auteur kernadec aout 2012

OpenWindow(0,0,0,340,340, "test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)
ListIconGadget(0, 20, 20, 312, 290, "N°",30, #PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines|#PB_ListIcon_MultiSelect)
SetGadgetColor(0, #PB_Gadget_LineColor, RGB(255,0,0))
AddGadgetColumn(0, 1, "Nom", 130)
AddGadgetColumn(0, 2, "Tel", 130)

For i = 1 To 36
		Str0$=Str(i)
		Str1$ = "Nom"
		Str2$ = "1234567890"
		AddGadgetItem (0, -1,Str0$+Chr(10)+Str1$+Chr(10)+Str2$)
		SetGadgetItemColor(0,i-1,#PB_Gadget_BackColor, RGB(100+Random(155),100+Random(155),100+Random(155)))
		SetGadgetItemColor(0,i-1,#PB_Gadget_FrontColor, RGB(Random(255),Random(255),Random(255)))
Next


Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow    
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: EditorGadget et/ou ListIconGadget ave lignes en couleurs

Message par kernadec »

voilà j'ai mis le premier petit code que j'ai posté à jour
pour avoir les numéros faut éviter la colonne de titre "0" du ListIconGadget
et créer une colonne identique ex:

Code : Tout sélectionner

AddGadgetColumn(0, 1,"N°", 30) 
et un chr(10) au départ de la ligne :

Code : Tout sélectionner

AddGadgetItem (0, -1,Chr(10)+ ;...etc.
cordialement
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: EditorGadget et/ou ListIconGadget ave lignes en couleurs

Message par Golfy »

Tu as raison de corriger (pour ceux qui cherchent comment faire, c'est toujours plus facile)...
Dans mon cas, je ne colorie pas le background mais le texte : cela ne gênait donc pas :)
Ci-dessous un simili de ce dont j'ai besoin 8)

Code : Tout sélectionner

;auteur kernadec aout 2012
; modif Golfy (seulement couleur de texte + clignotement d'une ligne)
OpenWindow(0,0,0,340,340, "test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)
ListIconGadget(0, 20, 20, 282, 290, "N°",30, #PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines|#PB_ListIcon_MultiSelect)
SetGadgetColor(0, #PB_Gadget_LineColor, RGB(100,0,0))
AddGadgetColumn(0, 1, "Heure", 70)
AddGadgetColumn(0, 2, "Frame", 170)

tx=RGB(50,50,200)
rx=RGB(50,200,50)
er=RGB(200,50,50)

For i = 1 To 15
      Str0$=Str(i)
			str1$=FormatDate("%hh:%ii:%ss",Date())
			Str2$=Hex(Random(10000000))
      AddGadgetItem (0, 0,  Str0$+Chr(10)+Str1$+Chr(10)+Str2$)
      x=Random(100)
      ;SetGadgetItemColor(0,i-1,#PB_Gadget_BackColor, RGB(100+Random(155),100,100))
      If x < 50
      	SetGadgetItemColor(0,0,#PB_Gadget_FrontColor, rx)
      ElseIf x > 80
      	SetGadgetItemColor(0,0,#PB_Gadget_FrontColor, er)
      Else
      	SetGadgetItemColor(0,0,#PB_Gadget_FrontColor, tx)
      EndIf 
Next

d=ElapsedMilliseconds()
Repeat 
	a = WaitWindowEvent(10)
	If ElapsedMilliseconds()-d > Random(300)+200
		str1$=FormatDate("%hh:%ii:%ss",Date())
		Str2$=Hex(Random(10000000))
		AddGadgetItem (0, 0,  Str0$+Chr(10)+Str1$+Chr(10)+Str2$)
    x=Random(100)
    ;SetGadgetItemColor(0,i-1,#PB_Gadget_BackColor, RGB(100+Random(155),100,100))
    If x < 50
    	SetGadgetItemColor(0,0,#PB_Gadget_FrontColor, rx)
    ElseIf x > 80
    	SetGadgetItemColor(0,0,#PB_Gadget_FrontColor, er)
    Else
    	SetGadgetItemColor(0,0,#PB_Gadget_FrontColor, tx)
    EndIf
    d= ElapsedMilliseconds()
    RemoveGadgetItem(0,15)
	EndIf
Until a = #PB_Event_CloseWindow    
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: EditorGadget et/ou ListIconGadget ave lignes en couleurs

Message par kernadec »

" Fantaisie Software " :mrgreen: :D :idea:

Cordialement

Code : Tout sélectionner

;auteur kernadec aout 2012
; modif Golfy (seulement couleur de texte + clignotement d'une ligne)
OpenWindow(0,0,0,340,340, "test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)
ListIconGadget(0, 20, 20, 274, 290, "",0, #PB_ListIcon_FullRowSelect|#PB_ListIcon_GridLines|#PB_ListIcon_MultiSelect)
SetGadgetColor(0, #PB_Gadget_LineColor, RGB(100,0,0))
AddGadgetColumn(0, 1, "N°", 30)
AddGadgetColumn(0, 2, "Heure", 70)
AddGadgetColumn(0, 3, "Frame", 170)

tx=RGB(50,50,200)
rx=RGB(50,200,50)
er=RGB(200,50,50)

For i = 1 To 15
  Str0$=Str(i)
  str1$=FormatDate("%hh:%ii:%ss",Date())
  Str2$=Hex(Random(10000000))
  AddGadgetItem (0, 0,Chr(10)+Str0$+Chr(10)+Str1$+Chr(10)+Str2$)
  x=Random(100)
  SetGadgetItemColor(0,0,#PB_Gadget_BackColor, RGB(250,250,100+Random(155)),2)
  SetGadgetItemColor(0,0,#PB_Gadget_BackColor, RGB(250,100+Random(155),250),1)
  SetGadgetItemColor(0,0,#PB_Gadget_BackColor, RGB(100+Random(155),250,250),3)
  If x < 50
    SetGadgetItemColor(0,0,#PB_Gadget_FrontColor, rx)
  ElseIf x > 80
    SetGadgetItemColor(0,0,#PB_Gadget_FrontColor, er)
  Else
    SetGadgetItemColor(0,0,#PB_Gadget_FrontColor, tx)
  EndIf 
Next

d=ElapsedMilliseconds()
Repeat 
  a = WaitWindowEvent(10)
  If ElapsedMilliseconds()-d > Random(300)+200
    i+1
    If i>15
      i=1
    EndIf
    str1$=FormatDate("%hh:%ii:%ss",Date())
    Str2$=Hex(Random(10000000))
    AddGadgetItem (0, 0,Chr(10)+Str(i)+Chr(10)+Str1$+Chr(10)+Str2$)
    x=Random(100)
    SetGadgetItemColor(0,0,#PB_Gadget_BackColor, RGB(250,250,100+Random(155)),2)
    SetGadgetItemColor(0,0,#PB_Gadget_BackColor, RGB(250,100+Random(155),250),1)
    SetGadgetItemColor(0,0,#PB_Gadget_BackColor, RGB(100+Random(155),250,250),3)
    If x < 50
      SetGadgetItemColor(0,0,#PB_Gadget_FrontColor, rx)
    ElseIf x > 80
      SetGadgetItemColor(0,0,#PB_Gadget_FrontColor, er)
    Else
      SetGadgetItemColor(0,0,#PB_Gadget_FrontColor, tx)
    EndIf
    d= ElapsedMilliseconds()
    RemoveGadgetItem(0,15)
  EndIf
Until a = #PB_Event_CloseWindow    
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: [Résolu] EditorGadget/ListIconGadget lignes en couleurs

Message par Golfy »

A Noter : sous Windows, la liste reste en haut (l'ascenseur rétrécit mais ne descend pas). Sous linux (Ubuntu + Xfce4) la liste descend avec l'ascenseur ; du coup on ne voit que les premiers messages... bizarre comme comportement 8O
Faut-il faire une demande à Fred ?
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: [Résolu] EditorGadget/ListIconGadget lignes en couleurs

Message par SPH »

Golfy a écrit :Faut-il faire une demande à Fred ?
Je dirais oui moi

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Répondre