Page 1 sur 1
la hauteur d'une chaine de caractère
Publié : jeu. 15/déc./2005 19:42
par cha0s
TextLength c'est sympa mais comme fonction, mais j'aimerais savoir si elle a une homologue pour la hauteur de la chaine de caractère, dans le cas contraire une solution cosntructive pour la trouver sa me depannerais bien ^^ . merci
Publié : jeu. 15/déc./2005 19:45
par lionel_om
Bah en fait, il doit falloir récupérer la taille de la police utilisée, non ?
Publié : ven. 16/déc./2005 10:17
par Gillou
Si ça peux t'aider, c'est pas pour les dessins, c'est pour les gadgets mais bon ça peux aider
Mais c'est vrai qu'avec la taille de caractères et en connaissant la police ça devrait le faire
ProcedureDLL GetGadgetTextSize(Gadget.l,Type.l,String.s) ; Retourne la dimension du texte (Type = #TEXTLENGTH ou Type=#TEXTHEIGHT)
#TEXTLENGTH = 0
#TEXTHEIGHT = 1
hGadget = GadgetID (GadgetNr)
If hGadget
hFont = SendMessage_ (hGadget, #WM_GETFONT ,0,0)
hDC = GetDC_ (hGadget)
If hFont
SelectObject_ (hDC,hFont)
EndIf
If GetTextExtentPoint32_ (hDC,String, Len (String),@TextSize.SIZE)
If Type = #TEXTLENGTH ; Text-Length
RetVal = TextSize\cx
ElseIf Type = #TEXTHEIGHT ; Text-Height
RetVal = TextSize\cy
EndIf
EndIf
ReleaseDC_ (hGadget,hDC)
EndIf
ProcedureReturn RetVal
EndProcedure
Publié : ven. 16/déc./2005 10:39
par Gillou
J'ai retrouvé un autre code sur le forum anglais
CreateImage (0, 200, 200)
If OpenWindow (0, 0, 0, 200, 200, #PB_Window_SystemMenu | #PB_Window_ScreenCentered , "Test" ) And CreateGadgetList ( WindowID ())
ImageGadget (0, 0, 0, 200, 200, 0)
hDc = StartDrawing ( ImageOutput ())
If hDc
myText$ = "Bonjour, utilisateur de Purebasic!" + #CRLF$ + "Text Multiligne" + #CRLF$ + "utilisant API DrawText_()"
tRect.RECt
SetTextAlign_ (hDc, #TA_NOUPDATECP )
SetBkMode_ (hDc, #TRANSPARENT )
SetTextColor_ (hDc, #Yellow )
; Calculate the required rect size for out text
DrawText_ (hDc, myText$, Len (myText$), @tRect, #DT_CALCRECT )
; Center the text
textWidth = tRect\right - tRect\left
textHeight = tRect\bottom - tRect\top
tRect\left = GadgetX (0) + ( GadgetWidth (0) - textWidth) /2
tRect\right = tRect\left + textWidth
tRect\top = GadgetY (0) + ( GadgetHeight (0) - textHeight) /2
tRect\bottom = tRect\top + textHeight
; Draw the text
DrawText_ (hDc, myText$, Len (myText$), @tRect, #DT_NOCLIP | #DT_CENTER | #DT_WORDBREAK )
StopDrawing () ; This is absolutely needed when the drawing operations are finished !!! Never forget it !
; Put image into ImageGadget
SetGadgetState (0, UseImage (0))
EndIf
Repeat : EventID = WaitWindowEvent () : Until EventID = #PB_Event_CloseWindow
EndIf
Publié : ven. 16/déc./2005 13:11
par Anonyme2
Il arrive parfois que #WM_GETFONT retourne 0 dans le cas d'une police système utilisée par le gadget
Publié : dim. 18/déc./2005 0:56
par cha0s
interessant je vait voir tout sa merci
Publié : lun. 19/déc./2005 13:47
par gnozal
Autre possibilité (à partir du device context, d'après El Choni je crois) :
Code : Tout sélectionner
Procedure GetTextHeight(hdc.l)
Protected tm.TEXTMETRIC, PrevMapMode.l
PrevMapMode = SetMapMode_(hdc, #MM_TEXT)
GetTextMetrics_(hdc, @tm)
If PrevMapMode
SetMapMode_(hdc, PrevMapMode)
EndIf
ProcedureReturn tm\tmHeight
EndProcedure
Par example :
Code : Tout sélectionner
hDC = StartDrawing(ImageOutput())
DrawingMode(1)
Box(0, 0, ButtonW, ButtonH, ButtonBackColor)
FrontColor(Red(ButtonTextColor), Green(ButtonTextColor), Blue(ButtonTextColor))
MyTextHeight.l = GetTextHeight(hDC) ; <-------------------
; etc...
Publié : lun. 19/déc./2005 14:39
par nico
On pourrait aussi précalculer la hauteur en comptant les pixels si on ne souhaite pas utiliser les API pour rester multiplateforme.

Publié : mar. 20/déc./2005 12:34
par lionel_om
C plus chaud ca par contre, car faudrait regarder sur toute la longueur de la chaine pour être sûr de ne pas louper un "L" ou un "P"...
Publié : mar. 20/déc./2005 13:32
par nico
C'est pour ça que j'ai précisé pré-calculer, tu fais un test juste avec une lettre (un L ou un P) avec la font choisie et tu calcules la hauteur, pas besoin de toute la largeur de la lettre d'ailleurs.
Publié : mer. 21/déc./2005 13:19
par lionel_om
En effet
Mais avec un L et un P

Publié : ven. 13/janv./2006 22:57
par Le Soldat Inconnu
J'ai fait comme ça moi en m'inpirant de ce qui a été dit ci dessus :
C'est prévu pour etre utilisé hors d'un dessin
Code : Tout sélectionner
; Auteur : le Soldat Inconnu
; Version de PB : 3.90
;
; Explication du programme :
; Police de Windows
;- Hauteur de la police
Procedure GetTextHeight(GetTextHeightFontID.l)
Protected Image, Dimension.SIZE, HDC
Image = CreateImage(#PB_Any, 1, 1)
HDC = StartDrawing(ImageOutput())
DrawingFont(GetTextHeightFontID)
GetTextExtentPoint32_(HDC, "o", 1, @Dimension.SIZE)
StopDrawing()
FreeImage(Image)
ProcedureReturn Dimension\cy
EndProcedure
;- Police par défaut de windows
FontID = GetStockObject_(#DEFAULT_GUI_FONT)
; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget, "Test") = 0 Or CreateGadgetList(WindowID()) = 0
End
EndIf
TextGadget(0, 0, 0, 300, 30, "Hauteur du texte = " + Str(GetTextHeight(FontID)))
FontID2 = LoadFont(1, "Tahoma", 20, #PB_Font_HighQuality)
TextGadget(1, 0, 30, 300, 50, "Hauteur du texte = " + Str(GetTextHeight(FontID2)))
SetGadgetFont(1, FontID2)
Repeat
Event = WaitWindowEvent()
Until Event = #PB_EventCloseWindow
Publié : jeu. 19/janv./2006 13:54
par lionel_om
@Soldat Inconnu
J'ai testé ton code et je trouve des résultats bizarres :
Font1 : 9 (pixels avec Paint), 13 (avec le TextGadget)
Font2 : 19 (pixels avec Paint), 33 (avec le TextGadget)
Normal ?
Publié : jeu. 19/janv./2006 17:52
par Dr. Dri
Sous windows le rapport "pt/px" est de 4/3 (je le sais pour avoir étudié les feuilles de style css)
donc il faut faire ceci:
ProcedureReturn Dimension\cy * 3 / 4
Dri
