Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+
Verfasst: 24.07.2011 20:59
Echt fein was du da auf die Beine gestellt hast. Ich kann einiges davon gebrauchen. Also auch von mir ein großes Lob! 

Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
Kannst Du vielleicht mal ein Beispiel schreiben, wo man sehen kann, wasSTARGÅTE hat geschrieben:Die Frage ist nun, ob es bei GDI+ auch die möglichkeit gibt, Elemente "gleichzeitig" zeichnen zu lassen, also als Gruppe, als wären sie ein Element?
Code: Alles auswählen
EnableExplicit
XIncludeFile "gDrawing.pbi"
Define img
Procedure Draw(image)
If gStartDrawing( ImageOutput(image) )
gClear(RGBA($80,$80,$80,$FF))
gSetPenSize(2)
gDrawingMode(#PB_2DDrawing_Path)
gLine(300,100,0, 100)
gLine(400,250,0,-100)
gClosePath()
gDrawingMode(#PB_2DDrawing_Default)
gDrawPath(#PB_Default,RGBA($FF,$FF,$00,$FF)) ; draw current path with yellow color
gDrawingMode(#PB_2DDrawing_Outlined)
gDrawPath(#PB_Default,RGBA($00,$00,$00,$FF)) ; draw current path outlined with black color
gStopDrawing()
EndIf
EndProcedure
If gInit()
img = CreateImage(#PB_Any,800,600)
Draw(img)
OpenWindow(#PB_Any,0,0,800,600,"gDrawing",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ImageGadget(#PB_Any,0,0,800,600,ImageID( img ))
Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
gEnd()
EndIf
Code: Alles auswählen
EnableExplicit
XIncludeFile "gDrawing.pbi"
Define img
Global i
Procedure Draw(image)
If gStartDrawing( ImageOutput(image) )
gClear(RGBA($80,$80,$80,$FF))
gSetPenSize(3)
gLineXY(100,200,420,500,$FF000000) ; 2 schwarze Linien
gLineXY(400,200,120,500,$FF000000)
gSetPenSize(1)
gDrawingMode(#PB_2DDrawing_Path)
For i = 0 To 300
gLineXY(100+i,200,120+i,500) ; mehrere Linien an einander
gLineXY(121+i,500,101+i,200)
Next i
gClosePath()
gDrawingMode(#PB_2DDrawing_Default)
gDrawPath(#PB_Default,RGBA($FF,$FF,$00,$80)) ; zeichne "mehrere halbtransparente Linien an einander (wie auch immer)"
gStopDrawing()
EndIf
EndProcedure
If gInit()
img = CreateImage(#PB_Any,800,600)
Draw(img)
OpenWindow(#PB_Any,0,0,800,600,"gDrawing",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ImageGadget(#PB_Any,0,0,800,600,ImageID( img ))
Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
gEnd()
EndIf
Code: Alles auswählen
Enumeration
#Image
EndEnumeration
IncludePath "C:\Includes\PureBasic"
XIncludeFile "gDrawing.pbi"
gInit()
CreateImage(#Image, 600, 600, 32|#PB_Image_Transparent)
gStartDrawing(ImageOutput(#Image))
gClear($FFFFFFFF)
gSetPenSize(50)
gLineXY(100,100,500,500,$80000000)
gLineXY(500,100,100,500,$80000000)
gStopDrawing()
SetClipboardImage(#Image)
OpenWindow(#PB_Any, 0, 0, ImageWidth(#Image), ImageHeight(#Image), "Image", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ImageGadget(#PB_Any, 0, 0, ImageWidth(#Image), ImageHeight(#Image), ImageID(#Image))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
gEnd()
Danke, nun weiß ich was Du meinst. Dafür bräuchte man sowas wie gLines() um mehrereSTARGÅTE hat geschrieben:Erst mal danke für die beiden Beispiele, aber irgendwie ist gClosePath() nicht das richtige, weil es alle offnenen Ende zusammen fügt.
Hier mal ein ganz einfaches Beispiel:
Wie kann ich ein Kreuz mit zwei Linien zeichnen, ohne das die Mitte dunkler wird, ohne "stückeln zu müssen":Code: Alles auswählen
...
Code: Alles auswählen
gLines(), gLinesXY(), gBoxes(), gBeziers(), gCurves(), gClosedCurves()
Code: Alles auswählen
Enumeration
#Image
EndEnumeration
;IncludePath "C:\Includes\PureBasic"
XIncludeFile "gDrawing.pbi"
gInit()
CreateImage(#Image, 600, 600, 32|#PB_Image_Transparent)
gStartDrawing(ImageOutput(#Image))
gClear($FFFFFFFF)
gSetPenSize(50)
gDrawingMode(#PB_2DDrawing_Path)
gLineXY(100,100,500,500)
gLineXY(500,500,300,300) ; zurueck zum mittelpunkt
gLineXY(500,100,100,500)
gDrawingMode(#PB_2DDrawing_Outlined)
gDrawPath(#PB_Default,$80000000) ; zeichne "mehrere halbtransparente Linien an einander (wie auch immer)"
gStopDrawing()
SetClipboardImage(#Image)
OpenWindow(#PB_Any, 0, 0, ImageWidth(#Image), ImageHeight(#Image), "Image", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ImageGadget(#PB_Any, 0, 0, ImageWidth(#Image), ImageHeight(#Image), ImageID(#Image))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
gEnd()
Code: Alles auswählen
Enumeration
#Image
EndEnumeration
; IncludePath "C:\Includes\PureBasic"
XIncludeFile "gDrawing.pbi"
gInit()
CreateImage(#Image, 740, 600, 32|#PB_Image_Transparent)
Define Text.s = "Das ist ein ganz langer Text, von dem die Breite ermittelt wird"
gStartDrawing(ImageOutput(#Image))
gSetFont("Arial", 24)
gClear($FFFFFFFF)
gSetTextAntialiasMode(#TextAntialiasMode_SystemDefault)
gBox(0, 0, gTextWidth(Text), gTextHeight(Text), $FFC0C0C0)
gDrawText(0, 0, Text, $FF000000)
gSetTextAntialiasMode(#TextAntialiasMode_ClearTypeGridFit)
gBox(0, 60, gTextWidth(Text), gTextHeight(Text), $FFC0C0C0)
gDrawText(0, 60, Text, $FF000000)
gSetTextAntialiasMode(#TextAntialiasMode_AntiAlias)
gBox(0, 120, gTextWidth(Text), gTextHeight(Text), $FFC0C0C0)
gDrawText(0, 120, Text, $FF000000)
gStopDrawing()
SetClipboardImage(#Image)
OpenWindow(#PB_Any, 0, 0, ImageWidth(#Image), ImageHeight(#Image), "Image", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ImageGadget(#PB_Any, 0, 0, ImageWidth(#Image), ImageHeight(#Image), ImageID(#Image))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
gEnd()
Vielen Dank, STARGÅTE!STARGÅTE hat geschrieben:Muss noch mal einen kleinen Bug melden:
Wie es aussieht, wird bei gTextWidth() nicht der TextAntialiasMode beachtet:
[...]
Es wird immer die Breite von #TextAntialiasMode_AntiAlias zurück gegeben.
Jo, danke dafür.Dein erster BugReport wäre damit auch behoben