Page 1 sur 1

De la couleur dans la Status Bar!

Publié : lun. 27/déc./2004 1:23
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

Publié : mar. 28/déc./2004 10:29
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 ?

Publié : mar. 28/déc./2004 13:01
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

Publié : mar. 28/déc./2004 21:07
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

Publié : mer. 29/déc./2004 4:59
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:

Publié : lun. 23/mai/2005 21:37
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

Publié : mar. 24/mai/2005 17:55
par Le Soldat Inconnu
Excellent, ce code :D

Publié : ven. 27/mai/2005 10:12
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

Publié : dim. 29/mai/2005 11:17
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.