Zeilenumbruch mit DrawText()

Anfängerfragen zum Programmieren mit PureBasic.
charvista
Beiträge: 1
Registriert: 01.05.2010 16:45

Re: Zeilenumbruch mit DrawText()

Beitrag von charvista »

Ich fand einen kleinen Fehler. :o
Das Ende des Satzes wird nicht angezeigt. ("DrawText() aufrufen.") :angry:
Verbesserung:

Code: Alles auswählen

Procedure DrawLBText(image, width, text.s)
    line.s=""
    x=5
    y=5
   
    StartDrawing(ImageOutput(0))
   
    k = CountString(text," ")+1
    For loop = 1 To k
       
        If TextWidth(line + StringField(text,loop," "))<width
            line = line + StringField(text,loop," ")+" " : Debug Line
        Else
            DrawText(x,y,line,$FFFFFF)
            y+30
            line=StringField(text,loop," ")+" "
        EndIf
    Next
    If line>""
        DrawText(x,y,line,$FFFFFF)
    EndIf
    StopDrawing()
       
       
EndProcedure

CreateImage(0,300,500)
DrawLBText(0, 200, "Ist es irgendwie möglich im DrawText()-Befehl einen Zeilenumbruch einzufügen? Ich mache gerade einen Splash-Screen und will während der Ladezeit einen 'Tipp des Tages' anzeigen (welche in einem Tips.s() Array gespeichert sind). Da 100% der Texte über die Splash-Breite gehen, müsste ich jedesmal für einen Zeilenabsatz ein neues DrawText() aufrufen.")

OpenWindow(0,0,0,300,500,"DrawText LineBreak",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)

ImageGadget(0,0,0,300,500,ImageID(0))

Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow 
:allright:
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: Zeilenumbruch mit DrawText()

Beitrag von Derren »

Da waren noch mehr "Fehler". War halt nur ein Beispiel und kein Code, den man so ohne weiteres übernehmen konnte (z.B. feste ID des Bildes etc...)

Die Funktion erwartet jetzt eine Position (X/Y), die Breite (nach wie vor) und den Zeilenabstand,
Der Zeilenabstand versteht sich in Pixel, solange er unter 100 liegt.
Ab 100 (eigtl 101) wird er als Prozentwert in Relation zu TextHeight() ausgelegt.
200 ergibt also einen Zeilenabstand, der gleich dem Ergebnis von TextHeight() ist (also genau eine Zeile Abstand).

Es wird keine ImageID mehr erwartet. Der Befehl muss zwischen Start- und StopDrawing() aufgerufen werden.

Desweiteren werden alle manuellen Zeilenumbrüche ausgewertet (#CR$, #LF$ und #CRLF$)



Code: Alles auswählen

EnableExplicit

Procedure DrawLBText(x.i, y.i, width.i, text.s, lineDistance.i = 0)
   
   Protected line.s
   Protected textheight.i
   Protected k.i
   Protected loop.i
   Protected lineDistanceFloat.f   
   
   text = ReplaceString(text, #CRLF$, #CR$)
   text = ReplaceString(text, #LF$, #CR$)
   text = ReplaceString(text, #CR$, #CR$+" ")   
   
 
   
   textheight = TextHeight("X")
   
   If linedistance > 100
      linedistanceFloat = lineDistance / 100
      lineDistance = textheight * lineDistanceFloat
      textheight = lineDistance
   Else
      textheight + lineDistance
   EndIf
   
   k = CountString(text," ")+1
   
   For loop = 1 To k
      
      If TextWidth(line + StringField(text, loop, " ")) < width And Trim(Right(line, 2)) <> #CR$
         line = line + StringField(text,loop," ")+" "
         
      Else         
         line = ReplaceString(line, #CR$, "")         
         DrawText(x, y, line)
         y + textheight
         line = StringField(text, loop, " ") + " "
         
      EndIf
      
   Next
   
   If line > ""
      DrawText(x,y,line)
   EndIf
   
EndProcedure

Define test.s = "Ist es irgendwie möglich im DrawText()-Befehl einen "
test + "Zeilenumbruch einzufügen?" +#CRLF$ +#CRLF$
test + "Ich mache gerade einen Splash-Screen und will "
test + "während der Ladezeit einen 'Tipp des Tages' anzeigen (welche in einem Tips.s() "
test + "Array gespeichert sind). Da 100% der Texte über die Splash-Breite gehen, "
test + "müsste ich jedesmal für einen Zeilenabsatz ein neues DrawText() aufrufen."
test + #CRLF$ + #CRLF$
test + "Good bye!"

LoadFont(0, "Arial", 12)

CreateImage(0, 300, 500)
StartDrawing(ImageOutput(0))
DrawingMode(#PB_2DDrawing_Gradient)
FrontColor($0000FF)
BackColor($FF0000)
LinearGradient(0,0,300,500)
Box(5,5,290,490)


DrawingMode(#PB_2DDrawing_Transparent)
FrontColor($00FFFF)
DrawingFont(FontID(0))

DrawLBText(5, 5, 290, test, 150)

StopDrawing()




OpenWindow(0,0,0,300,500,"DrawText LineBreak",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)

ImageGadget(0,0,0,300,500,ImageID(0))

Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow  
Signatur und so
Antworten