Hab 2 Probleme mit GDIPlus. Ich möchte gern wie in Paint auf eine Fläche Zeichnen können und das anschließend als Bild abspeichern (Wenn möglich mit Transparenz).
Als Bild abspeichern geht noch gar nicht, Zeichnen funktioniert, wenn aber der Stift (Pen) breiter als 1 Pixel ist sehen die gemalten Linien "zerrissen" aus.
Weiß jemand eine Lösung?
Code:
Spoiler anzeigen
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#Include <GDIPlus.au3>
#Include <Misc.au3>
#include <GUIConstantsEx.au3>
Global $aButton[6]
Global $dll = DllOpen("user32.dll")
Global $Color = "0x000000"
$gui = GUICreate("Test Windows regions", 150, 200, @DesktopWidth-170, 20, $WS_POPUP, $WS_EX_TOOLWINDOW)
;Left - Top - Width - Height
$aButton[0] = GUICtrlCreateButton("1", 0, 0, 24, 24)
$aButton[1] = GUICtrlCreateButton("2", 24, 0, 24, 24)
$aButton[2] = GUICtrlCreateButton("", 48, 0, 24, 24)
GUICtrlSetBkColor($aButton[2], $Color)
$aButton[3] = GUICtrlCreateButton("4", 72, 0, 24, 24)
$aButton[4] = GUICtrlCreateButton("Exit", 100, 0, 24, 24)
$aButton[5] = GUICtrlCreatePic("", 0, 30, 150, 170, BitOR(-1, $WS_GROUP,$WS_CLIPSIBLINGS))
GUISetState(@SW_SHOW)
$pos = WinGetPos($gui)
_GuiHole($gui, 0, 0, 150, 150)
While 1
$msg = GUIGetMsg()
Switch $msg
Case $aButton[4]
Exit
Case $aButton[0]
MsgBox(0, '', 'Button1 geklickt')
Case $aButton[1]
MsgBox(0, '', 'Button2 geklickt')
Case $aButton[2]
$Color = _ChooseColor(2)
If $Color <> -1 Then
GUICtrlSetBkColor($aButton[2], $Color)
EndIf
Case $aButton[3]
MsgBox(0, '', 'Button4 geklickt')
Case $aButton[5]
Draw()
EndSwitch
WEnd
;Thx an Bugfix
Func _GuiHole($h_win, $i_x, $i_y, $i_sizew, $i_sizeh)
Local $outer_rgn, $inner_rgn, $combined_rgn
$combined_rgn = _WinAPI_CreateRectRgn(0, 0, 0, 0)
_WinAPI_DeleteObject($outer_rgn)
_WinAPI_DeleteObject($inner_rgn)
_AddCtrlRegion($combined_rgn, $aButton)
_WinAPI_SetWindowRgn($h_win, $combined_rgn)
EndFunc ;==>_GuiHole
Func _AddCtrlRegion($full_rgn, $ctrl_id)
Local $ctrl_pos, $ctrl_rgn
If IsArray($ctrl_id) Then
For $i = 0 To UBound($ctrl_id) -1
$ctrl_pos = ControlGetPos($gui, "", $ctrl_id[$i])
$ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0], $ctrl_pos[1], $ctrl_pos[0] + $ctrl_pos[2], $ctrl_pos[1] + $ctrl_pos[3])
_WinAPI_CombineRgn($full_rgn, $full_rgn, $ctrl_rgn, $RGN_OR)
_WinAPI_DeleteObject($ctrl_rgn)
Next
Else
$ctrl_pos = ControlGetPos($gui, "", $ctrl_id)
$ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0], $ctrl_pos[1], $ctrl_pos[0] + $ctrl_pos[2], $ctrl_pos[1] + $ctrl_pos[3])
_WinAPI_CombineRgn($full_rgn, $full_rgn, $ctrl_rgn, $RGN_OR)
_WinAPI_DeleteObject($ctrl_rgn)
EndIf
EndFunc ;==>_AddCtrlRegion
Func Draw()
Local $hPen, $hGraphic, $MX, $MY, $MXOld, $MYOld, $WinPos
Local $hBitmap
_GDIPlus_Startup ()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND (WinGetHandle("Test Windows regions"))
$hPen = _GDIPlus_PenCreate ('0xFF' & StringRight($Color,6),6)
$WinPos=WinGetPos("Test Windows regions")
;_GDIPlus_PenSetDashCap($hPen, $GDIP_DASHCAPROUND)
;_GDIPlus_PenSetDashStyle($hPen, $GDIP_DASHSTYLEDASH)
$MXOld=MouseGetPos(0) - $WinPos[0]
$MYOld=MouseGetPos(1) - $WinPos[1]
; Loop until user exits
While _IsPressed("01", $dll)
$MX=MouseGetPos(0) - $WinPos[0]
$MY=MouseGetPos(1) - $WinPos[1]
_GDIPlus_GraphicsDrawLine ($hGraphic, $MXOld, $MYOld, $MX, $MY, $hPen)
;_GDIPlus_GraphicsDrawEllipse($hGraphic, $MX, $MY, 6, 6, $hPen) -> Fehler: Bild wird nach einiger Zeit gelöscht
$MXOld=$MX
$MYOld=$MY
Wend
;ImageTest
;$hBitmap = _GDIPlus_BitmapCreateFromGraphics(150, 170, $hGraphic)
;$hImage = _GDIPlus_BitmapCreateFromHBITMAP ($hBitmap)
;$sEncoder = _GDIPlus_EncodersGetCLSID ("PNG")
;_GDIPlus_ImageSaveToFileEx($hBitmap, "C:\Test.png", $sEncoder)
;_GDIPlus_ImageSaveToFile($hBitmap, "C:\Test.bmp")
; Clean up resources
_GDIPlus_PenDispose ($hPen)
_GDIPlus_GraphicsDispose ($hGraphic)
_GDIPlus_Shutdown ()
EndFunc