habe mich die Woche mal wieder über fehlende Druckbefehle aufgeregt (Wie druckt man mit den PB Befehlen rechtsbündig, zentriert oder Blocksatz? - Überhaupt nicht!)
Also selbst ist der Mann

Unten findet ihr eine Prozedur, die all das oben erwähnte beherrscht - sogar Absatzweise mit automatischem Zeilenumbruch. Weiterhin wurden keine API Befehle verwendet, was die Sache Plattformunabhängig machen sollte (habe ich aber nicht getestet)
Vielleicht kann es der ein oder andere ja auch gebrauchen - evtl. hat ja vielleicht jemand noch eine Idee, wie man die Lücken zwischen den Wörtern bei der Verwendung von #PB_Font_Underline loswird.
Gruß, BI2
Edit: Das Beispiel erstellt folgende Seite

Code: Alles auswählen
;/ PrintTextAlign by Andreas Schweitzer
;/ PureBasic 4.20
Procedure.l Xmm(x.f)
ProcedureReturn x * PrinterPageWidth() / 210 ;Breite DIN-A4 = 210 mm
EndProcedure
;==================================================================================================
Procedure.l Ymm(y.f)
ProcedureReturn y * PrinterPageHeight() / 297 ;Höhe DIN-A4 = 297 mm
EndProcedure
;==================================================================================================
Procedure.l PrintTextAlign(x.l , y.l, Breite.l, Direction.l, Text$, Color.l = $000000, Absatz = #False)
Enumeration
#ALIGN_LEFT ;Linksbündig
#ALIGN_RIGHT ;Rechtsbündig
#ALIGN_CENTER ;Zentriert
#ALIGN_JUSTIFY ;Blocksatz
EndEnumeration
Protected Anzahl.l
Protected Zeilen.l
Protected Position.l
Protected Rest.l
Protected i.l, j.l, k.l
Protected SpaceWidthTemp.l = TextWidth(" ")
Protected SpaceWidth.l = SpaceWidthTemp
Text$ = Trim(Text$)
For i = 0 To 5 ;entfernt bis zu 64 aufeinanderfolgende Leerzeichen (bei Bedarf anpassen)
Text$ = ReplaceString(Text$, " ", " ")
Next
Anzahl = CountString(Text$, " ") + 1
Protected Dim Woerter.s(Anzahl)
For i = 0 To Anzahl - 1
Woerter(i) = StringField(Text$, i + 1, " ")
Next
If Not Breite
Breite = PrinterPageWidth() - 2 * x
EndIf
For i = 0 To Anzahl
If (TextWidth(Woerter(i)) + Position) <= (Breite) And i < Anzahl
Position + TextWidth(Woerter(i)) + SpaceWidthTemp
Else
Position - SpaceWidthTemp
If i < Anzahl - 1
i - 1
Else
Rest = #True
EndIf
Select Direction
Case #ALIGN_LEFT
Position = x
Case #ALIGN_RIGHT
Position = x + Breite - Position
Case #ALIGN_CENTER
Position = x + (Breite - Position) / 2
Case #ALIGN_JUSTIFY
If Rest
SpaceWidth = SpaceWidthTemp
Else
SpaceWidth = (Breite - (Position - (SpaceWidthTemp * (i - k)))) / (i - k)
EndIf
Position = x
EndSelect
For j = k To i
Position = DrawText(Position, y, Woerter(j), Color) + SpaceWidth
Next
k = i + 1
Position = 0
y + TextHeight(Text$) ;+ evtl. Offset für Zeilenabstand, dann aber auch bei ProcedureReturn
Zeilen + 1
EndIf
Next
If Absatz
Zeilen + 1
EndIf
ProcedureReturn TextHeight(Text$) * Zeilen ;+ evtl. Offset. Gibt Y-Wert für den nächsten Absatz zurück
EndProcedure
;==================================================================================================
Text$ = "Diesen Text kann man mit der Funktion PrintTextAlign ohne Probleme Linksbündig, "
Text$ + "Rechtsbündig, Zentriert oder als Blocksatz ausdrucken. Auf Wunsch läßt sich auch "
Text$ + "noch ein Absatz anhängen. Als Rückgabewert wird die Y-Startposition des nächsten "
Text$ + "Absatzes übergeben. Somit wird formatiertes ausdrucken von Text zum Kinderspiel ;-)"
If PrintRequester()
If StartPrinting("PrintTextAlign Testseite")
PrintFont0.l = LoadFont(0, "Arial", Ymm(10), #PB_Font_Bold)
PrintFont1.l = LoadFont(1, "Arial", Ymm(3), #PB_Font_Bold)
PrintFont2.l = LoadFont(2, "Arial", Ymm(3))
Mitte = PrinterPageWidth() / 2
If StartDrawing(PrinterOutput())
DrawingFont(PrintFont0)
Y_Start.l = Ymm(10)
DrawingFont(PrintFont0)
Y_Start + PrintTextAlign(Xmm(10), Y_Start, #False, #ALIGN_CENTER, "PrintTextAlign Testseite", $000000, #True)
DrawingFont(PrintFont1)
Y_Start + PrintTextAlign(Xmm(10), Y_Start, #False, #ALIGN_LEFT, Text$, $0000FF, #True)
Y_Start + PrintTextAlign(Xmm(10), Y_Start, #False, #ALIGN_RIGHT, Text$, $00FF00, #True)
Y_Start + PrintTextAlign(Xmm(10), Y_Start, #False, #ALIGN_CENTER, Text$, $FF0000, #True)
Y_Start + PrintTextAlign(Xmm(10), Y_Start, #False, #ALIGN_JUSTIFY, Text$, $000000, #True)
Y_Temp = Y_Start
DrawingFont(PrintFont2)
Y_Start + PrintTextAlign(Xmm(10), Y_Start, Xmm(90), #ALIGN_LEFT, Text$, $0000FF)
Y_Start + PrintTextAlign(Xmm(10), Y_Start, Xmm(90), #ALIGN_RIGHT, Text$, $00FF00)
Y_Start + PrintTextAlign(Xmm(10), Y_Start, Xmm(90), #ALIGN_CENTER, Text$, $FF0000)
Y_Start + PrintTextAlign(Xmm(10), Y_Start, Xmm(90), #ALIGN_JUSTIFY, Text$)
LineXY(Mitte, Y_Temp, Mitte, Y_Start)
Y_Start = Y_Temp
DrawingFont(PrintFont2)
Y_Start + PrintTextAlign(Xmm(110), Y_Start, Xmm(90), #ALIGN_JUSTIFY, Text$, $0000FF)
Y_Start + PrintTextAlign(Xmm(110), Y_Start, Xmm(90), #ALIGN_CENTER, Text$, $00FF00)
Y_Start + PrintTextAlign(Xmm(110), Y_Start, Xmm(90), #ALIGN_RIGHT, Text$, $FF0000)
Y_Start + PrintTextAlign(Xmm(110), Y_Start, Xmm(90), #ALIGN_LEFT, Text$)
StopDrawing()
EndIf
StopPrinting()
EndIf
EndIf
End