Textlänge bei Grafiktext

Für allgemeine Fragen zur Programmierung mit PureBasic.
Hugo
Beiträge: 56
Registriert: 30.03.2005 12:07
Wohnort: Nähe München

Textlänge bei Grafiktext

Beitrag von Hugo »

Hallo, ich hab da mal ne Frage.

Ich möchte um einen Text, den ich mit DrawText auf ein Image gezeichnet habe einen Rand zeichnen. Dazu benötige ich die Größe (Länge und Höhe) des Textes in Pixeln.

Ich habe es schon mit GetTextExtentPoint32 versucht, aber das was ich da zurück bekomme stimmt irgendwie nicht.

Hat jemand sowas schon mal gemacht?

Hugo
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Textlength() aus der PB-Drawing-Lib probiert?
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Hugo
Beiträge: 56
Registriert: 30.03.2005 12:07
Wohnort: Nähe München

Beitrag von Hugo »

Das ist so naheliegend, dass ich es übersehen habe. Danke!

Gibt es auch eine einfache Möglichkeit, die Höhe zu ermitteln (je nach Font)?

Hugo
Benutzeravatar
Lukaso
Beiträge: 720
Registriert: 08.09.2004 18:51
Wohnort: Oberkirch
Kontaktdaten:

Beitrag von Lukaso »

Habe folgenden Source von GPI ausm PB-Archiv gefischt:

Code: Alles auswählen

	;see the example, how to get the hdc
	Procedure GetTextHeight(hdc)
	  tm.textmetric
	  PrevMapMode=SetMapMode_(hdc,#mm_text)
	  gettextmetrics_(hdc,tm)
	  If prevmapmode
	    setmapmode_(hdc,prevmapmode)
	  EndIf
	  ProcedureReturn tm\	mHeight
	EndProcedure
	
	
	
	LoadFont(0,"TeXplus EX",10)
	
	CreateImage(0,100,100)
	
	hdc=StartDrawing(ImageOutput()) ; start drawing and get the HDC
	
	DrawingFont(UseFont(0)) ; Use the own font
	
	Height=GetTextHeight(hdc) ; how big it is
	
	;draw a text with a pixel-line between the text
	Locate(1,1)
	DrawText("XYZ")
	Locate(1,1+Height+1)
	DrawText("abc")
	
	StopDrawing()
	
	CloseFont(0)
	
	
	;display it
	
	OpenWindow(0,0,0,100,100,#pb_window_screencentered,"TEST")
	CreateGadgetList(WindowID())
	ImageGadget(0,0,0,100,100,ImageID())
	Repeat
	Until WaitWindowEvent()=#pb_event_closewindow
	
	End
MFG Lukaso
Nextgen Guild Wars Fanseite: Guild Wars Tactics (Pseudo-Admin + Developer)
"Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht." - Unbekannter Autor
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

Linux und Windows version:

Code: Alles auswählen

Procedure ViewImage()
  Win = OpenWindow(#PB_Any, 0, 0, ImageWidth(), ImageHeight(), #PB_Window_SystemMenu, "Image")
  CreateGadgetList(WindowID())
  Gadget = ImageGadget(#PB_Any, 0, 0, ImageWidth(), ImageHeight(), ImageID())
  Repeat
    Event = WindowEvent()
    If EventWindowID() = Win And Event = #PB_Event_CloseWindow
      Quit = 1
    Else
      UseWindow(Win)
      ActivateWindow()
    EndIf
    Delay(10)
  Until Quit = 1
  CloseWindow(Win)
EndProcedure

Procedure GetFontHeight(FontID, PtSize)
  PtSize * 1.5
  Img = CreateImage(#PB_Any, PtSize, PtSize)
  StartDrawing(ImageOutput())
  DrawingFont(FontID)
  Box(0, 0, PtSize, PtSize, $FFFFFF)
  Locate(0, 0)
  DrawText("gjf")
  For x=0 To PtSize-1
    For y=0 To PtSize-1
     
     Color = Point(x, y)
     If Color = $000000
       If y < MinY : MinY = y : EndIf
       If y > MaxY : MaxY = y : EndIf
     EndIf
     
    Next
  Next
  StopDrawing()
  ViewImage()
  FreeImage(Img)
  
  ProcedureReturn MaxY-MinY
EndProcedure

LoadFont(0, "Times New Roman", 70)
MessageRequester("", Str(GetFontHeight(FontID(), 70)))
CloseFont(0)
Zuletzt geändert von DarkDragon am 23.08.2005 10:07, insgesamt 1-mal geändert.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Hugo
Beiträge: 56
Registriert: 30.03.2005 12:07
Wohnort: Nähe München

Beitrag von Hugo »

Danke viel mals, geht so super!

Hugo
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

DarkDragon hat geschrieben:Linux und Windows version:
Du zeichnest ein 'M' auf ein Bild und scannst es dann ab, aber
das berücksichtigt doch keine tiefgestellten Zeichen, z.B. 'g' ?
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten