Seite 1 von 2
DrawText in Form einer Box
Verfasst: 25.01.2008 15:09
von gnasen
Hi,
ich habe mal wieder eine Angelegenheit, bei der ich irgendwie zu keiner schönen Lösung komme.
Ich erstelle OnTheFly ein Sprite (meinetwegen auch auf ein Image, wäre mir hier egal), auf welchem ich einen Text ausgebe.
Nun möchte ich aber, dass der Text in einer Box mit den Koordinaten:
(X1|Y1) (X2|Y2)
ausgegeben wird. Sollte der Text an einer Seite anecken, sollte ein Zeilenumbruch her. Sollte der gesamte Text nicht in die Box passen, soll die Schriftgröße verkleinert werden, bis es passt.
Ich hoffe ihr versteht was ich meine.
Ich habs schon mit TextWidth() und TextHeight() ausprobiert, finde aber keine zufriedenstellene Lösung. Wäre über Tipps, Beispiele oder fertige Includes (falls sowas hierzu existiert) sehr erfreut. Die genaue Funktionsweise pass ich dann schon selber an (Man will ja nicht ganz untätig sein

)
Verfasst: 25.01.2008 15:37
von Vermilion
Da gibt es schon mal einen Code, der das mit dem Zeilenumbruch bewerkstelligt, das mit der Schriftgröße müsstest du selber hinkriegen.
http://www.purebasic.fr/german/viewtopic.php?t=12141
Verfasst: 25.01.2008 15:43
von Fluid Byte
Ein Prozedur die akurat einen Zeilenumbruch vornimmt ist extrem nervig zu programmierien. Ich würde von Anfang an empfehlen DrawText_() oder ähnliche API Funktionen zu benutzen die dir das abnehmen. Soweit ich weiß unterstützt TextHeight() keinen mehrzeiligen Text.
Verfasst: 25.01.2008 16:21
von Vermilion
Man könnte allerdings eine Variable einführen, bei der man alle Zeilenhöhen zusammenzählt, dann hat man jedenfalls die gesamte Höhe.
Verfasst: 25.01.2008 17:37
von gnasen
Der Beispielcode macht seine Sache schonmal ziemlich gut. Ich denke man könnte das ganze nach dem Trial&Error verfahren machen:
Text zeichnen lassen, wenn er nicht hineinpasst, Schriftgröße - a. Einfach als Schleife drumherum. Vielleicht nicht gerade eine gute Lösung, was Performance angeht, aber ich denke mal sonst ganz in Ordnung
Verfasst: 25.01.2008 18:04
von Vermilion
Jop.
Verfasst: 25.01.2008 18:46
von #NULL
ich hab hier auch noch nen multiline drawtext. kann man entweder anpassen, oder noch ne funtion baun, die dir den text vorher mit den nötigen linebreaks versieht..
Code: Alles auswählen
;XIncludeFile "E:\pbi\drawTextLF.pbi"
;{ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\ E:\pbi\drawTextLF.pbi
; drawTextLF.pbi
; [..just a LineFeed-able drawText ]
Global drawTextLF_EndX.l ; use these variables after a call of drawTextLF() to retrieve the pixel
Global drawTextLF_EndY.l ; position where drawTextLF() finished (the upper right corner of end of text)
Global drawTextLF_MaxX.l ; right side of last drawn text area (x + length in pixel of the longest line)
; parameters:
; x / y : starting position
; text : text to be drawn on current drawing-output.
; color : textcolor
; xWrapTo : x-position of further drawing after linefeed occurrence (default value is your passed 'x'-parameter)
; lineSeperator$ : the string that is used in 'text' as line seperator (default value is '#LF$')
Procedure drawTextLF(x.l, y.l, text.s, color.l, xWrapTo.l=-1, lineSeperator$=#LF$)
Static yPitch.l
Static xPitch.l
Static line.s
Static i.l
Static n.l
drawTextLF_MaxX = 0
If xWrapTo=-1
xWrapTo=x
EndIf
yPitch=TextHeight("X")
n=CountString(text,lineSeperator$)
For i=0 To n
line=StringField(text,i+1,lineSeperator$)
xPitch=DrawText( x, y+i*yPitch, line, color)
If xPitch>drawTextLF_MaxX
drawTextLF_MaxX = xPitch
EndIf
If i=0
x=xWrapTo
EndIf
Next
drawTextLF_EndX = xPitch
drawTextLF_EndY = y+(i-1)*yPitch
EndProcedure
; [...]
;}
; ________________________________/ [end] E:\pbi\drawTextLF.pbi
InitSprite()
InitMouse()
InitKeyboard()
ww=800
wh=600
hWin=OpenWindow(0, 50,100,ww,wh, "")
OpenWindowedScreen( hWin, 0,0,ww,wh, 0,0,0)
Define text.s
text=" jsfjssfj"+#LF$
text+" dfhhfghg h"+#LF$
text+"gfsj gj j"+#LF$
text+"fg sjfgj gsj "+#LF$
text+" ------------"+#LF$
text+".,,.hlk.+123"
Repeat
event=WaitWindowEvent(30)
ExamineKeyboard()
ExamineMouse()
x=MouseX()
y=MouseY()
StartDrawing(ScreenOutput())
DrawingMode(#PB_2DDrawing_Transparent | #PB_2DDrawing_Outlined)
drawTextLF( x,y, text, $00ff00)
Box( x,y, drawTextLF_MaxX - x, TextHeight(text)*(1+CountString(text,#LF$)), $ff2222)
StopDrawing()
FlipBuffers()
ClearScreen($333333)
Until event=#PB_Event_CloseWindow Or KeyboardPushed(#PB_Key_Escape)
Verfasst: 29.01.2008 16:55
von Kaeru Gaman
wesentlich einfacher wird das ganze,
wenn du dir ne blockschrift als sprites selbermachst,
und deine textausgabe wie ne tileengine aufbaust.
das ganze ist ne kosten-nutzen-rechnung:
bringt es das, dir nen wolf zu programmieren,
um nen Drawtext nutzen zu können der immer nur einfarbig sein kann,
und wo du zu allem Überfluß auch noch sicherstellen musst,
dass der verwendete Zeichensatz auf dem Zielrechner existiert?
...stattdessen setzt du dich nen abend hin und designst dir nen todschicken,
mehrfarbigen, absolut individuellen Zeichensatz als einzelne Sprites.
du musst zwar ein bissel rechnen, weil du ihn wirklich Zeichenweise ausgeben musst,
aber das ist tatsächlich die einfachere Rechenaufgabe und dir ne eigene
DrawSpriteText()-Funktion zu schreiben ist garnicht so schwierig.
Verfasst: 29.01.2008 16:57
von DrShrek
Eine andere Möglichkeit wäre es die Userlib ICE_Font zu verwenden.
Verfasst: 29.01.2008 17:00
von Kaeru Gaman
ups...
als ich angefangen hab zu posten wollte ich ICEFont noch erwähnen,
habs dann aber vergessen, sorry...
