Page 1 sur 1

[..] définir taille écriture automatiquement pour label

Posté : mar. 05 mai 2009 23:40
par AirPE
Bonjour!

Voilà, dans un script j'ai un label avec une taille défini, et le mot change toutes les minutes.
J'aimerai savoir s'il y aurait un moyen de redéfinir la taille de l'écriture lorsque le mot aurait tendance à dépasser la taille du label

J'ai fait quelque chose dans ce genre:

Code : Tout sélectionner

If StringLen($word[$i]) > 20 Then
    GUICtrlSetFont($idWord, 10, -1, -1, "Arial")
ElseIf StringLen($word[$i]) > 18 Then
    GUICtrlSetFont($idWord, 11, -1, -1, "Arial")
ElseIf StringLen($word[$i]) > 16 Then
    GUICtrlSetFont($idWord, 12, -1, -1, "Arial")
ElseIf StringLen($word[$i]) > 15 Then
    GUICtrlSetFont($idWord, 13, -1, -1, "Arial")
Else
    GUICtrlSetFont($langWord, 15, -1, -1, "Arial")
EndIf
Alors ça fonctionne dans le sens ou le mot n'est jamais plus grand que le label, mais suivant les caractères, la longueur (visuelle) apparaît plus ou moins longue. Ce qui fait que des fois le mot est écrit tout petit alors qu'il y a largement la place!
J'avais fait les test avec des nombres, et avec des caractères alphabétiques, ca varie :(
Bon je suis assez content du résultat mais si je pouvais faire mieu, ce serait pas mal du tout! :P

Merci d'avance!

Re: [..] définir taille écriture automatiquement pour label

Posté : ven. 08 mai 2009 17:05
par tolf
Vous pouvez aussi supprimer le label et en créer un nouveau : le nouveau aura une taille adaptée à celle du texte.

Re: [..] définir taille écriture automatiquement pour label

Posté : ven. 08 mai 2009 19:09
par AirPE
Merci de votre réponse,

Pour une fenêtre plutôt grande oui pourquoi mais il se trouve que ma fenêtre ne fait que 200px de largeur! :? Donc si le label en se recréant est plus grand que la fenêtre, ça dépasse...

En tout cas merci pour votre suggestion! :wink:

Re: [..] définir taille écriture automatiquement pour label

Posté : ven. 08 mai 2009 19:20
par Iste
ben, ya pas moyen de recup la taille du label en pixel ? (je ne trouve pas (plus) dans la doc)
Car si oui, tu efface et recree, si c'est trop grand, tu efface et recree avec une police plus petite.
Enfin, c'est un peu bancale, et je n'apporte pas de reelle solucion, mais voila ^^'

Re: [..] définir taille écriture automatiquement pour label

Posté : ven. 08 mai 2009 21:54
par Tlem
Une autre solution, serait de prévoir la fenêtre et le label pour que même avec X fois le caractère le plus large ça ne dépasse jamais. :mrgreen:

Re: [..] définir taille écriture automatiquement pour label

Posté : sam. 09 mai 2009 16:52
par tolf
Peut-être que la fonction _GDIPlus_GraphicsMeasureString pourra mesurer les dimensions de la chaîne.

Par contre, pour l'utilisation, ça va être quelque chose. Il faudra créer une "image" GDI+ sans l'afficher et charger la police correspondant au label, puis extraire les dimensions de ce que retourne _GDIPlus_GraphicsMeasureString : peut-être que cette fonction marche (vous devez inclure "GDIPlus.au3" dans votre script) :

Code : Tout sélectionner

; #FUNCTION# ====================================================================================================================
; Name...........: _GetStringDim
; Description ...: Détermine les dimensions d'une chaîne de caractères.
; Syntax.........: _GetStringDim(ByRef $iLargeur, ByRef $iLongueur, $sChaine, $sFontName = "Arial", $iFontSize = 10)
; Parameters ....: $iLargeur  - Variable destinée à contenir la largeur.
;                  $iLongueur - Variable destinée à contenir la longueur.
;                  $sChaine   - Chaîne dont on calcule les dimensions.
;                  $sFontName - Police de caractères utilisée (Defaut : Arial).
;                  $iFontSize - Taille de la police utilisée (Defaut : 10).
; Return values .: Aucune
;                  Modification des variables $iLargeur et $iLongueur
; Author ........: Tolf
; Modified.......:
; Remarks .......:
; Related .......:
; Link ..........;
; Example .......;
; ===============================================================================================================================
Func _GetStringDim(ByRef $iLargeur, ByRef $iLongueur, $sChaine, $sFontName = "Arial", $iFontSize = 10)
    ; lancement de GDI+
    _GDIPlus_Startup()
    
    ; crée une image de 200x200 pixels
    Local $h_bitmap, $h_image, $h_graphic
    $h_bitmap = _WinAPI_CreateBitmap(200, 200, 1, 32)
    $h_image = _GDIPlus_BitmapCreateFromHBITMAP($h_bitmap)
    $h_graphic = _GDIPlus_ImageGetGraphicsContext($h_image)
    
    ; crée la police
    Local $h_police_name, $h_police
    $h_police_name = _GDIPlus_FontFamilyCreate($sFontName)
    $h_police = _GDIPlus_FontCreate($h_police_name, $iFontSize)
    
    ; trouve les dimensions de la chaîne
    Local $h_format, $t_layout, $aInfo
    $h_format = _GDIPlus_StringFormatCreate()
    $t_layout = _GDIPlus_RectFCreate(200, 200)
    $aInfo = _GDIPlus_GraphicsMeasureString($h_graphic, $sChaine, $h_police, $t_layout, $h_format)
    
    $iLargeur = DllStructGetData($aInfo[0], 3)
    $iLongueur = DllStructGetData($aInfo[0], 4)
    
    ; police
    _GDIPlus_FontFamilyDispose($h_police_name)
    _GDIPlus_FontDispose($h_police)
    ; chaine
    _GDIPlus_StringFormatDispose($h_format)
    ; image
    _WinAPI_DeleteObject($h_bitmap)
    _GDIPlus_ImageDispose($h_image)
    ; fermeture de GDI+
    _GDIPlus_Shutdown()
EndFunc