Sources PureBasicConsultez toutes les sources

Nombre d'auteurs : 41, nombre de sources : 88, dernière mise à jour : 13 août 2011 

 
OuvrirSommaireStatusBar

Voici un petit code qui est une ébauche et que j'ai fait pour mon besoin propre, en détournant partiellement un code de Nico sur les couleurs dans la statusBar.
Ce code permet de mettre les x premiers caractères du texte de la statusBar avec les styles gras, italique, souligné, barré ou une des compositions de ces styles, en utilisant les variables de PB (#PB_Font_Bold etc.).
Il y a une procédure que j'ai écrite qui permet à partir de la font passée en paramètre (hFont = FontID(#Font)), de lui mettre les styles (paramètre Type).

On peut utiliser la font système en utilisant la procédure Init_Default_Font(), si on veut utiliser une autre font, on utilisera à la place la procédure SetDefaultFont().

 
Sélectionnez

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

EnableExplicit

Structure Status_Draw
     Texte.s
     couleur.l
     Font.l
     Style.l   ;- on utilise la font, #PB_Bold
     ;  #PB_Font_Bold           ; La police de caractère sera en gras
     ;  #PB_Font_Italic         ; La police de caractère sera en italique
     ;  #PB_Font_Underline      ; La police de caractère sera soulignée
     ;  #PB_Font_StrikeOut      ; La police de caractère sera barrée
     Longueur_Car_Style.l  ; nombre de caractère utilisant le style
     Emplacement.l
EndStructure

Enumeration
     #Window_0
EndEnumeration

Enumeration
     #StatusBar
EndEnumeration

#MC_NoFontStyle = 1024

Global Hstatus
Global L_OriginProc_StatusBar, Hstatus
Global Champ_0.Status_Draw
Global *pointeur_champ0.Status_Draw
Global Hicon, Event, Quit
;// charge la fonte par défaut
Global Defaut_Font


Procedure.l CreateFont(hFont.l, Type.l)
     ;// crée une nouvelle font bassée sur la font passée en paramètre --> hFont.l
     ;// Type --> #PB_Font_Bold        : La police de caractère sera en gras
     ;// #PB_Font_Italic      : La police de caractère sera en italique
     ;// #PB_Font_Underline   : La police de caractère sera soulignée
     ;// #PB_Font_StrikeOut   : La police de caractère sera barrée
     ;// #PB_Font_Bold        = 256
     ;// #PB_Font_Italic      = 512
     ;// #PB_Font_Underline   = 4
     ;// #PB_Font_StrikeOut   = 8
     
     ;// retourne 0 si erreur sinon la font
     ;// la font retournée doit être détruite avec  DeleteObject_(Font)
     
     Protected lpvObject.LOGFONT
     
     If GetObject_(hFont, SizeOf(LOGFONT), lpvObject.LOGFONT) ;// = 0
          If Type & #MC_NoFontStyle
               lpvObject\lfWeight = #FW_NORMAL
               lpvObject\lfItalic = #False
               lpvObject\lfUnderline = #False
               lpvObject\lfStrikeOut = #False
          Else
               If Type & #PB_Font_Bold
                    lpvObject\lfWeight = #FW_BOLD
               Else
                    lpvObject\lfWeight = #FW_NORMAL
               EndIf
               
               If Type & #PB_Font_Italic
                    lpvObject\lfItalic = #True
               Else
                    lpvObject\lfItalic = #False
               EndIf
               
               If Type & #PB_Font_Underline
                    lpvObject\lfUnderline = #True
               Else
                    lpvObject\lfUnderline = #False
               EndIf
               
               If Type & #PB_Font_StrikeOut
                    lpvObject\lfStrikeOut = #True
               Else
                    lpvObject\lfStrikeOut = #False
               EndIf
          EndIf
         
          ProcedureReturn CreateFontIndirect_(lpvObject)
     Else
          ProcedureReturn 0
     EndIf
EndProcedure


Procedure StatusBarCallBack(WindowID, Message, wParam, lParam)
     Protected L_OriginProc = GetProp_(WindowID, "Pure"+Hex(WindowID))
     Protected *pointeur.Status_Draw, lpSize.size
     Protected hFontOld, Local_Font
     Protected *texte$
     
     Protected *DrawItem.DRAWITEMSTRUCT
     
     Select Message
          Case #WM_NCDESTROY
               ;Remettre la procédure d'origine
               SetWindowLongPtr_(WindowID, #GWL_WNDPROC, L_OriginProc)
               ;Supprimer la donnée associée à la fenêtre.
               RemoveProp_(WindowID,"Pure"+Hex(WindowID))
               
                             
          Case #WM_DRAWITEM
               If wParam = GetDlgCtrlID_(Hstatus)
                    *DrawItem = lParam
                    *pointeur.Status_Draw=*DrawItem\itemdata
                    SetBkMode_(*DrawItem\hDC, #TRANSPARENT)
                    SetTextColor_(*DrawItem\hDC, *pointeur\couleur )
                   
                    With  *pointeur
                         Select \Style
                              Case - 1  ;// on utilise la font chargée par \Font
                                   hFontOld = SelectObject_(*DrawItem\hDC,*pointeur\Font)
                                   DrawText_(*DrawItem\hDC, *pointeur\Texte, -1, *DrawItem\rcItem , *pointeur\Emplacement)
                                   SelectObject_(*DrawItem\hDC, hFontOld)
                                   
                              Default
                                   Local_Font = CreateFont(Defaut_Font, \Style)
                                   If Local_Font = 0
                                        ;// la création de la font a échouée, on dessine normalement
                                        DrawText_(*DrawItem\hDC, *pointeur\Texte, -1, *DrawItem\rcItem , *pointeur\Emplacement)
                                   Else
                                        ;// pas de test sur la valeur Longueur_Car_Style
                                        hFontOld = SelectObject_(*DrawItem\hDC, Local_Font)
                                        *texte$ = PeekS(@*pointeur\Texte, \Longueur_Car_Style)
                                        ;// on dessine le texte en gras correspondant à la longueur voulue
                                        DrawText_(*DrawItem\hDC, *texte$, -1, *DrawItem\rcItem , *pointeur\Emplacement)
                                       
                                        ;// on retrouve la position de la chaine avec la police dce caractère associée au hdc
                                        If GetTextExtentPoint32_(*DrawItem\hDC, *texte$, \Longueur_Car_Style, @lpSize) = 0
                                             ProcedureReturn #True
                                        EndIf
                                        ;// on modifie la position en x pour afficher le reste de la chaine manquante
                                        ;// après la partie ayant le style
                                        *DrawItem\rcItem\left = lpSize\cx
                                       
                                        ;// on retrouve le texte manquant
                                        *texte$ = Mid(*pointeur\Texte, \Longueur_Car_Style + 1)
                                        ;// on remet la font initiale pour ensuite écrire normalement
                                        SelectObject_(*DrawItem\hDC, hFontOld)
                                        DrawText_(*DrawItem\hDC, *texte$, -1, *DrawItem\rcItem , *pointeur\Emplacement)
                                       
                                        ;// on détruit la font
                                        If Local_Font
                                             DeleteObject_(Local_Font)
                                        EndIf
                                   EndIf
                         EndSelect
                         
                         ProcedureReturn #True
                    EndWith
               EndIf
     EndSelect
     ProcedureReturn CallWindowProc_(L_OriginProc,  WindowID, Message, wParam, lParam)
EndProcedure

Procedure Init_Default_Font()
     ;// essaye de charge la font utilisée pour l'affichage des gadget etc.
     ;// si échec, on utilise la font système
     
     ;// mémorise les données de la font
     Protected lpvObject.LOGFONT
     
     
     Defaut_Font = GetStockObject_(#DEFAULT_GUI_FONT)
     If Defaut_Font
          Defaut_Font = GetObject_(Defaut_Font, SizeOf(LOGFONT), @lpvObject)
          If Defaut_Font
               Defaut_Font = CreateFontIndirect_(lpvObject)
          Else
               ;// échec, on essaye avec #SYSTEM_FONT
               Defaut_Font = GetStockObject_(#SYSTEM_FONT)
               If Defaut_Font
                    Defaut_Font = GetObject_(Defaut_Font, SizeOf(LOGFONT), @lpvObject)
                    If Defaut_Font
                         Defaut_Font = CreateFontIndirect_(lpvObject)
                    Else
                         ;// on stoppe, ne evrait pas arriver
                         End
                    EndIf
               EndIf
          EndIf
     EndIf
EndProcedure

Procedure SetDefaultFont(FontID)
     ;// on va forcer une nouvelle font dans la variable globale Defaut_Font
     If FontID
          If Defaut_Font
               DeleteObject_(Defaut_Font)
               Defaut_Font = 0
          EndIf
          Defaut_Font = FontID
     EndIf
EndProcedure

If OpenWindow(0, 100, 150, 500, 100, "Des styles dans la Status Bar", #PB_Window_SystemMenu | #PB_Window_SizeGadget)
     
     If LoadFont(0, "ARIAL", 12) = 0
        End
     EndIf
     
     ;// charge la font utilisée pour l'affichage des gadget par défault etc.
     ;Init_Default_Font()
     SetDefaultFont(FontID(0))
     
     Hstatus= CreateStatusBar(#StatusBar, WindowID(0))
     ;/ 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(WindowWidth(0))
          L_OriginProc_StatusBar = SetWindowLongPtr_(WindowID(0), #GWL_WNDPROC, @StatusBarCallBack())
          SetProp_(WindowID(0), "Pure"+Hex(WindowID(0)), L_OriginProc_StatusBar)
     EndIf
     
     ;/ On remplit la structure pour le champ N°0 de la Status Bar
     With  Champ_0.Status_Draw
          \Texte = "  Fichier : C:\essai.pb"
          \couleur = #Blue
          \Font = FontID(0)
          \Emplacement=#DT_VCENTER| #DT_LEFT| #DT_SINGLELINE
          \Style = #PB_Font_Bold   ; = -1  on utilise la font \Font
          \Style = #PB_Font_Bold| #PB_Font_Italic   ; = -1  on utilise la font \Font
          ;\Style = #PB_Font_Italic   ; = -1  on utilise la font \Font
          ;\Style = -1
          \Longueur_Car_Style = 12 ; nombre de caractère utilisant le style
     EndWith
     
     ;/ Pointeur vers la Structure à afficher
     *pointeur_champ0.Status_Draw=@Champ_0
     
     ;/ On envoie les différents pointeurs à la Status Bar
     SendMessage_(Hstatus, #SB_SETTEXT, 0 | #SBT_OWNERDRAW ,*pointeur_champ0)
     
     Repeat
          Event = WaitWindowEvent()
          Select Event
                   
               Case #WM_CLOSE
                    FreeFont(0)
                   
                    If Defaut_Font
                         DeleteObject_(Defaut_Font)
                    EndIf
                    Quit + 1
          EndSelect
     Until Quit=1
EndIf
End
Créé le 14 novembre 2009  par Denis
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2008 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.