Informations sur une police de caractère (Windows)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Informations sur une police de caractère (Windows)

Message par falsam »

Pure Basic à ma connaissance ne retourne pas encore le Nom, la taille et le style d'une police de caractère.

Il est necessaire de passer par les API Windows pour récupérer les informations de la police à partir du handle de ton gadget dans une structure LOGFONT

3 procédures :
GetGadgetFontName(Gadget.l) Retourne le nom de la police utilisée dans un gadget.

GetgadgetFontHeight(Gadget.l) Retourne la taille de la police utilisée dans un gadget

GetGadgetFontStyles(Gadget) Retourne le style de la police utilisée dans un gadget sous la forme d'un flag combinant les valeurs suivantes.

#PB_Font_Bold (Valeur 256)
#PB_Font_Italic (Valeur 512)
#PB_Font_Underline (Valeur 4)
#PB_Font_StrikeOut (Valeur 8)
#PB_Font_HighQuality (Valeur 16)

Exemple #PB_Font_Bold et #PB_Font_Italic donnera la valeur 768

GetGadgetFontName(Gadget.l) Retourne le nom de la police utilisée dans un gadget.

Code : Tout sélectionner

;Retoune la police de caractére du gadget 
Procedure.s GetGadgetFontName(Gadget.l)
  Protected FontInfo.LOGFONT
  GetObject_(GetGadgetFont(Gadget), SizeOf(LOGFONT), @FontInfo)
  ProcedureReturn PeekS(@FontInfo\lfFaceName[0]) 
EndProcedure
GetgadgetFontHeight(Gadget.l) Retourne la taille de la police utilisée dans un gadget

Code : Tout sélectionner

;Retounr la taille de la police de caracatere d'un gadget.
Procedure.l GetgadgetFontHeight(Gadget.l)
  Protected dpi.l, FontInfo.LOGFONT, FontHeight.l
  
  dpi=GetDeviceCaps_(GetDC_(GetActiveWindow()), #LOGPIXELSY)
  ReleaseDC_(0, (GetDC_(GetActiveWindow())))
    
  GetObject_(GetGadgetFont(Gadget), SizeOf(LOGFONT), @FontInfo)
  
  FontHeight = FontInfo\lfHeight    
  
  If FontHeight<0
    FontHeight = -FontHeight
  EndIf
  
  FontHeight*(72.0/dpi)
   
  ProcedureReturn FontHeight
EndProcedure
GetGadgetFontStyles(Gadget) Retourne le style de la police utilisée dans un gadget

Code : Tout sélectionner

;Retourne le style de la police de caractere du gadget (Gras, Italic, ........)
Procedure.l GetGadgetFontStyles(Gadget)
  Protected FontInfo.LOGFONT, FontStyles.l
   
  GetObject_(GetGadgetFont(Gadget), SizeOf(LOGFONT), @FontInfo)
  
  FontStyles = 0 
  
  If FontInfo\lfWeight > #FW_NORMAL ;(Couvre les valeurs de FW_REGULAR à FW_BLACK)
    FontStyles = #PB_Font_Bold
  EndIf 
  
  If FontInfo\lfItalic ;(True si Vrai)
    FontStyles + #PB_Font_Italic
  EndIf 
  
  If FontInfo\lfQuality <> #DEFAULT_QUALITY
    FontStyles + #PB_Font_HighQuality
  EndIf 
  
  If FontInfo\lfStrikeOut ;(True si Vrai)
    FontStyles + #PB_Font_StrikeOut
  EndIf
  
  If FontInfo\lfUnderline ;(True si Vrai)
    FontStyles + #PB_Font_Underline
  EndIf 
    
  ProcedureReturn FontStyles
EndProcedure
On place ces trois procédures dans un fichier qu'on nommera par exemple fontinfo.pbi

Et maintenant un exemple de code pour illustrer ces trois procedures.

Code : Tout sélectionner

IncludeFile "fontinfo.pbi"

Enumeration
  #MainForm
  #Edit
  #FontApp
EndEnumeration

Procedure MainFormShow()
  font1=LoadFont(#FontApp,"Arial",11,#PB_Font_Bold | #PB_Font_Italic)
  SetGadgetFont(#PB_Default,FontID(#FontApp)) 
  
  OpenWindow(#MainForm,0,0,400,300,"Police information")
  StringGadget(#Edit, 20,20,100,24,"Abandon")
  
  SetGadgetColor(#edit,#PB_Gadget_FrontColor,$0D2CF2)
EndProcedure

MainFormShow()

Debug "Police " + GetgadgetFontName(#edit)
Debug "Taille " + Str(GetGadgetFontHeight(#edit))
Debug "Styles "+ Str(GetGadgetFontStyles(#edit))

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Warkering
Messages : 808
Inscription : ven. 08/janv./2010 1:14
Localisation : Québec, Canada

Re: Informations sur une police de caractère (Windows)

Message par Warkering »

Merci beaucoup! Bien pratique pour le mise en forme!
Le seul bémol, c'est que #PB_Font_StrikeOut retourne une donnée non-utilisable par le compilateur : Un smiley 8) ! :lol:
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Informations sur une police de caractère (Windows)

Message par flaith »

Pas mal falsam, merci :D
Avatar de l’utilisateur
Emperor
Messages : 36
Inscription : lun. 28/juil./2008 18:36
Localisation : Québec, Québec

Re: Informations sur une police de caractère (Windows)

Message par Emperor »

Ça va m'être utile éventuellement, merci! :D
The time flies away
Flies towards the farrest skies
A rush of adrenaline
Stopped by the global acceptation
Of me


Ambient Reminiscences - Mouchalagane
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Informations sur une police de caractère (Windows)

Message par Backup »

Merci pour le partage :)
Répondre