DrawMultilineText [Updated]
Übersicht

![]() |
beanage.johannesBetreff: DrawMultilineText [Updated] |
![]() Antworten mit Zitat ![]() |
---|---|---|
Eine kleine Funktion um Text mit Zeilen-umbruch einfach darzustellen.
Viel spaß damit, hoffe hilft irgend jemandem. ![]() BlitzMax:
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
habe es jetzt genommen, danke, zustzlich kann man die höhe breite aber noch erhöhen/verkleinern.
(neuer code OBEN) |
||
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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) 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 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
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
*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 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:
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 |
BurtBlackBetreff: Erweiterung um Text-Stream/Fontwählbarkeit |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi , habe mir den Code von D2600 (stellvertretend) mal als Vorlage genommen und ihn ordentlich verhunzt ![]() 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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group