$hWnd des erstellen Fensters im Unterprogramm erfragen

  • Hey Leute:
    ich erstelle im HauptCode ein Fenster:

    [autoit]

    GuiCreate("Hallo")
    #include <unterprogramm.au3>

    [/autoit]

    unterprogramm.au3:

    [autoit]


    #Include <GDIPlus.au3>
    _GDIPlus_GraphicsCreateFromHWND($hWnd)

    [/autoit]

    Ich versuche an das "$hWnd" heranzukommen, OHNE eine Variable extra "durchschleifen" zu müssen...!
    Normalerweise geht es ja, wenn man den Befehl danach schreibt und dann "-1" verwendet! Das geht leider in dem Include nicht!
    Ein Macro dafür existiert leider auch nicht...

    Habt ihr ne Idee..?

  • Möglich wäre es so:

    Haupt.au3:

    [autoit]

    #include<unterprogramm.au3>
    _Funktion(GuiCreate("Meine GUI", ...)

    [/autoit]

    unterprogramm.au3:

    [autoit]

    #include<GDIPlus.au3>
    func _Funktion($hWnd)
    _GDIPlus_GraphicsCreateFromHWND($hWnd)
    return
    endfunc

    [/autoit]

    Dann hättest du zwar ne Variable, aber die brauchst du net mitschleifen.

    mfg
    Hauke

  • Sehr Gute Ideen Leute, nur leider helfen sie mir nicht, denn mein Script sieht folgendermaßen aus:
    (danke an Mars für dieses Script!)

    neu.au3

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

    #include <GDIPlus.au3>
    #include <Misc.au3>
    #include 'Buttons.au3'

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

    Opt('GUIOnEventMode', 1) ;Immer wieder sinnvoll
    Opt("MustDeclareVars", 1) ;Um Fehlern aus dem Weg zu gehen
    Opt("MouseCoordMode", 2) ;Damit die Koords vom Button korrekt erkannt werden.

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

    _GDIPlus_Startup()

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

    Global Const $hGUI = GUICreate('Test', 220, 250)
    GUISetOnEvent(-3, '_Exit', $hGUI)
    WinSetTrans($hGUI, '', 255)

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

    Global $hButton = _Button_Init(10, 10, 200, 60, $hGUI) ;Letzte Nr ist die Universelle Nummer
    _Button_Set_Pic($hButton, 0, 'n1.png')
    _Button_Set_Pic($hButton, 1, 'h1.png')
    _Button_Set_Pic($hButton, 2, 'k1.png')
    _Button_Set_Ani_Speed($hButton, 30, 14, 7)

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

    Global $hButton2 = _Button_Init(10, 80, 200, 60, $hGUI) ;Letzte Nr ist die Universelle Nummer
    _Button_Set_Pic($hButton2, 0, 'Normal1.png', 'Normal2.png', 'Normal3.png', 'Normal4.png', 'Normal5.png', 'Normal6.png', 'Normal7.png', 'Normal8.png')
    _Button_Set_Pic($hButton2, 1, 'Hover1.png', 'Hover2.png', 'Hover3.png', 'Hover4.png', 'Hover5.png')
    _Button_Set_Pic($hButton2, 2, 'Pr1.png', 'Pr2.png', 'Pr3.png', 'Pr4.png', 'Pr5.png', 'Pr6.png')
    _Button_Set_Ani_Speed($hButton2, 8, 2, 20)

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

    Global $Btn_msg
    ;~ Global $_____Btn_Msg
    Global $pos, $klick
    Global $Temp
    Local $t = TimerInit()
    GUISetState(@SW_SHOW, $hGUI)

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

    While Sleep(10)
    ;_GDIPlus_GraphicsClear($hBackbuffer, 0xFF000000)

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

    $Btn_msg = _Button_Get_Pressed()
    _Button_Draw($hBackbuffer, $hButton)
    _Button_Draw($hBackbuffer, $hButton2)

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

    _GDIPlus_GraphicsDrawImage($hGraphic, $hBitmap, 0, 0)
    WEnd

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

    Func _Exit()
    _Button_Dispose($hButton)
    _Button_Dispose($hButton2)
    _GDIPlus_GraphicsDispose($hBackbuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    [/autoit]


    Buttons.au3

    [autoit]


    #include-once
    #include <Misc.au3>
    #include <GDIPlus.au3>

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

    Global $_____Btn_Msg = 0
    Global $_____Btn_Klick = False
    Global $_____Btn_pos = MouseGetPos()
    Global $_Buttons_Button_Init_Nr = 0

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

    ; #FUNCTION# ======================================================================================
    ; Name ..........: _____Kollision_Viereck_Punkt()
    ; Description ...: Überprüft ob ein Punkt innerhalb eines Vierecks liegt.
    ; Syntax ........: _____Kollision_Viereck_Punkt($x1, $y1, $x2, $y2, $b2, $h2)
    ; Parameters ....: $x1 - X-Koord des Punktes
    ; $y1 - Y-Koord des Punktes
    ; $x2 - X-Koord des Vierecks
    ; $y2 - Y-Koord des Vierecks
    ; $b2 - Breite des Vierecks
    ; $h2 - Höhe des Vierecks
    ; Return values .: Success True
    ; Failure False
    ; Author ........: Mars(i)
    ; =================================================================================================

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

    Func _____Kollision_Viereck_Punkt($x1, $y1, $x2, $y2, $b2, $h2)
    Return ($x1 > $x2 And $y1 > $y2 And $x1 < $x2 + $b2 And $y1 < $y2 + $h2)
    EndFunc

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

    ; #FUNCTION# ======================================================================================
    ; Name ..........: _Button_Dispose()
    ; Description ...: Gibt den vom Button verwendeten Speicherplatz wieder frei
    ; Syntax ........: _Button_Dispose($a)
    ; Parameters ....: $a - Handle des Buttons
    ; Author ........: Mars
    ; Related .......: _Button_Init
    ; =================================================================================================

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

    Func _Button_Dispose($a)
    For $i = 0 To 23 Step 1
    If $a[$i] Then _GDIPlus_ImageDispose($a[$i])
    Next
    EndFunc

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

    ; #FUNCTION# ======================================================================================
    ; Name ..........: _Button_Draw()
    ; Description ...: Zeichnet den Button auf den angegebenen Puffer
    ; Syntax ........: _Button_Draw($buffer, ByRef $btn)
    ; Parameters ....: $buffer - Der Puffer auf den Gezeichnet werden soll.
    ; ByRef $btn - Handle des Buttons
    ; Author ........: Mars
    ; =================================================================================================

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

    Func _Button_Draw($buffer, ByRef $btn)
    Switch $btn[28]
    Case 0 ;Normal
    If $btn[$btn[30]] Then
    _GDIPlus_GraphicsDrawImage($buffer, $btn[Floor($btn[30])], $btn[24], $btn[25])
    Else
    $btn[30] = 0
    _GDIPlus_GraphicsDrawImage($buffer, $btn[Floor($btn[30])], $btn[24], $btn[25])
    EndIf
    If $btn[Floor($btn[30]+0.1)] And $btn[30] + $btn[33] < 8 Then
    $btn[30] += $btn[33]
    Else
    $btn[30] = 0
    EndIf
    Case 1 ;Hover
    If $btn[$btn[31]] Then
    _GDIPlus_GraphicsDrawImage($buffer, $btn[Floor($btn[31])], $btn[24], $btn[25])
    Else
    $btn[31] = 8
    _GDIPlus_GraphicsDrawImage($buffer, $btn[Floor($btn[31])], $btn[24], $btn[25])
    EndIf
    If $btn[Floor($btn[31]+0.1)] And $btn[31] + $btn[34] < 16 Then
    $btn[31] += $btn[34]
    Else
    $btn[31] = 8
    EndIf
    Case 2 ;Klick
    If $btn[$btn[32]] Then
    _GDIPlus_GraphicsDrawImage($buffer, $btn[Floor($btn[32])], $btn[24], $btn[25])
    Else
    $btn[32] = 16
    _GDIPlus_GraphicsDrawImage($buffer, $btn[Floor($btn[32])], $btn[24], $btn[25])
    EndIf
    If $btn[Floor($btn[32]+0.1)] And $btn[32] + $btn[35] < 24 Then
    $btn[32] += $btn[35]
    Else
    $btn[32] = 16
    EndIf
    EndSwitch
    If _____Kollision_Viereck_Punkt($_____Btn_pos[0], $_____Btn_pos[1], $btn[24], $btn[25], $btn[26], $btn[27]) Then
    If $_____Btn_Klick Then
    $btn[28] = 2
    Else
    If $btn[28] = 2 Then
    $btn[28] = 1
    $_____Btn_Msg = $btn[29]
    Else
    $btn[28] = 1
    EndIf

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

    EndIf
    Else
    $btn[28] = 0
    EndIf
    EndFunc

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

    ; #FUNCTION# ======================================================================================
    ; Name ..........: _Button_Get_Pressed()
    ; Description ...: Überprüft ob geklickt wurde und wo die Maus steht. Sollte VOR dem Draw stehen.
    ; Syntax ........: _Button_Get_Pressed()
    ; Author ........: Mars
    ; =================================================================================================

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

    Func _Button_Get_Pressed()
    Local $a = $_____Btn_Msg
    $_____Btn_Msg = 0
    $_____Btn_Klick = _IsPressed('01')
    $_____Btn_pos = MouseGetPos()
    Return $a
    EndFunc

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

    ; #FUNCTION# ======================================================================================
    ; Name ..........: _Button_Init()
    ; Description ...: Erstellt ein Button Handle (ohne Bilder)
    ; Syntax ........: _Button_Init($x, $y, $b, $h, $_Buttons_Button_Init_Nr)
    ; Parameters ....: $x - X-Pos des Buttons
    ; $y - Y-Pos des Buttons
    ; $b - Breite des Buttons
    ; $h - Höhe des Buttons
    ; $hGUI - GUI des Buttons
    ; Return values .: Success Handle für einen Button
    ; Failure Kommt nicht in die Tüte
    ; Author ........: Mars
    ; Related .......: _Button_Dispose
    ; =================================================================================================

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

    Func _Button_Init( $x, $y, $b, $h, $hGUI)
    ;Eigene ID für Button
    $_Buttons_Button_Init_Nr = $_Buttons_Button_Init_Nr +1

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

    ;Zum Zeichnen der Button den Grafikbereich im Fenster initialisieren...
    Local $dimension = WinGetPos($hGUI)
    Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($dimension[2], $dimension[3], $hGraphic)
    Global $hBackbuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)

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

    Local $Btn[36]
    ;in 0-7 sind Bilder von Normal
    ;in 8-15 sind Bilder von Hover
    ;in 16-23 sind Bilder von Klick
    $Btn[24] = $x ;x - Pos
    $Btn[25] = $y ;y - Pos
    $Btn[26] = $b ;Breite
    $Btn[27] = $h ;Höhe
    $Btn[28] = 0 ;Normal = Grundzustand
    $Btn[29] = $_Buttons_Button_Init_Nr ;Rückgabewert beim Press
    $Btn[30] = 0 ;Animationspos
    $Btn[31] = 8 ;Animationspos
    $Btn[32] = 16 ;Animationspos
    $Btn[33] = 0.1 ;Animationsspeed
    $Btn[34] = 0.1; Animationsspeed
    $Btn[35] = 0.1 ;Animationsspeed
    Return $Btn
    EndFunc

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

    ; #FUNCTION# ======================================================================================
    ; Name ..........: _Button_Set_Ani_Speed()
    ; Description ...: Verändert die Animationsgeschwindigkeit
    ; Syntax ........: _Button_Set_Ani_Speed(ByRef $a, $b, $c, $d)
    ; Parameters ....: ByRef $a - Handle des Buttons
    ; $b - Animationsspeed für den "Normal" Zustand. (In Frames pro Bild)
    ; $c - Animationsspeed für den "Hover" Zustand. (In Frames pro Bild)
    ; $d - Animationsspeed für den "Klick" Zustand. (In Frames pro Bild)
    ; Author ........: Mars
    ; =================================================================================================

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

    Func _Button_Set_Ani_Speed(ByRef $a, $b, $c, $d)
    $a[33] = 1/$b
    $a[34] = 1/$c
    $a[35] = 1/$d
    EndFunc

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

    ; #FUNCTION# ======================================================================================
    ; Name ..........: _Button_Set_Pic()
    ; Description ...: Weist einem Button bis zu 8 Bilder pro Status zu
    ; Syntax ........: _Button_Set_Pic(ByRef $a, $welche[, $b = False[, $c = False[, $d = False[, $e = False[, $f = False[, $g = False[, $h = False[, $i = False]]]]]]]])
    ; Parameters ....: ByRef $a - Handle des Buttons
    ; $welche - Status für den Die Bilder vorgesehen sind:
    ; |0 - Normal
    ; |1 - Hover
    ; |2 - Klick
    ; $b - [optional] Pfad zu einem Bild (default:False)
    ; $c - [optional] Pfad zu einem Bild (default:False)
    ; $d - [optional] Pfad zu einem Bild (default:False)
    ; $e - [optional] Pfad zu einem Bild (default:False)
    ; $f - [optional] Pfad zu einem Bild (default:False)
    ; $g - [optional] Pfad zu einem Bild (default:False)
    ; $h - [optional] Pfad zu einem Bild (default:False)
    ; $i - [optional] Pfad zu einem Bild (default:False)
    ; Author ........: Mars
    ; Remarks .......: Es kann auch nur ein Bild angegeben werden. In diesem Fall ist der Button nicht animiert.
    ; Die Bilder sollten der Buttongröße die bei _Button_Init angegeben wurde entsprechen.
    ; Die Bilder können nicht nachträglich verändert werden. Also den Button löchen und einen Neuen machen.
    ; =================================================================================================

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

    Func _Button_Set_Pic(ByRef $a, $welche, $b = False, $c = False, $d = False, $e = False, $f = False, $g = False, $h = False, $i = False)
    Switch $welche
    Case 0 ;Normal
    If $b Then $a[0] = _GDIPlus_ImageLoadFromFile($b)
    If $c Then $a[1] = _GDIPlus_ImageLoadFromFile($c)
    If $d Then $a[2] = _GDIPlus_ImageLoadFromFile($d)
    If $e Then $a[3] = _GDIPlus_ImageLoadFromFile($e)
    If $f Then $a[4] = _GDIPlus_ImageLoadFromFile($f)
    If $g Then $a[5] = _GDIPlus_ImageLoadFromFile($g)
    If $h Then $a[6] = _GDIPlus_ImageLoadFromFile($h)
    If $i Then $a[7] = _GDIPlus_ImageLoadFromFile($i)
    Case 1 ;Hover
    If $b Then $a[8] = _GDIPlus_ImageLoadFromFile($b)
    If $c Then $a[9] = _GDIPlus_ImageLoadFromFile($c)
    If $d Then $a[10] = _GDIPlus_ImageLoadFromFile($d)
    If $e Then $a[11] = _GDIPlus_ImageLoadFromFile($e)
    If $f Then $a[12] = _GDIPlus_ImageLoadFromFile($f)
    If $g Then $a[13] = _GDIPlus_ImageLoadFromFile($g)
    If $h Then $a[14] = _GDIPlus_ImageLoadFromFile($h)
    If $i Then $a[15] = _GDIPlus_ImageLoadFromFile($i)
    Case 2 ;Gedrückt
    If $b Then $a[16] = _GDIPlus_ImageLoadFromFile($b)
    If $c Then $a[17] = _GDIPlus_ImageLoadFromFile($c)
    If $d Then $a[18] = _GDIPlus_ImageLoadFromFile($d)
    If $e Then $a[19] = _GDIPlus_ImageLoadFromFile($e)
    If $f Then $a[20] = _GDIPlus_ImageLoadFromFile($f)
    If $g Then $a[21] = _GDIPlus_ImageLoadFromFile($g)
    If $h Then $a[22] = _GDIPlus_ImageLoadFromFile($h)
    If $i Then $a[23] = _GDIPlus_ImageLoadFromFile($i)
    EndSwitch
    EndFunc

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

    ...

    Ich versuche diese Funktionen so zu überarbeiten, dass all diese Initialisierungs- und Variablen - Hantierung im Hintergrund passiert..

    der Aufruf:

    [autoit]

    Global $hButton = _Button_Init(10, 10, 200, 60, $hGUI)

    [/autoit]

    sollte auch ganz gut ohne $hGUI funktionieren, weil man diesen ja beim normalen GuiCrtlCreateButton auch nicht an gibt....

    Also meine Frage nochmal:

    "Wie komme ich im Unterprogramm/Include auf das Handle des zuletzt erstellen Fensters"

    Danke für eure Antworten :)