Beiträge von Peri Petie

    Hallo bollen,
    in deinem Script bewegt sich das komplette Bild nicht dynamisch mit der Maus.


    Wenn ich mich recht entsinne, hattest du in deinem ersten Beitrag, den du leider gelöscht hast, trotzdem nicht ganz unrecht.
    Mit dem $hContext hatte ich wohl einen falschen Bezug hergestellt.
    Inzwischen habe ich eine zusätzliche Funktion "_GDIPlus_BitmapCreateFromScan0" eingefügt und den $hContext darauf bezogen.
    Nun funktioniert es. :party:



    Erstmal ein dickes Hallo an alle.


    Ich wende mich nun an euch, weil ich irgendwie ziemlich auf dem Schlauch stehe, und zwar mit allen vieren.


    Habe erfolgreich einen Brush mit einem Bild gefüllt, schaffe es aber nicht, dem Brush eine Ellipsen- bzw. Kreisform zu verpassen.
    Was mache ich falsch? ;(?(;(



    Hey, "_GDIPlus_ImageResize" kannte ich überhaupt noch nicht; werde ich mir aber anschauen.
    Vielleicht ist es mit dieser Funktion etwas simpler. Vielen Dank für den Tipp.
    Zwischenzeitlich hatte ich aber weiter gebastelt und es tatsächlich hinbekommen.
    Nachfolgend das Script von Dir aus dem ersten Posting, erweitert um Skalierung und Speicherung des neuen Bildes:


    Hi name22,


    ich stehe mal wieder völlig auf dem Schlauch:
    Wie kann ich bei Deinem Beispielscript mittels "_GDIPlus_GraphicsDrawImageRectRect" das Bild verkleinern und auch abspeichern? Das verkleinerte Bild bekomme ich in die Gui; aber ich bekomme es nicht abgespeichert.
    Nachdem ich hin und her probiert habe, bin ich endgültig verwirrt.
    Kannst Du mir da auf die Sprünge helfen?
    Vielen Dank schon mal vorab.

    So falsch war das gar nicht. Ausserdem sollte ich mir meine eigenen Beiträge mal genauer durchlesen, dann hätte sich mein Problem mit dem Dreieck gleich erledigt.
    Bin nämlich zwischenzeitlich zu folgender Erkenntnis gelangt: :rofl:


    Legt man mehrere Skatkarten im Halbkreis angordnet übereinander (so, wie man sie während eines Spiels üblicherweise auch in der Hand hält), ergibt sich bei jeder unter einer anderen liegenden Karte automatisch ein Dreieck, na ja, ok, zumindest annähernd.
    Ergo: ich muss die Karte nicht erst zerschnippeln, um einen dreieckigen Ausschnit zu erhalten. Der Rotationswinkel des darüberliegenden Rechtecks ist entscheidend.


    Bei meiner Anwendung geht es zwar nicht um Spielkarten, aber die Anordnung der Bilder ist teilweise ähnlich.
    Kannst Du nicht nicht wissen. Ich bitte auch um Nachsicht wegen "nicht eindeutig", dafür habe ich aber meine Gründe. ;)
    Ich werde mich aber bemühen, soweit es geht, meine Fragen so konkret zu stellen, wie es möglich ist.


    Ausserdem ist meine Frage nach der Referenzierung eines einzelnen Tortenstücks anscheinend im Nirvana angelangt. Konkreter geht es doch wohl nicht. :P ;)


    So, und nun noch ein schönes Wochenende, auch an alle anderen Cracks hier im Forum. :thumbup:

    "Jetzt bin ich echt nur noch verwirrt"
    ;)


    Das war nun wirklich nicht meine Absicht, zumal Du mir einen neuen Lösungsansatz aufgezeigt hast. Denn inzwischen habe ich mich endgültig von meiner Idee mit der Kuchenform verabschiedet, da sich hierbei doch immer wieder Bereiche überlappen, wo es störend ist. Habe mich nun doch entschlossen,
    mir die Dreiecke mit Polygonen selbst zu erstellen. Ist zwar mehr Arbeit (die Dreieckserstellung mit der „Pie-Funktion“ war so angenehm simpel :rofl: ), aber geometrische Berechnungen kriege ich schon hin. Ausserdem denke ich, dass ich damit später in meiner geplanten Anwendung wesentlich flexibler bin.


    Mit den TexturCreate-Funktionen habe ich zwischenzeitlich auch ein wenig rumgespielt. Im Grunde passen sie ja genau in die Schublade, in der ich gerade „wühle“.


    Was mich anfangs abgeschreckt hatte, war, dass sie lediglich vertikal und horizontal anzuwenden sind und nicht diagonal. Das hiesse also, dass ich mein Bild erst drehen müsste, um einen „schrägen“ Bildausschnitt zu erhalten. Aber mit Matrixfunktionen habe ich ein wenig Erfahrung und sollte kein grosses Problem sein. Ausserdem habe ich in der GDIP.au3 auch die Funktionen TextureScale- und TextureRotate-Transform entdeckt. Muss ich aber noch ausprobieren.


    Also, trotz Verwirrung habe ich durch Deine Tipps einen neuen Weg nach Rom gefunden.
    Mal sehen, ob ich auch in Rom ankomme. ;)

    Bei einer Tasse Kaffee habe ich mein Konzept noch einmal überdacht und festgestellt, dass ich für weitere Operationen meines Programms den gesamten "Kuchen" benötige. Das zwischenzeitliche Separieren eines einzelnen Pies ist für mein Vorhaben unsinnig und hat sich somit erledigt.


    Meine grundsätzliche Frage, ob man mit einem einzelnen Pie als eigenständiges Objekt weiterarbeiten kann, bleibt allerdings leider unbeantwortet. :(
    Das muss auch anders funktionieren, als es erst in ein Objekt mit Textur umwandeln zu müssen.
    Eine Möglichkeit wäre vielleicht, die Grösse des angrenzenden Rechtecks zu ermitteln, in dem sich das Pie befindet, um dieses dann per "BitmapCloneArea" vom Kuchen abzuspalten. Halte ich auch für einen Umweg, aber wesentlich kürzer als Dein Ansatz.
    Aber egal, ich brauch's ja nun nicht mehr.


    Dennoch vielen Dank nochmals für Deine Mühe, name22.

    "Du kannst einfach weiterhin _GDIPlus_GraphicsFillPie nutzen, nur
    zeichnest du den Ausschnitt der übrig bleibt, statt alles zu zeichnen
    und dann zu übermalen.
    "


    ??? ?(
    Wenn ich "_GDIPlus_GraphicsFillPie" anwende, dann zeichne ich doch die gesamte Torte und nicht "nur den Ausschnitt, der übrig bleibt".
    Auch wenn ich den grössten Teil transparent male, so ist er immer noch vorhanden und ich muss ihn immer wieder mitzeichnen, das wollte ich ja vermeiden.


    Es gibt also keine Möglichkeit, in Bezug auf mein Script, ein einzelnes Pie, das sichtbar auf meiner Arbeitsfläche plaziert ist, als Bitmap-, Graphics-, Image- oder sonstiges Objekt neu zu deklarieren, um damit weiterarbeiten zu können?

    Wurde "gezwungen", erstmal Middach zu machen.
    So, und nun aber gestärkt in den Kampf. :D ;)


    Wozu ein Polygon erstellen? Meinst Du das in Bezug auf Deine Funktion? ?(


    Also, bevor wir aneinander vorbeireden, noch einmal meine Frage:
    Wie kann ich, bezugnehmend auf mein Script, das sichtbare Tortenstück kopieren und neben, über oder unter (egal) das bereits sichtbare Tortenstück plazieren (sorry, alte Rechtschreibung), ohne die gesamte Torte mittels der Funktion "_GDIPlus_GraphicsFillPie" zeichnen zu müssen?

    Hi name22,


    vielen Dank für Deine Hilfe. Das ist eine geile Funktion, die mir beim Stöbern im Forum schon aufgefallen ist.
    Leider kann ich sie für meinen Zweck nicht wirklich nutzen.


    Mir kommt es wirklich darauf an, mit dem aus der Funktion "_GDIPlus_GraphicsFillPie" freigestellten Tortenstück als separates Objekt weiterzuarbeiten, zumal ich hiermit auch die Möglichkeit habe, "schiefwinklige" Ausschnitte aus einem Bild erstellen zu können.


    Trotzdem noch einmal vielen Dank.

    Hi,



    ich stehe mal wieder im Wald und hoffe darauf, dass ihr nach dem gestrigen Trubel wieder nüchtern genug seid, um mir helfen zu können. ;)


    Nachstehendes Script bewirkt nach dem Laden eines Bildes (idealerweise nicht grösser als 500x500) und nach Drücken des Buttons „Color All But One“, dass aus dem zuvor aufgerufenen Bild ein Tortenstück „herausgeschnitten“ wird.


    Der grosse Rest der „Torte“ wird lediglich auf transparent geschaltet und ist dadurch nicht mehr sichtbar.


    Meine Frage nun:


    Wie kann ich mit dem sichtbaren „Tortenstück“ als separates Objekt weiterarbeiten, ohne jedesmal die gesamte „Torte“ zeichnen zu müssen?


    Also, wie könnte ich das sichtbare „Pie“ zum Beispiel kopieren und zusätzlich zum dem vorhandenen darstellen?


    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <GDIPlus.au3>


    Opt('MustDeclareVars', 1)


    Global $msg, $hGUI, $floor1, $loadPIC, $ColorAllButOnePie
    Global $hGraphics1, $hImage1, $PIC, $PICx, $PICy


    Global $floor1x = 500
    Global $floor1y = 500



    $hGUI = GUICreate("", 600, 600)


    $loadPIC = GUICtrlCreateButton("Bild Laden", 513, 100, 85)
    $ColorAllButOnePie = GUICtrlCreateButton("Color All But One", 513, 140, 85)



    $floor1 = GUICtrlCreateGraphic(10, 10, $floor1x, $floor1y)
    GUICtrlSetBkColor($floor1, 0xFFece9d8) ;0xffffff)
    GUICtrlSetGraphic(-1, $GUI_GR_RECT, 0, 0, $floor1x, $floor1y)


    GUISetState()


    _GDIPlus_Startup()


    While 1
    $msg = GUIGetMsg()


    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop


    Case $msg = $loadPIC
    _loadPIC()


    Case $msg = $ColorAllButOnePie
    _ColorAllButOnePie($floor1x, $floor1y, $hGraphics1, $PICx, $PICy, 0, 300)


    EndSelect
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop


    WEnd


    _GDIPlus_GraphicsDispose($hGraphics1)
    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_Shutdown()




    Func _loadPIC()


    $PIC = FileOpenDialog("Bitte Bild auswählen", "J:\_LW_K\__OwnProjects\_autoIt\LissajousUndAndere\tesselation\", "Bilder (*.jpg;*.bmp;*.png)", 1 + 4 )
    _GDIPlus_GraphicsClear($hGraphics1, 0xFFece9d8)


    $hImage1 = _GDIPlus_ImageLoadFromFile($PIC)


    $PICx = _GDIPlus_ImageGetWidth($hImage1)
    $PICy = _GDIPlus_ImageGetHeight($hImage1)
    $hGraphics1 = _GDIPlus_GraphicsCreateFromHWND(GUICtrlGetHandle($floor1))


    _GDIPlus_GraphicsDrawImage ($hGraphics1, $hImage1, $floor1x/2-$PICx/2, $floor1y/2-$PICy/2)


    EndFunc



    Func _ColorAllButOnePie($hGuiX, $hGuiY, $hGraphic, $PICx, $PICy, $StartPie, $EndPie)
    Local $Diag = Sqrt(($PICx*$PICx) + ($PICy*$PICy)) ; Berechnung der Bilddiagonale
    Local $SegmentX = ($Diag-$PICx)/2 ; Berechnung des aus dem Kreis herausstehenden Segments zwischen Kreis und Rechteck des Bildes
    Local $SegmentY = ($Diag-$PICy)/2 ; " "


    Local $MidX = $hGuiX/2-$PICx/2 ; Berechnung der Bildmitte
    Local $MidY = $hGuiY/2-$PICy/2 ; " "


    Local $iTrans = 255 ;255


    Local $hBrush = _GDIPlus_BrushCreateSolid("0x" & Hex($iTrans, 2) & "ece9d8")


    _GDIPlus_GraphicsFillPie($hGraphic, $MidX-$SegmentX, $MidY-$SegmentY, $PICx+($Diag-$PICx), $PICy+$Diag-$PICy, $StartPie, $EndPie, $hBrush)
    EndFunc


    So, hab's nun doch hinbekommen. :rock:


    Eigentlich völlig simpel (kopfschüttel).


    ; Autoren: Code-Schnipsel von diversen Mods und Usern aus dem Autoit-Forum


    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>



    Opt("MustDeclareVars", 1)


    Global $hGUI, $floor1, $floor2, $hImage1, $hImage2, $hGraphic1, $hGraphic2
    Global $PIC, $PicX, $PicY
    Global $msg, $load, $clear


    Global $dll[3], $DeskHDC, $GUIHDC


    $dll[1] = DllOpen ( "user32.dll")
    $dll[2] = DllOpen ( "gdi32.dll")


    Global $aPoints[5][2]
    Global $aPointsNew
    Global $Pi = 4 * ATan(1)
    Global $Pi_Div_180 = $Pi / 180


    Global $MagWidth = 500
    Global $MagHeight = 500
    Global $MagZoom = 1



    $hGUI = GUICreate("Meine Zeichnung", 1200, 600)


    $load = GUICtrlCreateButton("Load Pic", 540, 40, 60)
    ;$clear = GUICtrlCreateButton("Clear Pic", 540, 70, 60)


    $floor1 = GUICtrlCreateGraphic(20, 20, 500, 500)
    GUICtrlSetBkColor($floor1, 0xffffff)
    ;GUICtrlSetColor($floor1, 0)


    $floor2 = GUICtrlCreateGraphic(620, 20, 500, 500)
    GUICtrlSetBkColor($floor2, 0xffffff)


    GUISetState()



    $DeskHDC = DLLCall("user32.dll","int","GetDC","hwnd",0)
    $GUIHDC = DLLCall("user32.dll","int","GetDC","hwnd",GUICtrlGetHandle($floor2))



    _GDIPlus_Startup()
    $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND(GUICtrlGetHandle($floor1))



    While 1


    $msg = GUIGetMsg()


    _MAG()



    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $load
    _load()
    Case $msg = $clear
    ;_clearPIC()
    EndSelect
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd


    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_ImageDispose($hImage2)
    _GDIPlus_GraphicsDispose($hGraphic1)
    _GDIPlus_GraphicsDispose($hGraphic2)
    _GDIPlus_Shutdown()
    DllClose ($dll[1])
    DllClose ($dll[2])




    Func _MAG()
    Local $i, $x1, $y1
    Local $anzahlFenster = 4
    Local $var = 360 / $anzahlFenster
    Local $r = 125


    For $i = 1 to 360 step $var
    $x1 = $r * Sin($i * $Pi_Div_180) + 500/4
    $y1 = $r * Cos($i * $Pi_Div_180) + 500/4


    If Not @error Then
    Local $Result = DllCall("gdi32.dll", "int", "StretchBlt", "int", $GUIHDC[0], "int", _
    $x1, "int", $y1 , "int", $MagWidth/4 * $MagZoom, "int", $MagHeight/4 * $MagZoom, "int", $DeskHDC[0], "int", _
    MouseGetPos(0), "int", MouseGetPos(1), "int", $MagWidth/4, "int", $MagHeight/4, _
    "long", $SRCCOPY)
    EndIf
    DLLCall("user32.dll","int","ReleaseDC","int",$DeskHDC[0],"hwnd",0)
    DLLCall("user32.dll","int","ReleaseDC","int",$GUIHDC[0],"hwnd",GUICtrlGetHandle($floor2))
    next
    EndFunc



    Func _load()
    $PIC = FileOpenDialog("Bitte Bild auswählen", "C:\", "Bilder (*.jpg;*.bmp;*.png)", 1 + 4 ) _GDIPlus_GraphicsClear($hGraphic1, 0xFFece9d8)


    $hImage1 = _GDIPlus_ImageLoadFromFile ($PIC)
    $PicX = _GDIPlus_ImageGetWidth($hImage1)
    $PicY = _GDIPlus_ImageGetHeight($hImage1)


    $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND (GUICtrlGetHandle($floor1))


    _GDIPlus_GraphicsDrawImage ($hGraphic1, $hImage1, 0, 0)
    ; _GDIPlus_GraphicsDrawRect($hGraphic1, 0, 0, $PicX, $PicY)
    EndFunc



    Func _clearPic()
    _GDIPlus_GraphicsClear($hGraphic1, 0xFFFFFFFF) ;0xFFece9d8)
    ;_GDIPlus_GraphicsClear($hGraphic2, 0xFFece9d8)
    EndFunc



    Vielleicht kann aber doch noch jemand drüberschauen, ob die DLLCalls richtig initialisiert und positioniert sind.


    Ansonsten noch ein schönes Restwochenende.

    Hi,
    inzwischen ist der Wald derart dicht bewachsen, dass ich anscheinend keinen einzelnen Baum mehr erkennen kann. ;(


    Ich habe mir mal genauer die Lupenfunktion angesehen und stehe nun vor dem Problem, dass ich es nicht schaffe, z. B. vier Lupenfenster in einer Schleife zu erstellen. Einzeln klappt es zwar, dennoch bin ich mir auch hier nicht sicher, ob ich die verschiedenen Aufrufe (DllCall-Call, -Open –Release) oder auch das Handling von $GUIHDC und $GUIHDC[0]) an die richtigen Stellen im Code positioniert habe oder nicht.
    An DLLs habe ich mich bisher erfolgreich vorbei gedrückt... bisher ...


    Lange Rede, kurzer Sinn:
    Kann sich einer erbarmen, mir auf die Sprünge zu helfen, um mehrere Lupenfenster in einer Schleife zu erstellen und die verschiedenen DLL-Aufrufe richtig im Code zu positionieren?


    Code mit einem Lupenfenster:


    ; Autoren: Code-Schnipsel von diversen Mods und Usern aus dem Autoit-Forum


    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>



    Opt("MustDeclareVars", 1)


    Global $hGUI, $floor1, $floor2, $hImage1, $hImage2, $hGraphic1, $hGraphic2
    Global $PIC, $PicX, $PicY
    Global $msg, $load, $clear


    Global $dll[3], $DeskHDC, $GUIHDC


    $dll[1] = DllOpen ( "user32.dll")
    $dll[2] = DllOpen ( "gdi32.dll")


    Global $MagWidth = 500
    Global $MagHeight = 500
    Global $MagZoom = 1



    $hGUI = GUICreate("Meine Zeichnung", 1200, 600)


    $load = GUICtrlCreateButton("Load Pic", 540, 40, 60)
    ;$clear = GUICtrlCreateButton("Clear Pic", 540, 70, 60)


    $floor1 = GUICtrlCreateGraphic(20, 20, 500, 500)
    GUICtrlSetBkColor($floor1, 0xffffff)
    ;GUICtrlSetColor($floor1, 0)


    $floor2 = GUICtrlCreateGraphic(620, 20, 500, 500)
    GUICtrlSetBkColor($floor2, 0xffffff)


    GUISetState()



    $DeskHDC = DLLCall("user32.dll","int","GetDC","hwnd",0)
    $GUIHDC = DLLCall("user32.dll","int","GetDC","hwnd",GUICtrlGetHandle($floor2))



    _GDIPlus_Startup()
    $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND(GUICtrlGetHandle($floor1))



    While 1


    $msg = GUIGetMsg()


    _MAG()


    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $load
    _load()
    Case $msg = $clear
    ;_clearPIC()
    EndSelect
    If $msg = $GUI_EVENT_CLOSE Then ExitLoop
    WEnd


    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_GraphicsDispose($hGraphic1)
    _GDIPlus_Shutdown()
    DllClose ($dll[1])
    DllClose ($dll[2])




    Func _MAG()
    If Not @error Then
    Local $Result = DllCall("gdi32.dll", "int", "StretchBlt", "int", $GUIHDC[0], "int", _
    100, "int", 125 , "int", $MagWidth/4 * $MagZoom, "int", $MagHeight/4 * $MagZoom, "int", $DeskHDC[0], "int", _
    MouseGetPos(0), "int", MouseGetPos(1), "int", $MagWidth/4, "int", $MagHeight/4, _
    "long", $SRCCOPY)
    EndIf
    DLLCall("user32.dll","int","ReleaseDC","int",$DeskHDC[0],"hwnd",0)
    DLLCall("user32.dll","int","ReleaseDC","int",$GUIHDC[0],"hwnd",GUICtrlGetHandle($floor2))
    EndFunc




    Func _load()
    $PIC = FileOpenDialog("Bitte Bild auswählen", "C:\", "Bilder (*.jpg;*.bmp;*.png)", 1 + 4 )
    _GDIPlus_GraphicsClear($hGraphic1, 0xFFece9d8)


    $hImage1 = _GDIPlus_ImageLoadFromFile ($PIC)
    $PicX = _GDIPlus_ImageGetWidth($hImage1)
    $PicY = _GDIPlus_ImageGetHeight($hImage1)


    $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND (GUICtrlGetHandle($floor1))


    _GDIPlus_GraphicsDrawImage ($hGraphic1, $hImage1, 0, 0)
    ; _GDIPlus_GraphicsDrawRect($hGraphic1, 0, 0, $PicX, $PicY)
    EndFunc



    Func _clearPic()
    _GDIPlus_GraphicsClear($hGraphic1, 0xFFFFFFFF) ;0xFFece9d8)
    ;_GDIPlus_GraphicsClear($hGraphic2, 0xFFece9d8)
    EndFunc



    Nachdem ich den Code „Rotating Image 2.au3“ (drei Postings zuvor) zunächst verworfen hatte, weil er mir auf den ersten Blick für meine Zwecke nicht geeignet erschien, habe ich ihn mir nun doch noch einmal genauer angesehen. Auch wenn ich den grössten Teil des Codes herausgelöscht habe (ich hätte wohl auch bei Null anfangen können ;) ), hat die Experimentiererei mit dem Restcode doch dazu geführt, endlich meine ursprüngliche Frage zu beantworten.


    Mit dem nachfolgenden Code können Bilder im Format JPG, BMP und PNG geladen werden. Es können sicher auch andere Formate geladen werden, die Transparenz funktioniert jedoch nur mit PNG-Bildern. Darauf kam es mir in erster Linie auch an. Die Bilder lassen sich mit der Maus frei auf dem Desktop verschieben.


    Bei der Veränderung von Parametern im Code können zur besseren Orientierung die Zeile 71 (…GraphicsDrawImageRect) aktiviert, und der Farbwert in Zeile 67 (…GraphicsClear) getauscht werden. Damit ist das komplette Fenster, in dem sich die Grafik bewegt, ersichtlich.


    Zum Testen hatte ich keine Schleife eingebaut, also nach dem Laden des Bildes nicht nur einmal auf den Button „rotate“ klicken. ;)


    Also, Matrix-Funktionen lassen sich auch auf mit der Maus verschiebbare transparente PNG-Bilder anwenden.



    #include <GDIPlus.au3>
    #include <windowsconstants.au3>
    #Include <Misc.au3>
    #include <GuiConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>


    Opt("MustDeclareVars", 1)


    Global $hGUI_Main, $hwnd, $msg, $load, $rotate, $close, $graphics, $bitmap, $backbuffer, $matrix, $image, $PIC



    Global Const $AC_SRC_ALPHA = 1


    $hGUI_Main = GUICreate("GDI+", 400, 300, 400, 400, $WS_CAPTION)
    $load = GuiCtrlCreateButton("load" ,10,10)
    $rotate = GuiCtrlCreateButton("rotate" ,10,40)
    $close = GuiCtrlCreateButton("end" ,10,70)
    GUISetState()



    $hwnd = GUICreate("Test", 100, 100, 90, 26, $WS_POPUPWINDOW , BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $hGUI_Main)


    _GDIPlus_Startup()


    $graphics = _GDIPlus_GraphicsCreateFromHWND($hwnd)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics(300, 300, $graphics)
    $backbuffer = _GDIPlus_ImageGetGraphicsContext($bitmap)


    $matrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixTranslate($matrix, 150, 150)
    While 1


    $msg = GUIGetMsg()


    Select
    case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    Case $msg = $load
    _load()
    Case $msg = $rotate
    _rotate()
    Case $msg = $close
    _close()
    EndSelect


    WEnd


    _GDIPlus_ImageDispose($image)
    _GDIPlus_GraphicsDispose($graphics)
    _WinAPI_DeleteObject($bitmap)
    _GDIPlus_MatrixDispose($matrix)
    _GDIPlus_BitmapDispose($bitmap)
    _GDIPlus_Shutdown ()



    Func _load()
    $PIC = FileOpenDialog("Bitte Bild auswählen", "C:\", "Bilder (*.jpg;*.bmp;*.png)", 1 + 4 )
    If $PIC = "" Then Return
    _rotate()
    EndFunc



    Func _rotate()
    $image = _GDIPlus_ImageLoadFromFile($PIC)


    _GDIPlus_GraphicsClear($backbuffer, $GDIP_PXF32ARGB) ;0xFF123456)
    _GDIPlus_MatrixRotate($matrix, -15)
    _GDIPlus_GraphicsSetTransform($backbuffer, $matrix)
    _GDIPlus_GraphicsDrawImageRect($backbuffer, $image, -100, -100, 200, 200)
    ;_GDIPlus_GraphicsDrawRect($backbuffer, -100, -100, 200, 200) ;


    SetBitMap($hwnd, $bitmap, 100)
    GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
    GUISetState()
    EndFunc



    Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
    If ($iMsg = $WM_NCHITTEST) then Return $HTCAPTION
    EndFunc



    Func SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend


    $hScrDC = _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize )
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha" , $iOpacity )
    DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC (0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC ($hMemDC)
    EndFunc



    Func _close()
    Exit
    EndFunc


    Bei der Spielerei mit den Matrix-Funktionen ist u. a. nachstehender Code entstanden (das meiste natürlich aus dem Forum geklaut). ;)


    Nach Laden eines Bildes lässt sich dieses mittels der Tasten „Pfeil oben“ und „Pfeil unten“ auf dem Bildschirm in Echtzeit verkleinern bzw. vergrößern. Bilder im PNG-Format erscheinen transparent.


    Der Redraw funktioniert jedoch nicht hundertprozentig.


    Bei der Darstellung von PNG-Bildern, die innerhalb des Bildes einen Ausschnitt aufzeigen, wie zum Beispiel bei einem Ring, entsteht beim Vergrössern ein eigentlich nicht erwünschter Effekt, der aber sofort verschwindet, sobald man das Bild wieder um einen Schritt verkleinert.


    Bei anderen Bild-Formaten müsste auch noch einmal nachgerechnet werden.



    Ausserdem verschwindet der „Insert“-Button hin und wieder, je nachdem, auf welche Grösse das Bild gebracht wird. Der Button erscheint aber sofort wieder, sobald man mit der Maus über die Position des Buttons fährt. Eigentlich gehört der Button bei dieser Applikation ja auch nicht in das Fenster. Das Laden eines Bildes sollte hier aus einem Menu heraus erfolgen. Ich hatte es aber erstmal so belassen.


    Vielleicht kann ja jemand den Code gebrauchen und entsprechend „umstricken“.




    #AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6


    #include <GDIPlus.au3>
    #include <Misc.au3>
    #include <GuiConstantsEx.au3>
    #include <WinAPI.au3>
    #include <GDIPlusConstants.au3>


    Opt("MustDeclareVars", 1)


    Global $hGui, $msg, $insert, $PIC, $hGraphic, $hBrush, $hImage, $WindowWidth, $WindowHeight, $x, $y, $ImageWidth, $ImageHeight, $iWidth, $iHeight, $hMatrix


    $hGui = GUICreate("SCALE", 800, 600)
    $insert = GuiCtrlCreateButton("Insert Pic" ,10,10)
    GUISetState()




    While GUIGetMsg() <> -3
    $msg = GUIGetMsg()


    $x = 1.0
    $y = 1.0
    If _IsPressed ("26") Then
    _SizeBig()
    ElseIf _IsPressed ("28") Then
    _SizeSmall()
    EndIf




    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop


    Case $msg = $insert
    _GDIPlus_Startup()
    $WindowWidth = 800
    $WindowHeight = 600


    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $hBrush = _GDIPlus_BrushCreateSolid (0xFFECE9D8)
    _GDIPlus_GraphicsFillRect($hGraphic, 0, 0, $WindowWidth, $WindowHeight, $hBrush)


    $PIC = FileOpenDialog("Bitte Bild auswählen", "C:", "Bilder (*.jpg;*.bmp;*.png)", 1 + 4 )
    $hImage = _GDIPlus_ImageLoadFromFile($PIC)
    $ImageWidth = _GDIPlus_ImageGetWidth($hImage)
    $ImageHeight = _GDIPlus_ImageGetHeight($hImage)
    $iWidth = _GDIPlus_ImageGetWidth($hImage) * 96 / _GDIPlus_ImageGetVerticalResolution($hImage)
    $iHeight = _GDIPlus_ImageGetHeight($hImage) * 96 / _GDIPlus_ImageGetHorizontalResolution($hImage)
    $hMatrix = _GDIPlus_MatrixCreate()
    _GDIPlus_MatrixTranslate($hMatrix, $WindowWidth/2, $WindowHeight/2)


    _GDIPlus_MatrixScale($hMatrix, 0.5, 0.5)
    _GDIPlus_GraphicsSetTransform($hGraphic, $hMatrix)
    $hBrush = _GDIPlus_BrushCreateSolid (0xFFECE9D8)
    _GDIPlus_GraphicsFillRect($hGraphic, $ImageWidth, $ImageHeight, -$iWidth / 2, -$iHeight / 2, $hBrush)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, -$iWidth / 2, -$iHeight / 2)


    EndSelect


    WEnd


    _GDIPlus_MatrixDispose($hMatrix)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_Shutdown()






    Func _SizeBig()
    _GDIPlus_MatrixScale($hMatrix, $x+0.05, $y+0.05)
    _GDIPlus_GraphicsSetTransform($hGraphic, $hMatrix)
    ;_GDIPlus_GraphicsClear($hGraphic)
    $hBrush = _GDIPlus_BrushCreateSolid (0xFFECE9D8)
    _GDIPlus_GraphicsFillRect($hGraphic, -$ImageWidth, -$ImageHeight, -$iWidth / 2, -$iHeight / 2, $hBrush)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, -$iWidth / 2, -$iHeight / 2)
    EndFunc


    Func _SizeSmall()
    _GDIPlus_MatrixScale($hMatrix, $x-0.05, $y-0.05)
    _GDIPlus_GraphicsSetTransform($hGraphic, $hMatrix)
    ;_GDIPlus_GraphicsClear($hGraphic)
    $hBrush = _GDIPlus_BrushCreateSolid (0xFFECE9D8)
    _GDIPlus_GraphicsFillRect($hGraphic, -$ImageWidth, -$ImageHeight, $iWidth*2, $iHeight*2, $hBrush)
    _GDIPlus_GraphicsDrawImage($hGraphic, $hImage, -$iWidth / 2, -$iHeight / 2)
    EndFunc