De la couleur dans la Status Bar!

Partagez votre expérience de PureBasic avec les autres utilisateurs.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

De la couleur dans la Status Bar!

Message par nico »

Code : Tout sélectionner

; By Nico
; Pure Basic, Version:3.92
; le 26/12/04

;/ Structure permettant l'affichage du texte dans la status Bar
;/ contenant les diverses informations que nous allons gérer.

Structure Status_Draw
  Texte.s
  couleur.l
  Font.l
  Emplacement.l
EndStructure

Enumeration 
  #Window_0 
EndEnumeration 

Enumeration 
  #Button
  #StatusBar
EndEnumeration 

Global Hstatus

;/ Constantes utilisées pour afficher le texte
#DT_SINGLELINE;le texte sera affiché en une seule ligne
#DT_TOP       ;le texte sera aligné vers le Haut,
              ; la constante #DT_SINGLELINE doit être spécifiée pour l'utiliser
#DT_BOTTOM    ;le texte sera aligné vers le Bas
              ; la constante #DT_SINGLELINE doit être spécifiée pour l'utiliser
#DT_VCENTER   ;le texte sera centré verticalement
              ; la constante #DT_SINGLELINE doit être spécifiée pour l'utiliser
#DT_CENTER    ;le texte sera centré Horizontalement
#DT_RIGHT     ;le texte sera aligné vers la Droite
#DT_LEFT      ;le texte sera aligné vers la Gauche

;/ Constantes utilisée pour afficher l'icône
#SB_SETICON=(#WM_USER) +15

Procedure WindowCallback(WindowID, Message, wParam, lParam) 
  result = #PB_ProcessPureBasicEvents 
  Select Message 
    Case #WM_DRAWITEM
      If wParam = GetDlgCtrlID_(Hstatus)
        *DrawItem.DRAWITEMSTRUCT = lParam 
        *pointeur.Status_Draw=*DrawItem\itemdata
        hFontOld = SelectObject_(*DrawItem\hDC,*pointeur\Font) 
        SetBkMode_(*DrawItem\hDC, #TRANSPARENT)
        SetTextColor_(*DrawItem\hDC, *pointeur\couleur ) 
        DrawText_(*DrawItem\hDC, *pointeur\Texte, -1, *DrawItem\rcItem , *pointeur\Emplacement)
        ProcedureReturn #True
      EndIf 
  EndSelect 
  ProcedureReturn result 
EndProcedure  

If OpenWindow(0, 100, 150, 300, 100, #PB_Window_SystemMenu | #PB_Window_SizeGadget, "De la couleur dans la Status Bar")
  SetWindowCallback(@WindowCallback()) 
  
  If CreateGadgetList(WindowID(0))
    ButtonGadget(#Button,10,10,280,20,"Changer le nom et la couleur du champ N°0 par Louis")
  EndIf 
  
  Hstatus= CreateStatusBar(#StatusBar, WindowID())
  ;/ Ajuster la hauteur de la Status Bar  
  SendMessage_(Hstatus, #SB_SETMINHEIGHT, 40, 0)
  
  ;/ Nécessaire pour le rafraichissement immédiat de la nouvelle taille
  SendMessage_(Hstatus, #WM_SIZE, 0,0)
  
  ;/ Création de trois Champs, 0, 1, et 2
  If Hstatus 
    AddStatusBarField(100)
    AddStatusBarField(50)
    AddStatusBarField(100)
  EndIf
  
  ;/ On remplit la structure pour le champ N°0 de la Status Bar
  Champ_0.Status_Draw
  Champ_0\Texte="Pierre"
  Champ_0\couleur=RGB(255,0,0)
  Champ_0\Font=hFont=LoadFont (0, "Courier", 20) 
  Champ_0\Emplacement=#DT_CENTER| #DT_VCENTER| #DT_SINGLELINE
  
  ;/ On remplit la structure pour le champ N°1 de la Status Bar  
  Champ_1.Status_Draw
  Champ_1\Texte="Paul"
  Champ_1\couleur=RGB(0,168,168)
  Champ_1\Font=hFont=LoadFont (1, "Courier", 8) 
  Champ_1\Emplacement=#DT_LEFT| #DT_BOTTOM| #DT_SINGLELINE
  
  ;/ On remplit la structure pour le champ N°2 de la Status Bar  
  Champ_2.Status_Draw
  Champ_2\Texte="Nico"
  Champ_2\couleur=RGB(0,0,255)
  Champ_2\Font=hFont=LoadFont (2, "Arial", 16)
  Champ_2\Emplacement=#DT_TOP|#DT_RIGHT| #DT_SINGLELINE
  
  ;/ Pointeur vers la Structure à afficher  
  *pointeur_champ0.Status_Draw=@Champ_0
  *pointeur_champ1.Status_Draw=@Champ_1
  *pointeur_champ2.Status_Draw=@Champ_2
  
  ;/ On envoie les différents pointeurs à la Status Bar  
  SendMessage_(Hstatus, #SB_SETTEXT, 0 | #SBT_OWNERDRAW ,*pointeur_champ0)
  SendMessage_(Hstatus, #SB_SETTEXT, 1 | #SBT_OWNERDRAW ,*pointeur_champ1)
  SendMessage_(Hstatus, #SB_SETTEXT, 2 | #SBT_OWNERDRAW ,*pointeur_champ2)
  
  ;/ Ajoute une icône dans le champ N°2    
  Hicon=LoadImage(0, "data\CdPlayer.ico")
  SendMessage_( Hstatus, #SB_SETICON, 2, Hicon)
  
  Repeat
    Event = WaitWindowEvent() 
    Select Event 
      Case #PB_EventGadget
        Select EventGadgetID()
          Case #Button
            ;/ Changement du Champ N°0  
            Champ_0.Status_Draw
            Champ_0\Texte="Louis"
            Champ_0\couleur=RGB(255,255,0)
            SendMessage_(Hstatus, #SB_SETTEXT, 0 | #SBT_OWNERDRAW ,*pointeur_champ0)
        EndSelect
        
      Case #WM_CLOSE
        CloseFont(0)
        CloseFont(1)
        CloseFont(2)
        Quit+1
    EndSelect 
  Until Quit=1
EndIf 
End
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Excellent ! :D

( entre paranthèses, ce serait bien que Fred nous fasse quelques fonctions de colorisation des gadgets, non ? Je vais aller lui demander de ce pas. )

Ton code me fait voir une possibilité que je n'aurais pas soupçonné. Dans mon esprit un peu bourrin si j'avais dû coder ça j'aurai utilisé 3 structures différentes. Or je constate que tu n'en utilises qu'une, et je trouve cela très intéressant, si si.

Un point concernant les Fontes que tu as chargé. Est-il indispensable de les fermer à la fermeture du programme comme tu le fais. Libération de mémoire ?
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Comme c'est une fonction Pure Basic, je pense qu'elle est automatiquement libérée à la fin du programme, mais ça ne sera pas le cas si on utilise des objets Hpen, Hbrush; alors autant garder de bonnes habitudes.

Je pense comme toi que certains gadgets gagnerait à être plus complet, par exemple pouvoir ajouter du texte dans les Toolbars.

Et un autre Gadget serait le bienvenue, le Rebar.

:D
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Ok...

C'est vrai que le Rebar serait bienvenu, mais faut faire gaffe avec, c'est le genre de gadget qui plante souvent. surtout le Rebar batif :mrgreen:
( Je sais, mais que voulez-vous :roll: des perches comme ça...)
:D
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Jacobus a écrit :Ok...

C'est vrai que le Rebar serait bienvenu, mais faut faire gaffe avec, c'est le genre de gadget qui plante souvent. surtout le Rebar batif :mrgreen:
( Je sais, mais que voulez-vous :roll: des perches comme ça...)
:D
:0:
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Comme je vois que la POO commence à intéresser les esprits, je met à disposition le même code mais coder à la façon POO.

Grâce à l'exemple de Heis Spliter sur la POO, je m'étais amusé à re-coder mon exemple à la méthode Heis.

Ceux que ça intéresse pourront comparer les deux!

Code : Tout sélectionner

; By Nico
; Pure Basic, Version:3.92
; le 26/12/04

;/ Structure allowing the posting of the text in the Status bar
;/ containing the different information which we are going to administer.

Structure Status_Draw
  Texte.s
  Couleur.l
  Font.l
  Emplacement.l
  Icone.l
EndStructure

Enumeration 
  #Window_0 
EndEnumeration 

Enumeration 
  #button1
  #button2
  #StatusBar
EndEnumeration 


;/ Constants used to show the text
; #DT_SINGLELINE  ; The text will be shown in a single line
; #DT_TOP         ; The text will be aligned upward,
                ; ; The constant #DT_SINGLELINE Must be specified to use it
; #DT_BOTTOM      ; The text will be aligned downward
                ; ; The constant #DT_SINGLELINE Must be specified to use it
; #DT_VCENTER     ; The text will be centred vertically
                ; ; The constant #DT_SINGLELINE Must be specified to use it
; #DT_CENTER      ; The text will be centred Horizontally
; #DT_RIGHT       ; The text will be aligned to the Right
; #DT_LEFT        ; The text will be aligned to the Left

;/ Constants used to show the icon
#SB_SETICON=(#WM_USER) +15

Interface IStatusBar
  init(Window.l,Hstatus.l, index.l)
  texte(Texte.s)
  couleur(Couleur.l)
  font(Font.l)
  option(option.l)
  Icone(HICON.l)
  Show()
EndInterface 

Structure fonction
  init.l
  Texte.l
  Couleur.l
  Font.l
  option.l
  Icone.l
  show.l
EndStructure 

Structure Vtable 
  *VirtualTable.fonction
  status.Status_Draw
  Hstatus.l
  index.l
  Window.l
  Message.l
EndStructure
 
Declare IstatusBar_Window(WindowID, Message, wParam, lParam) 

Structure liste_chainee
  Vtable.Vtable 
  fonction.fonction
EndStructure 

NewList IstatusBar.liste_chainee()

Procedure init(*this.Vtable, Window.l, Hstatus.l, index.l)
  If GetWindowLong_(Window, #GWL_WNDPROC) <> @IstatusBar_Window()
    OriginProc = SetWindowLong_(Window, #GWL_WNDPROC, @IstatusBar_Window()) 
    SetProp_(Window, "OriginProc", OriginProc)
  EndIf 
  
  *this\Window=Window 
  *this\Hstatus=Hstatus
  *this\index=index
  ProcedureReturn 1
EndProcedure 

Procedure texte(*this.Vtable, Texte.s)
  *this\status\Texte=Texte
  ProcedureReturn 1
EndProcedure 

Procedure couleur(*this.Vtable, Couleur.l)
  *this\status\Couleur=Couleur
  ProcedureReturn 1
EndProcedure 

Procedure font(*this.Vtable, Font.l)
  *this\status\Font=Font
  ProcedureReturn 1
EndProcedure 

Procedure option(*this.Vtable, option.l)
  *this\status\Emplacement=option
  ProcedureReturn 1
EndProcedure 

Procedure Icone(*this.Vtable, Icone.l)
  SendMessage_( *this\Hstatus, #SB_SETICON, *this\index, Icone)
  ProcedureReturn 1
EndProcedure

Procedure Show(*this.Vtable)
  SendMessage_(*this\Hstatus, #SB_SETTEXT, *this\index | #SBT_OWNERDRAW ,*this\status)
  ProcedureReturn 1
EndProcedure 


Procedure Interface_Fonction(chaine.s, Hstatus.l, index.l)
  If chaine="StatusBar"
    AddElement(IstatusBar())
    IstatusBar()\fonction\init=@init()
    IstatusBar()\fonction\Texte=@texte()
    IstatusBar()\fonction\Couleur=@couleur()
    IstatusBar()\fonction\Font=@font()
    IstatusBar()\fonction\option=@option()
    IstatusBar()\fonction\Icone=@Icone()
    IstatusBar()\fonction\show=@Show()
    IstatusBar()\Vtable\VirtualTable=@IstatusBar()\fonction
    CallFunctionFast(IstatusBar()\Vtable\VirtualTable\init,@IstatusBar()\Vtable\VirtualTable, GetParent_(Hstatus), Hstatus, index)
    ProcedureReturn @IstatusBar()\Vtable\VirtualTable
  EndIf 
EndProcedure

  
Procedure IstatusBar_Window(WindowID, Message, wParam, lParam)
  OriginProc.l= GetProp_(WindowID, "OriginProc")
  Select Message 
    Case #WM_DRAWITEM
      ForEach IstatusBar()
        If IstatusBar()\Vtable\Window=WindowID
          *this.Vtable=@IstatusBar()\Vtable\VirtualTable
          Break 
        EndIf 
      Next 
      If wParam = GetDlgCtrlID_(*this\Hstatus)
        *DrawItem.DRAWITEMSTRUCT = lParam 
        *Pointeur.Status_Draw=*DrawItem\itemData
        hFontOld = SelectObject_(*DrawItem\hDC,*Pointeur\Font) 
        SetBkMode_(*DrawItem\hDC, #TRANSPARENT)
        SetTextColor_(*DrawItem\hDC, *Pointeur\Couleur ) 
        DrawText_(*DrawItem\hDC, *Pointeur\Texte, -1, *DrawItem\rcItem , *Pointeur\Emplacement)
        ProcedureReturn #True
      EndIf 
  EndSelect
  ProcedureReturn CallWindowProc_(OriginProc,WindowID, Message, wParam, lParam)  
EndProcedure  


If OpenWindow(0, 100, 150, 300, 200, #PB_Window_SystemMenu | #PB_Window_SizeGadget, "De la couleur dans la Status Bar")
  
  If CreateGadgetList(WindowID(0))
    ButtonGadget(#button1,10,10,280,20,"Changer le nom et la couleur du champ N°0 par Paul")
    ButtonGadget(#button2,10,80,280,20,"Changer le nom et la couleur du champ N°1 par Louis")
  EndIf   
  
  Hstatus= CreateStatusBar(#StatusBar, WindowID())
  ;/ To adjust the height of Status Bar 
  SendMessage_(Hstatus, #SB_SETMINHEIGHT, 40, 0)
  
  ;/ Necessities for the immediate rafraichissement of the new size
  SendMessage_(Hstatus, #wm_size, 0,0)
  
  ;/ Creation of three Fields, 0 , 1, and 2
  If Hstatus 
    AddStatusBarField(100)
    AddStatusBarField(50)
    AddStatusBarField(100)
  EndIf
  
  HICON=LoadImage(0, "c:\Cd.ico")
  
  StatusBar0.IStatusBar=Interface_Fonction("StatusBar",Hstatus, 0)
  StatusBar0\texte("Pierre")
  StatusBar0\couleur(RGB(255,0,0))
  StatusBar0\font(LoadFont (0, "Courier", 10))
  StatusBar0\option(#DT_CENTER| #DT_VCENTER| #DT_SINGLELINE)
  StatusBar0\Icone(HICON)
  StatusBar0\Show()
  
  StatusBar1.IStatusBar=Interface_Fonction("StatusBar",Hstatus, 1)
  StatusBar1\texte("Pierre")
  StatusBar1\couleur(RGB(255,0,0))
  StatusBar1\option(#DT_CENTER| #DT_VCENTER| #DT_SINGLELINE)
  StatusBar1\Show()
  
  Repeat
    Event = WaitWindowEvent() 
    Select Event 
      Case #PB_EventGadget
        Select EventGadgetID()
          Case #button1
            StatusBar0\texte("Paul")
            StatusBar0\couleur(RGB(255,0,255))
            StatusBar0\Show()
            
          Case #button2
            StatusBar1\texte("Louis")
            StatusBar1\couleur(RGB(00,200,200))
            StatusBar1\Show() 
            
        EndSelect
        
      Case #WM_CLOSE
        CloseFont(0)
        FreeImage(0)
        Quit+1
        
    EndSelect 
  Until Quit=1
EndIf 
End
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Excellent, ce code :D
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
bernard13
Messages : 1221
Inscription : mer. 05/janv./2005 21:30

Message par bernard13 »

je suis d'accord avec Jacobus j'utilise la librairy Purecolor pour mettre les gadgets en couleur
mais ça serait bien que fred rajoute des commandes pour les gadgets comme la couleur en autre
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Je viens de faire une Lib, première Lib utilisant les interfaces; c'est sympa à l'utilisation. :D

http://home.tele2.fr/purebasic/POO-StausBar.zip

Si j'ai le temps, je ferais pareil pour ma Lib SetTextColor mais j'aimerais bien attendre la sortie de la version 4 de Pure.
Répondre