Seite 9 von 12
Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+
Verfasst: 28.08.2011 20:41
von Danilo
STARGÅTE hat geschrieben:Was mich jedoch noch wundert ist: abschließende Leerzeichen gehen nicht mit in die Breite ein.
gTextWidth("A") = gTextWidth("A ")
Klar, sie werden ja nicht angezeigt, aber trotzdem haben sie eine Länge und gerade wenn man (wie ich) einen Cursor anzeigen lassen will, brauche ich auch diese Leerzeichen.
Gibt es da vielleicht noch n Flag ?^^
Bitte nochmal runterladen, geht nun. Bei irgendwelchen weiteren Auffälligkeiten bitte sagen, Danke.

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+
Verfasst: 28.08.2011 21:38
von STARGÅTE
Echt super diese schnelle Umsetzung. Funktioniert.
Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+
Verfasst: 28.08.2011 22:34
von STARGÅTE
So, an dieser stelle möchte ich mal etwas "zurückgeben".
Hier mal ein Beispiel für das Darstellen von Texten mit StyleSheets (ähnlich dem RTF-Format).
Mit Hilfe des gDrawing-Includes ist es nun einfacher die Schrift on-the-fly zu ändern.
Hier mal ein Beispiel:
Syntax : "
\IA
\i\-Quadrat
\0 =
\B50
\b \C2cm
\+2
\c\0\n\Im
\i\-e
\0 =
\C19,109
\c×10
\u\+31
\0 \C2kg"
Code: Alles auswählen
EnableExplicit
XIncludeFile "gDrawing.pbi"
CompilerIf Defined(CharacterArray, #PB_Structure) = #False
Structure CharacterArray
c.c[0]
EndStructure
CompilerEndIf
Structure StyledTextFont
Name.s
Size.f
Style.i
Color.l
EndStructure
Structure StyledTextInclude
Name.s
Size.f
Style.i
Array Color.l(9)
EndStructure
Global StyledTextInclude.StyledTextInclude
Procedure SetStyledTextFont(Name.s, Size.f, Style.i=0, ColorList.s="$FF000000")
Protected Index.i, LastIndex.i
With StyledTextInclude
\Name = Name
\Size = Size
\Style = Style
For Index = 0 To 9
\Color(Index) = Val(StringField(ColorList, Index+1, ","))
Next
EndWith
EndProcedure
Procedure DrawStyledText(X.f, Y.f, Text.s)
Protected *Character.CharacterArray = @Text, String.s
Protected Font.StyledTextFont
Protected Start.i, Index.i = -1
Protected ShiftX.f, ShiftY.f, ShiftV.f
If Not *Character : ProcedureReturn #False : EndIf
Font\Name = StyledTextInclude\Name
Font\Size = StyledTextInclude\Size
Font\Style = StyledTextInclude\Style
Font\Color = StyledTextInclude\Color(0)
Repeat
With Font
gSetFont(\Name, \Size, \Style)
gSetPenColor(\Color)
Repeat
Index + 1
Select *Character\c[Index]
Case '\'
Select *Character\c[Index+1]
Case '\'
String = PeekS(@*Character\c[Start], Index-Start+1)
Default
String = PeekS(@*Character\c[Start], Index-Start)
EndSelect
gDrawText(X+ShiftX, Y+ShiftY+ShiftV, String)
ShiftX + gTextWidth(String)
Select *Character\c[Index+1]
Case 'C'
\Color = StyledTextInclude\Color(*Character\c[Index+2]-'0')
Index + 1
Case 'c'
\Color = StyledTextInclude\Color(0)
Case 'B'
\Style | #PB_Font_Bold
Case 'b'
\Style & ~#PB_Font_Bold
Case 'U'
\Style | #PB_Font_Underline
Case 'u'
\Style & ~#PB_Font_Underline
Case 'I'
\Style | #PB_Font_Italic
Case 'i'
\Style & ~#PB_Font_Italic
Case '+'
\Size = StyledTextInclude\Size * 0.7
ShiftV = -StyledTextInclude\Size * 0.1
Case '-'
\Size = StyledTextInclude\Size * 0.7
ShiftV = StyledTextInclude\Size * 0.4
Case '0'
\Size = StyledTextInclude\Size
ShiftV = 0
Case 'n'
ShiftY + gTextHeight("|")*1.1
ShiftX = 0
EndSelect
Index + 1
Start = Index+1
Break
Case #NUL
gDrawText(X+ShiftX, Y+ShiftY+ShiftV, PeekS(@*Character\c[Start], Index-Start))
Break 2
EndSelect
EndWith
ForEver
ForEver
EndProcedure
Enumeration
#Window
#Gadget
EndEnumeration
gInit()
OpenWindow(#Window, 0, 0, 250, 100, "StyledText", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
CanvasGadget(#Gadget, 0, 0, WindowWidth(#Window), WindowHeight(#Window))
gStartDrawing(CanvasOutput(#Gadget))
gSetTextAntialiasMode(#TextAntialiasMode_ClearTypeGridFit)
SetStyledTextFont("Arial", 24, #Null, "$FF000000,$FF008040,$FFC04000")
DrawStyledText(10, 10, "\IA\i\-Quadrat\0 = \B50\b \C2cm\+2\c\0\n\Im\i\-e\0 = \C19,109\c×10\u\+31\0 \C2kg")
gStopDrawing()
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Funktionen wie StyledTextWidth() und StyledTextHeight() uvm. folgen später

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+
Verfasst: 29.08.2011 02:28
von NicTheQuick
Dafür wäre vielleicht ein neuer Thread mit Verweise auf diesen hier besser geeignet, oder?
Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+
Verfasst: 05.11.2011 18:45
von STARGÅTE
Hallo Danilo,
bitte entferne aus der Include die Konstante: #PB_Font_Default
Die existiert in PB 4.60 RC2 nicht mehr.
Desweiteren habe ich ein Problem wenn ich die Beispiele mit Windows 7 64Bit starten will.
Dort gibt mir gInit() immer 0 zurück. Weißt du woran das liegen könnte?
Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+
Verfasst: 06.11.2011 19:23
von Danilo
STARGÅTE hat geschrieben:Desweiteren habe ich ein Problem wenn ich die Beispiele mit Windows 7 64Bit starten will.
Dort gibt mir gInit() immer 0 zurück. Weißt du woran das liegen könnte?
Habe auch Windows7 64bit und läuft mit PB 32bit. Oder meinst Du PureBasic 64bit?
Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+
Verfasst: 06.11.2011 19:32
von STARGÅTE
Jo PB-64Bit, deswegen habe ich mir ja Windows 7 zugelegt ^^
Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+
Verfasst: 06.11.2011 19:37
von Danilo
Bitte ändere folgende Struktur, gleich am Anfang:
Code: Alles auswählen
Structure GdiplusStartupInput
GdiPlusVersion.l
*DebugEventCallback.DebugEventProc
SuppressBackgroundThread.i
SuppressExternalCodecs.i
EndStructure
Also die 2 letzten Einträge von .l nach .i ändern, dann geht es.
Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+
Verfasst: 06.11.2011 19:55
von STARGÅTE
Oke, "gehen" tut es dann, jedoch meldet mit der Purifier dann eine "Overflow in the global data block".
Muss ich noch irgendwo eine Bufferlänge ändern?
Edit: Ich vermute GdiplusStartup_ ist das problem
Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+
Verfasst: 06.11.2011 20:05
von Danilo
STARGÅTE hat geschrieben:Oke, "gehen" tut es dann, jedoch meldet mit der Purifier dann eine "Overflow in the global data block".
Muss ich noch irgendwo eine Bufferlänge ändern?
Edit: Ich vermute GdiplusStartup_ ist das problem
Code: Alles auswählen
__gdiplusToken.i ; ändern (von .l nach .i)
Prototype GdiplusShutdown(token.i) ; ändern (von .l nach .i)
Hab noch nie mit 64bit probiert, wegen dem Bug mit PB 64bit damals.
Danke für die Meldungen!