la hauteur d'une chaine de caractère

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

la hauteur d'une chaine de caractère

Message 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
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Bah en fait, il doit falloir récupérer la taille de la police utilisée, non ?
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Gillou
Messages : 373
Inscription : sam. 28/août/2004 17:35
Localisation : Bretagne, 22
Contact :

Message 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
Gillou
Messages : 373
Inscription : sam. 28/août/2004 17:35
Localisation : Bretagne, 22
Contact :

Message 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
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Il arrive parfois que #WM_GETFONT retourne 0 dans le cas d'une police système utilisée par le gadget
cha0s
Messages : 681
Inscription : sam. 05/mars/2005 16:09

Message par cha0s »

interessant je vait voir tout sa merci
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message 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...
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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:
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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"...
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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.
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

En effet :wink:
Mais avec un L et un P :wink:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
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)]
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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 ?
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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 ;)
Répondre