DrawText in Form einer Box

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

DrawText in Form einer Box

Beitrag 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 ;) )
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag 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
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag 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.
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag 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
Benutzeravatar
Vermilion
Beiträge: 1846
Registriert: 08.04.2006 16:00
Computerausstattung: Apple iMac (2010) & HP Notebook
Wohnort: Heidekreis

Beitrag von Vermilion »

Jop.
Bild

Immer die neueste PureBasic Version. Auf allem Betriebssystemen. Ich bin ein OS-Nomad!
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag 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)
my pb stuff..
Bild..jedenfalls war das mal so.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag von DrShrek »

Eine andere Möglichkeit wäre es die Userlib ICE_Font zu verwenden.
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ups...
als ich angefangen hab zu posten wollte ich ICEFont noch erwähnen,
habs dann aber vergessen, sorry... :oops:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten