Mehrere Lupenfenster über Schleifenfunktion erstellen

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

    [autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Opt("MustDeclareVars", 1)

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

    GUISetState()

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    While 1

    [/autoit][autoit][/autoit][autoit]

    $msg = GUIGetMsg()

    [/autoit][autoit][/autoit][autoit]

    _MAG()

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    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

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

    $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND (GUICtrlGetHandle($floor1))

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit]

    Auch wenn ich nichts weiß, muss ich nicht alles glauben

    Einmal editiert, zuletzt von Peri Petie (29. Januar 2013 um 11:45)

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

    Eigentlich völlig simpel (kopfschüttel).

    [autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Opt("MustDeclareVars", 1)

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

    GUISetState()

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    While 1

    [/autoit][autoit][/autoit][autoit]

    $msg = GUIGetMsg()

    [/autoit][autoit][/autoit][autoit]

    _MAG()

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

    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

    [/autoit][autoit][/autoit][autoit]

    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

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit]

    $hGraphic1 = _GDIPlus_GraphicsCreateFromHWND (GUICtrlGetHandle($floor1))

    [/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

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

    [/autoit][autoit][/autoit][autoit][/autoit]

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

    Ansonsten noch ein schönes Restwochenende.

    Auch wenn ich nichts weiß, muss ich nicht alles glauben