DrawMultilineText [Updated]

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

beanage.johannes

Betreff: DrawMultilineText [Updated]

BeitragSa, Jan 23, 2010 12:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine kleine Funktion um Text mit Zeilen-umbruch einfach darzustellen.
Viel spaß damit, hoffe hilft irgend jemandem. Smile

BlitzMax:

Function DrawMultilineText:Int( text:String, x:Int, y:Int, lineWidth:Int = 0, cWidth:Int = 0, cHeigth:Int = 0, autobreak:Byte = 0 )

Local linePos:Int = 0
Local textPos:Int = 0

Local width:Int = 0
Local height:Int = TextHeight( "A" )

For Local pos:Int = 1 To text.length

Local character:Byte = Asc( Mid( text, pos, 1 ) )

width = TextWidth( Chr( character ) )

If ( textPos / ( cWidth + 1 ) ) >= lineWidth And autobreak = 1
linePos:+ 1
textPos = 0
EndIf

If character = 10 'break
linePos:+1
textPos = 0
Else
DrawText Chr( character ), x + textPos, y + linePos * ( height + cHeigth)
textPos:+ ( width + cWidth )
EndIf

Next

Return linePos

EndFunction


Erklärung:
Code:
text - der sting der angezeigt werden soll
x - X position
y - Y position
lineWidth - breite des textfeldes (in zeichen -> * "( charWidth + cWidth )") wird nur bei autoBreak = 1 benötigt
cWidth - !zusätzliche! breite eines buchstabens
cHeight - !zusätzliche! höhe eines buchstabens
autobreak - auto-zeilenumbruch bei erreichen von "width"
  • Zuletzt bearbeitet von beanage.johannes am Sa, Jan 23, 2010 20:20, insgesamt 7-mal bearbeitet

klin

BeitragSa, Jan 23, 2010 13:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein kleines beispiel würde denke ich nicht schaden. Ich weiß z.B. auf dem ersten blick garnicht wozu chrWidth:Int = 8, chrHeigth:Int = 12 ist.
Wenn das nun wirklich die Buchstaben breite / höhe ist, dann benutz mal TextWidth / TextHeight.

MFG
Klin

beanage.johannes

BeitragSa, Jan 23, 2010 16:56
Antworten mit Zitat
Benutzer-Profile anzeigen
ja ist die zeichenhöhe und zeichenbreite, Nein ich benutze absichtlich nicht textwidth/textheight.

text - der sting der angezeigt werden soll
x - X position
y - Y position
width - breite des textfeldes (in zeichen -> * "chrWidth") wird nur bei autoBreak = 1 benötigt
chrWidth - breite eines buchstabens
chrHeight - höhe eines buchstabens
autobreak - auto-zeilenumbruch bei erreichen von "width"

Goodjee

BeitragSa, Jan 23, 2010 17:00
Antworten mit Zitat
Benutzer-Profile anzeigen
buchstaben sind leider nicht gleichbreit, also wie soll man die breite angeben?
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

beanage.johannes

BeitragSa, Jan 23, 2010 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
steht eig genau in der erklärung!

die breite bedeutet -> maxAnzahl von Zeichen pro Zeile.
Muss nur angegeben wen man autobreak eingeschaltet hat, wenn nicht werden die zeilen von der länge her NICHT begernzt.

Goodjee

BeitragSa, Jan 23, 2010 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
nein, ich in der erklärung steht:

Zitat:
chrWidth - breite eines buchstabens
chrHeight - höhe eines buchstabens


M ist ja wohl breiter als i, also was angeben?
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

beanage.johannes

BeitragSa, Jan 23, 2010 20:06
Antworten mit Zitat
Benutzer-Profile anzeigen
m ist nicht breiter als i. zumidest in der standart BMax schrifft nicht.
[UPDATED] ich habe die Funktion nochmal überarbeitet und auch den richtige größe der Buchstaben bei andere Fonts hinzugefügt.

BladeRunner

Moderator

BeitragSa, Jan 23, 2010 20:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Und warum nimmst Du nicht textwidth/textheight? Was ist die Begründung dafür?
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

beanage.johannes

BeitragSa, Jan 23, 2010 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
habe es jetzt genommen, danke, zustzlich kann man die höhe breite aber noch erhöhen/verkleinern.
(neuer code OBEN)

D2006

Administrator

BeitragDi, März 09, 2010 23:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hossa liebe BMaxler,

ich brauchte heute mal eben eine solche Funktion und ging in froher Erwartung auf die Suche hier im Codearchiv. Nun, dieser Thread hier ist wohl der einzige Thread zu dem Problem und die Lösung ist ... naja ... eher suboptimal. Deswegen hab ich fix selbst die Funktion implementiert und will euch mein Ergebnis nicht vorenthalten:

BlitzMax:
Function DrawMultilineText(str:String, x:Int, y:Int, width:Int)
Local lastBreak:Int=-1, lastBegin:Int = 0, substr:String
Local i:Int, char:Int

For i=0 To str.length-1
char = str[i]
If char = 32 Or char = 10 Then
lastBreak = i
EndIf
If TextWidth( str[lastBegin..i+2].Trim() ) > width Or char = 10 Then
If lastBreak=-1 Then lastBreak = i
substr = str[lastBegin..lastBreak+1]

lastBegin = lastBreak+1
lastBreak = -1
DrawText substr, x, y
y :+ TextHeight(substr)
EndIf

Next
DrawText str[lastBegin..], x, y
End Function

Merkmale: Man übergibt der Funktion den Text, die Startposition und die Breite. Selbstverständlich wird der Text automatisch umgebrochen, das ist ja quasi der Sinn des Ganzen. Der Code ist Superstrict und benutzt Slices statt BRL.Retro-Funktionen. Umbrüche erfolgen natürlicherweise an Leerzeichen, so dass ganze Wörte umgebrochen werden (es sei dann natürlich, ein Wort ist zu lang für eine Zeile).

Hier ein Codebeispiel zur Demonstation:
BlitzMax:
SuperStrict

Graphics 800,600
SetBlend ALPHABLEND
SetClsColor 80,80,80

Local timer:TTimer = CreateTimer(30,Null)

SetImageFont LoadImageFont("C:/Windows/Fonts/Arial.ttf",14)
Local txt:String

txt = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ullamcorper erat sed mi sagittis sit amet sollicitudin sapien molestie. In sollicitudin, dui eu hendrerit sagittis, sapien magna blandit nulla, a gravida felis metus eget turpis. Phasellus adipiscing nunc ut eros bibendum a mollis elit consequat. Maecenas vitae scelerisque mauris. In feugiat mi lorem, id lobortis felis. Vivamus ac neque at leo tincidunt viverra id et augue. Nulla facilisi. Aenean euismod felis sit amet nisi lobortis egestas vitae id tellus. Vivamus pretium lorem vel nulla faucibus et posuere diam malesuada. Fusce nunc diam, convallis non porttitor et, congue luctus nisi."
txt :+ Chr(10) + "In ullamcorper euismod magna eget adipiscing. Proin est nulla, luctus a pharetra nec, volutpat ac mauris. Proin condimentum lacinia viverra. Proin pellentesque scelerisque ipsum, quis tincidunt tortor sagittis a. Vivamus tristique dapibus tellus eget ornare. Phasellus eget erat justo, ut ultrices purus. Suspendisse potenti. Morbi faucibus erat ac arcu ornare ac rutrum eros aliquet. Vivamus scelerisque cursus nibh ut tincidunt. Quisque molestie, leo ac condimentum tristique, nunc elit lobortis mauris, vel sodales augue velit a leo. Aenean tristique ornare consectetur. Maecenas risus lectus, aliquam ac placerat non, tempor vehicula dui."
txt :+ Chr(10) + "Aenean ante orci, fringilla ut vulputate at, ultricies auctor erat. Aliquam dignissim diam id turpis rutrum vulputate. Suspendisse vehicula volutpat nisi, et venenatis magna auctor et. Etiam fermentum mollis vestibulum. Cras rhoncus, quam non porta congue, arcu est luctus mauris, vitae mollis elit magna in erat. Nam viverra elementum quam eget eleifend. Aenean sit amet sem aliquet ante convallis aliquam sed a nibh. Donec orci ipsum, pretium vel blandit at, suscipit sed libero. Nulla tristique pellentesque ligula, vel consectetur eros fermentum et. Morbi ullamcorper mollis dui in tincidunt. Suspendisse ultrices quam vulputate augue tempor accumsan. Ut ullamcorper sodales tempus. Suspendisse potenti. Nunc at ligula ac dui ullamcorper pretium ac ac velit. Morbi erat lectus, aliquet id condimentum id, tristique vel tortor. Aliquam eget odio sem, in commodo nisi."
txt :+ Chr(10) + "Sed rhoncus lacinia sem, et mattis nulla tincidunt a. Donec egestas aliquet velit at euismod. Suspendisse dapibus libero id nulla pretium in semper libero suscipit. Ut vestibulum vehicula dapibus. Suspendisse potenti. Nunc bibendum velit nibh, ac interdum diam. Donec sodales volutpat nisl non feugiat. Quisque vestibulum sem nec magna tincidunt vel feugiat dui ullamcorper. Nullam sapien orci, malesuada vel sollicitudin in, molestie et tortor. Donec interdum eleifend commodo."
txt :+ Chr(10) + "Fusce enim erat, rutrum at porttitor ac, fermentum sit amet orci. Donec cursus accumsan turpis, eget imperdiet tortor mollis eget. Fusce id lacus at mi aliquet auctor. Nulla elit tortor, interdum ac ultricies vel, cursus sit amet nunc. Nunc adipiscing lacinia nisi auctor fringilla. In elit odio, pellentesque scelerisque gravida at, lobortis ac eros. Proin scelerisque diam at leo placerat egestas. Quisque vitae cursus eros. Vestibulum dignissim, dui ac sodales volutpat, ligula risus cursus tellus, sed hendrerit nisi felis eu dolor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis sed nunc purus, ut congue eros. Phasellus vestibulum magna et nibh accumsan congue. Praesent luctus lorem sapien. Sed semper pretium."

Local width:Int = 500


Repeat

Cls

SetColor 255,255,255
DrawRect 25,0,width,600
SetColor 0,0,0

DrawMultilineText txt,25,25,width

Flip 0
WaitTimer timer

width :+ (KeyDown(KEY_RIGHT)-KeyDown(KEY_LEFT))*5

Until AppTerminate() Or KeyHit(KEY_ESCAPE)

Hinweis: Solltet ihr kein Windows haben oder euer System nicht unter "C:/Windows" liegen, so müsst ihr den Font-Pfad anpassen (mit Std-Font ist es ja unerträglich hässlich). Mit LINKS und RECHTS könnt ihr die Breite der grauen Box zur Laufzeit verändern.

Vielleicht nutzt es dem ein oder anderen was. Have fun!
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2
  • Zuletzt bearbeitet von D2006 am Mi, März 10, 2010 15:41, insgesamt einmal bearbeitet

D2006

Administrator

BeitragMi, März 10, 2010 15:22
Antworten mit Zitat
Benutzer-Profile anzeigen
*doppelpost*

Hab den Code noch um naheliegende Funktionen erweitert: Man kann den Text nun links- oder rechtsbündig, zentriert oder in Blocksatz anzeigen lassen.

Hier die Funktionen:
BlitzMax:
Const ALIGN_LEFT:Int = 0
Const ALIGN_CENTER:Int = 1
Const ALIGN_RIGHT:Int = 2
Const ALIGN_JUSTIFY:Int = 3
Function DrawMultilineText(str:String, x:Int, y:Int, width:Int, align:Int=ALIGN_LEFT)
Local lastBreak:Int=-1, lastBegin:Int = 0, substr:String
Local i:Int, char:Int, nx:Int

For i=0 To str.length-1
char = str[i]
If i=str.length-1 Then char = 10
If char = 32 Or char = 10 Then
lastBreak = i
EndIf

If TextWidth( str[lastBegin..i+2].Trim() ) > width Or char = 10 Then
If lastBreak=-1 Then lastBreak = i
substr = Trim(str[lastBegin..lastBreak+1])

lastBegin = lastBreak+1
lastBreak = -1

Select align
Case ALIGN_LEFT
DrawText substr, x, y

Case ALIGN_CENTER
nx = x+width/2-TextWidth(substr)/2
DrawText substr, nx, y
Case ALIGN_RIGHT
nx = x+width-TextWidth(substr)
DrawText substr, nx, y

Case ALIGN_JUSTIFY
If char<>10 Then
DrawTextJustify substr, x, y, width
Else
DrawText substr, x, y
EndIf

End Select
y :+ TextHeight(substr)
EndIf

Next
End Function

Function DrawTextJustify(str:String, x:Int, y:Int, width:Int)

Local arr:String[] = str.split(" ")
Local aStr:String = str.Replace(" ", "")
Local spaceWidth:Float = (width-TextWidth(aStr)) / Float(arr.length-1)
Local fx:Float = x, i:Int

For i=0 To arr.length-1
DrawText arr[i], Int(fx), y
fx :+ TextWidth(arr[i])+spaceWidth
Next

End Function


Die Funktion hat einen neuen Parameter, der einen dieser Konstanten erwartet. Oder eben gar nix, da wird standardmäßig linksbündig ausgegeben. Hier ein Testcode:

BlitzMax:

SuperStrict

Graphics 800,600
SetBlend ALPHABLEND
SetClsColor 80,80,80

Local timer:TTimer = CreateTimer(30,Null)

SetImageFont LoadImageFont("C:/Windows/Fonts/Arial.ttf",14)
'SetImageFont LoadImageFont("/Library/Fonts/Arial.ttf",14)
Local txt:String

txt = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam ullamcorper erat sed mi sagittis sit amet sollicitudin sapien molestie. In sollicitudin, dui eu hendrerit sagittis, sapien magna blandit nulla, a gravida felis metus eget turpis. Phasellus adipiscing nunc ut eros bibendum a mollis elit consequat. Maecenas vitae scelerisque mauris. In feugiat mi lorem, id lobortis felis. Vivamus ac neque at leo tincidunt viverra id et augue. Nulla facilisi. Aenean euismod felis sit amet nisi lobortis egestas vitae id tellus. Vivamus pretium lorem vel nulla faucibus et posuere diam malesuada. Fusce nunc diam, convallis non porttitor et, congue luctus nisi."
txt :+ Chr(10) + "In ullamcorper euismod magna eget adipiscing. Proin est nulla, luctus a pharetra nec, volutpat ac mauris. Proin condimentum lacinia viverra. Proin pellentesque scelerisque ipsum, quis tincidunt tortor sagittis a. Vivamus tristique dapibus tellus eget ornare. Phasellus eget erat justo, ut ultrices purus. Suspendisse potenti. Morbi faucibus erat ac arcu ornare ac rutrum eros aliquet. Vivamus scelerisque cursus nibh ut tincidunt. Quisque molestie, leo ac condimentum tristique, nunc elit lobortis mauris, vel sodales augue velit a leo. Aenean tristique ornare consectetur. Maecenas risus lectus, aliquam ac placerat non, tempor vehicula dui."
txt :+ Chr(10) + "Aenean ante orci, fringilla ut vulputate at, ultricies auctor erat. Aliquam dignissim diam id turpis rutrum vulputate. Suspendisse vehicula volutpat nisi, et venenatis magna auctor et. Etiam fermentum mollis vestibulum. Cras rhoncus, quam non porta congue, arcu est luctus mauris, vitae mollis elit magna in erat. Nam viverra elementum quam eget eleifend. Aenean sit amet sem aliquet ante convallis aliquam sed a nibh. Donec orci ipsum, pretium vel blandit at, suscipit sed libero. Nulla tristique pellentesque ligula, vel consectetur eros fermentum et. Morbi ullamcorper mollis dui in tincidunt. Suspendisse ultrices quam vulputate augue tempor accumsan. Ut ullamcorper sodales tempus. Suspendisse potenti. Nunc at ligula ac dui ullamcorper pretium ac ac velit. Morbi erat lectus, aliquet id condimentum id, tristique vel tortor. Aliquam eget odio sem, in commodo nisi."
txt :+ Chr(10) + "Sed rhoncus lacinia sem, et mattis nulla tincidunt a. Donec egestas aliquet velit at euismod. Suspendisse dapibus libero id nulla pretium in semper libero suscipit. Ut vestibulum vehicula dapibus. Suspendisse potenti. Nunc bibendum velit nibh, ac interdum diam. Donec sodales volutpat nisl non feugiat. Quisque vestibulum sem nec magna tincidunt vel feugiat dui ullamcorper. Nullam sapien orci, malesuada vel sollicitudin in, molestie et tortor. Donec interdum eleifend commodo."
txt :+ Chr(10) + "Fusce enim erat, rutrum at porttitor ac, fermentum sit amet orci. Donec cursus accumsan turpis, eget imperdiet tortor mollis eget. Fusce id lacus at mi aliquet auctor. Nulla elit tortor, interdum ac ultricies vel, cursus sit amet nunc. Nunc adipiscing lacinia nisi auctor fringilla. In elit odio, pellentesque scelerisque gravida at, lobortis ac eros. Proin scelerisque diam at leo placerat egestas. Quisque vitae cursus eros. Vestibulum dignissim, dui ac sodales volutpat, ligula risus cursus tellus, sed hendrerit nisi felis eu dolor. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis sed nunc purus, ut congue eros. Phasellus vestibulum magna et nibh accumsan congue. Praesent luctus lorem sapien. Sed semper pretium."

Local width:Int = 500
Local cAlign:Int = ALIGN_LEFT

Repeat

Cls

SetColor 255,255,255

Select cAlign
Case ALIGN_LEFT
DrawText "LEFT",25,2
Case ALIGN_CENTER
DrawText "CENTER",25,2
Case ALIGN_RIGHT
DrawText "RIGHT",25,2
Case ALIGN_JUSTIFY, 25,5
DrawText "JUSTIFY", 25, 2
End Select
If KeyHit(KEY_TAB) Then cAlign = (cAlign+1) Mod 4

DrawRect 20,20,width+10,600
SetColor 0,0,0

DrawMultilineText txt,25,25,width,cAlign

Flip 0
WaitTimer timer

width :+ (KeyDown(KEY_RIGHT)-KeyDown(KEY_LEFT))*5

Until AppTerminate() Or KeyHit(KEY_ESCAPE)


Abermals kann man mit LINKS und RECHTS die Box in ihrer Breite verändern. Mit TAB kann man die Anzeigearten durchwechseln. Viel Vergnügen bei der Verwendung!

EDIT: Dank Hummelpups noch ein wenig verbessert. Danke dafür!
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard
Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium
Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2
 

BurtBlack

Betreff: Erweiterung um Text-Stream/Fontwählbarkeit

BeitragSa, Apr 17, 2010 17:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi , habe mir den Code von D2600 (stellvertretend) mal als Vorlage genommen und ihn ordentlich verhunzt Wink -

Ich hab ihn um eine Textstream-Funktion und eine wählbare Font/Fontgrösse erweitert, d.h.

Man kann eine Textdateinamen angeben (dieser muss sich im Verzeichnis mit dem gespeicherten Quellcode befinden)

Man kann einen "beliebigen" TTF-Font / Grösse wählen.

Der Text wird gemäß dem Hauptprogramm ausgeben.

Der Code ist weit von perfekt (quick and dirty), aber vielleicht kann der/die eine oder andere etwas damit anfangen. Verbesserungsvorschläge und Code optimierung jederzeit erwünscht...

Code:

' Original von Administrator D2006 (www.blitzforum.de)
' URL: http://www.blitzforum.de/forum/viewtopic.php?t=33810
' Erweitert: von Burt_Black /  V0.00001a  / ' Status: in progress, but working :-)
' Code : nicht aufgeräumt(!), no Debug
' Funktionsweise:
' ähnlich den Vorgängern (D2006) -> nun mit Texteinlese-Funktion("Lateinisch") im Verzeichnis der
' gespeicherten Quellcodes
' wählbarer Font/Fontgrössse) im UnterOrdner Font
'  Hauptordner :
'  comp. Exe (Das Programm)
'  Bsp.txt
'  Unterordner "Font" Arial.ttf


Const ALIGN_LEFT:Int = 0
Const ALIGN_CENTER:Int = 1
Const ALIGN_RIGHT:Int = 2
Const ALIGN_JUSTIFY:Int = 3


' Verschiedene Variablen def.   

Global txt:String
Global NZH_neu:Int        'für die Rückgabe aus der Unterfunktion


' Textmanipulation- Variablen
Global TxtDatei_name:String ="Lateinisch.txt"
Global Font_Name:String = "Monsters Attack!.TTF"
Global Font_Groesse:Int =20
Global width:Int = 500
Global cAlign:Int = ALIGN_LEFT
Global ABSZ=5      ' Der Abstand zwischen den Zeilen (+ Fontgrösse)
Global ABABS=10    ' ist der Abstand zwischen den Absätzen (+ Fontgrössse)
   
Global NZH:Int= 25        ' AB welcher Höhe auf dem Bildschirm soll der Text ausgegeben werden
Global NZH_Bkup:Int= NZH  ' Hier wir der Wert gebackupt für seitenweise Ausgabe (falls Text in der
                                             ' Textdatei zu groß)




' Das Hauptprogramm

Graphics 800,600
SetBlend ALPHABLEND
SetClsColor 80,80,80 
Cls
Local timer:TTimer = CreateTimer(30,Null)

If KeyHit(KEY_TAB) Then cAlign = (cAlign+1) Mod 4
     Hintergrund()
     Textstream(TxtDatei_Name,Font_Name,Font_Groesse)
   WaitTimer timer
Repeat
Until AppTerminate() Or KeyHit(KEY_ESCAPE)



' Funktionen  '

Function Hintergrund()   ' Für dieses spez. Hauptprg.
   Cls 
   SetColor 255,255,255
      DrawRect 20,20,width+10,GraphicsHeight()
      SetColor 0,0,0
      Flip 0
End Function             


' Einlesen des Textes
Function TextStream(TxtDatei_Name:String,Font_name:String,Font_Groesse:Int)
  SetImageFont LoadImageFont(CurrentDir()+"\Font\"+Font_name,Font_Groesse) ' Unterordner für div. ttf. Fonts
 'SetImageFont LoadImageFont("/Library/Fonts/Arial.ttf",14)
  Local Filename:String     
  Local Temp:String   
  FileName = CurrentDir()+"\"+TxtDatei_Name
  file=OpenFile(FileName)
  If Not file RuntimeError "could not open file"
    While Not Eof(file)
        txt=ReadLine(file)
        DrawMultilineText (txt,25,25,width,cAlign,NZH)
        NZH=NZH_neu+TextHeight(Substr)+ABABS ' ist der Abstand zwischen den Absätzen
      Wend
 CloseStream file
End Function

' Ausgabe des Textes : basierend auf D2600 Code (Danke)

Function DrawMultilineText(str:String, x:Int, y:Int, width:Int, align:Int=ALIGN_LEFT,NZH:Int)
   Local lastBreak:Int=-1, lastBegin:Int = 0, substr:String
   Local i:Int, char:Int, nx:Int
   For i=0 To str.length-1
      char = str[i]   ' Buchstabenweise durch den String
      If i=str.length-1 Then char = 10 ' 10 durch 42=* ersetzt
         If char = 32 Or char = 10 Then ' 10 =Zeilenumbruch oder 32=Leerzeichen
         lastBreak = i
      EndIf
      
      If TextWidth( str[lastBegin..i+2].Trim() ) > width Or char = 10 Then
         If lastBreak=-1 Then lastBreak = i
         substr = Trim(str[lastBegin..lastBreak+1])
         lastBegin = lastBreak+1
         lastBreak = -1
         
         Select align
            Case ALIGN_LEFT
                   DrawText substr, x, NZH            
            Case ALIGN_CENTER
               nx = x+width/2-TextWidth(substr)/2
               DrawText substr, nx, NZH
            Case ALIGN_RIGHT
               nx = x+width-TextWidth(substr)
               DrawText substr, nx, NZH
               
            Case ALIGN_JUSTIFY
               If char<>42 Then
                  DrawTextJustify substr, x, NZH, width
               Else
                  DrawText substr, x, NZH
               EndIf
         End Select
          NZH=NZH+TextHeight(Substr)+ ABSZ ' Der Abstand zwischen den Zeilen     
            
              ' Text größer als "Fenster" ?,  dann "<Leertaste>" einblenden
             AktTextPos=(GraphicsHeight()/100*90)
             If NZH>AktTextpos
                Repeat
               DrawText "< Leertaste >", 20, NZH
                  Flip (0)               
             Until KeyHit(KEY_SPACE)
            Hintergrund()
             NZH = NZH_Bkup ' Der Textstartwert für die nächsten Seiten
                    EndIf
      EndIf
       Next       
       NZH_neu=NZH
   Return NZH_neu
End Function

' Unterfunktion von Original-Code (D2600)

Function DrawTextJustify(str:String, x:Int, y:Int, width:Int)
   
   Local arr:String[] = str.split(" ")
   Local aStr:String = str.Replace(" ", "")
   Local spaceWidth:Float = (width-TextWidth(aStr)) /  Float(arr.length-1)
   Local fx:Float = x, i:Int
   
   For i=0 To arr.length-1
      DrawText arr[i], Int(fx), NZH
      fx :+ TextWidth(arr[i])+spaceWidth
   Next
End Function




Bsp. Txt-Datei : http://netload.in/dateiBCLYKad...ch.txt.htm

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group