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
:allright:

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"
Bild

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 :lol:

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!