StatusBar styles

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

StatusBar styles

Message par Anonyme2 »

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 procedure 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 procedure Init_Default_Font(), si on veut utiliser une autre font, on utilisera à la place la procedure SetDefaultFont().

Code : Tout sélectionner

;/ 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
               ElseIf Type & #PB_Font_NoBold
                    lpvObject\lfWeight = #FW_NORMAL
               EndIf
               
               If Type & #PB_Font_Italic
                    lpvObject\lfItalic = #True
               ElseIf Type & #PB_Font_NoItalic
                    lpvObject\lfItalic = #False
               EndIf
               
               If Type & #PB_Font_Underline
                    lpvObject\lfUnderline = #True
               ElseIf Type & #PB_Font_NoUnderline
                    lpvObject\lfUnderline = #False
               EndIf
               
               If Type & #PB_Font_StrikeOut
                    lpvObject\lfStrikeOut = #True
               ElseIf Type & #PB_Font_NoStrikeOut
                    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
Dernière modification par Anonyme2 le mer. 11/nov./2009 15:30, modifié 1 fois.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: StatusBar styles

Message par Le Soldat Inconnu »

Sympa :)


version corrigé du code car il y a plein de problème de constante introuvable, une faute de frappe sur un Devrais et un \style qui n'est pas commenté (tu me dis si je suis pénible :mrgreen: )

Code : Tout sélectionner

    ;/ 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
		
    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 = 0
					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_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 devrait 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
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)]
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: StatusBar styles

Message par Anonyme2 »

Chez moi ça marchait, j'ai fait un copier/coller :mrgreen:

Le code pourrait être nettement amélioré mais il correspond à mon besoin alors voilà ...
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: StatusBar styles

Message par Anonyme2 »

#MC_NoFontStyle vaut 1024 et c'est une constante de ma librairie sur les menus, c'est pour éviter de prendre 0 et les constante sont une puissance de 2 ce qui permet des tests rapides.
Cette constante est faite pour supprimer les style au cas ou.

J'ai corrigé mon code avec cette constante.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: StatusBar styles

Message par Anonyme2 »

J'utilise ce code dans mon application et j'ai besoin de ce code pour mettre à jour la statusbar

Code : Tout sélectionner

 InvalidateRect_(StatusBarID(#statusBar), 0, #True)
UpdateWindow_(StatusBarID(#statusBar))
Répondre