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 :D


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. :mrgreen:

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 :wink:
Mais avec un L et un P :wink:

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 ;)