veränderbares Bild klickbar machen

  • Hy,

    ich hab da ein Problem. Und zwar möchte ich auf einem Hintergrundbild mehrere Buttons erzeugen die auch Bilder sind. Wenn man mit der Maus drüber fährt soll sich das Bild ändern und man soll dieses Bild dann als Button benutzen können.

    So hier erstmal das Script wie weit ich gekommen bin:

    Spoiler anzeigen
    [autoit][/autoit] [autoit][/autoit] [autoit]

    #include <GuiConstants.au3>
    #NoTrayIcon
    #requireadmin
    #include <array.au3>

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

    $background = GUICreate("hintergrund",1024,768,0,0,$WS_POPUP,$WS_EX_TOOLWINDOW)
    GUISetState(@SW_SHOW, $background)
    GuiCtrlCreatePic("pic.jpg",0,0,1024,768)

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

    Sleep(500)
    $mainbutton1 = GUICreate("mainbutton1", 400, 200, 600,80,$WS_POPUP,$WS_EX_TOOLWINDOW & $WS_EX_TOPMOST)
    GUISetState(@SW_HIDE, $mainbutton1)
    $button1 = GUICtrlCreatePic(@ScriptDir & "\bilder\2.jpg",0,0,200,120)
    GUICtrlSetState($button1, $GUI_ENABLE)

    $mainbutton2 = GUICreate("mainbutton2", 400, 200, 600,80,$WS_POPUP,$WS_EX_TOOLWINDOW & $WS_EX_TOPMOST)
    GUISetState(@SW_SHOW, $mainbutton2)
    $button2 = GUICtrlCreatePic(@ScriptDir & "\bilder\1.jpg",0,0,200,120)
    GUICtrlSetState($button2, $GUI_ENABLE)

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

    Opt("MouseCoordMode", 0)

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

    GuiSetState()

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

    while 1

    $MSG = GUIGetMsg()

    $a = GUIGetCursorInfo($mainbutton2)

    Select

    Case $MSG = $button2
    MsgBox(4096,"meldung2","passt2")

    Case $a[0] > 0 And $a[0] < 400 And $a[1] > 0 And $a[1] < 200
    GUISetState(@SW_HIDE, $mainbutton2)
    GUISetState(@SW_SHOW, $mainbutton1)
    if $MSG = $button2 Then
    MsgBox(4096,"meldung22","passt22")
    EndIf

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

    Case Else
    GUISetState(@SW_HIDE, $mainbutton1)
    GUISetState(@SW_SHOW, $mainbutton2)

    EndSelect

    If $MSG = $GUI_EVENT_CLOSE Then ExitLoop

    sleep(500)

    WEnd

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


    Das Problem ist irgendwie Funktioniert das Script auch aber wenn ich drauf klicke erscheint die Meldung erst ca. 30 sec. später. Hat einer vll eine Lösung parat?

    thx

    Einmal editiert, zuletzt von Masterraven9 (2. März 2008 um 08:29)

  • So ...

    Probiere mal das hier ...

    Spoiler anzeigen
    [autoit]

    #include-once
    #include <GUIConstants.au3>

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

    $btnFoldD = @ScriptDir & '\BtnFoldD.bmp'
    $btnFoldH = @ScriptDir & '\BtnFoldH.bmp'
    $btnStartD = @ScriptDir & '\BtnStartD.bmp'
    $btnStartH = @ScriptDir & '\BtnStartH.bmp'
    $btnStpD = @ScriptDir & '\BtnStpD.bmp'
    $btnStpH = @ScriptDir & '\BtnStpH.bmp'

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

    $hWndTest = GUICreate(' My GUI PicButton', 635, 476, -1, -1)
    GUISetBkColor(0x000000) ; Hintergrund schwarz RGB
    $btnDefault = GUICtrlCreateButton('Standard', 40, 100, 80, 30)
    $btnStart = GUICtrlCreatePic($btnStartD, 200, 100, 80, 27, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
    $btnStop = GUICtrlCreatePic($btnStpD, 200, 150, 80, 27, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))
    $btnFolder = GUICtrlCreatePic($btnFoldD, 200, 200, 40, 27, BitOR($SS_NOTIFY, $WS_GROUP, $WS_CLIPSIBLINGS))

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

    GUISetState()

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

    While 1

    $nMsg = GUIGetMsg()

    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $btnDefault
    MsgBox(0, '', 'Standard Button wurde gedrückt.', 2)
    EndSwitch
    _PicButtonFromFile($hWndTest, $btnStart, $btnStartD, $btnStartH, $btnStartH, 'Start', '@ScriptDir, Picture.bmp')
    _PicButtonFromFile($hWndTest, $btnStop, $btnStpD, $btnStpH, $btnStpH, 'Terminate')
    _PicButtonFromFile($hWndTest, $btnFolder, $btnFoldD, $btnFoldH, $btnFoldH, 'SelectFolder')

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

    WEnd

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

    Func _PicButtonFromFile($hWnd, $controlID, $defaultPic, $onHoverPic, $onClickPic, $Function = '', $parameters = '')

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

    If StringInStr($parameters, ',') Then
    $parameters = StringSplit($parameters, ',')
    $parameters[0] = 'CallArgArray'
    EndIf
    Local $resFunc
    If $onClickPic = '' Or $onClickPic = -1 Then $onClickPic = $onHoverPic
    $cMsg = GUIGetCursorInfo($hWnd)
    If $cMsg[4] = $controlID Then
    GUICtrlSetImage( $controlID, $onHoverPic)
    $cMsg = GUIGetCursorInfo($hWnd)
    While $cMsg[4] = $controlID
    If GUIGetMsg() = $controlID Then
    GUICtrlSetImage( $controlID, $onClickPic)
    $resFunc = Call($Function, $parameters)
    EndIf
    Sleep(10)
    $cMsg = GUIGetCursorInfo($hWnd)
    WEnd
    GUICtrlSetImage($controlID, $defaultPic)
    Return $resFunc
    EndIf

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

    EndFunc ;==>_PicButtonFromFile

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

    Func SelectFolder()

    FileSelectFolder('Ordner wählen', @MyDocumentsDir)
    ;;;

    EndFunc

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

    Func Start($path, $file)

    MsgBox(0, '', 'Start Picture Button wurde gedrückt.', 2)
    MsgBox(0, 'Beisp. Funktionsparameter', $path & '\' & $file, 2)
    ;;;

    EndFunc

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

    Func Terminate()

    MsgBox(0, '', 'Beenden Picture Button wurde gedrückt.', 2)
    ;;;

    EndFunc

    [/autoit]

    autoit.de/wcf/attachment/1986/

    Gruß
    Greenhorn

  • thx hast mir echt geholfen.

    Bin jetzt erstmal am Quelltext verstehen aber ist dir aufgefallen das wenn du keine Parameter angibst sich die Bilder auch nicht anklicken lassen?
    Siehe Beenden

    trotzdem

    thx

  • Den Call-Aufruf habe ich gestern Abend erst eingebaut ..., vorher hatte ich es über Execute gemacht, das funzte aber nur ohne Parameter für die Funktionen. ;)

    Nun geht's.

    Spoiler anzeigen
    [autoit]

    Func _PicButtonFromFile($hWnd, $controlID, $defaultPic, $onHoverPic, $onClickPic, $Function = '', $parameters = '')

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

    If StringInStr($parameters, ',') Then
    $parameters = StringSplit($parameters, ',')
    $parameters[0] = 'CallArgArray'
    EndIf
    Local $resFunc
    If $onClickPic = '' Or $onClickPic = -1 Then $onClickPic = $onHoverPic
    $cMsg = GUIGetCursorInfo($hWnd)
    If $cMsg[4] = $controlID Then
    GUICtrlSetImage( $controlID, $onHoverPic)
    $cMsg = GUIGetCursorInfo($hWnd)
    While $cMsg[4] = $controlID
    If GUIGetMsg() = $controlID Then
    GUICtrlSetImage( $controlID, $onClickPic)
    If $parameters Then
    $resFunc = Call($Function, $parameters)
    Else
    $resFunc = Call($Function)
    EndIf
    EndIf
    Sleep(10)
    $cMsg = GUIGetCursorInfo($hWnd)
    WEnd
    GUICtrlSetImage($controlID, $defaultPic)
    Return $resFunc
    EndIf

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

    EndFunc ;==>_PicButtonFromFile

    [/autoit]

    Gruß
    Greenhorn


  • Nochmals thx für deine Hilfe.

    Nun hab ich aber ein anderes Problem ich möchte gerne diese Schaltflächen aus einer *.ini Datei in einer Schleife erstellen.

    Das funktioniert auch bis auf das ich keine Funktionen in einer Schleife erstellen kann.

    Spoiler anzeigen
    [autoit]


    #include <GuiConstants.au3>
    #include <File.au3>
    #NoTrayIcon
    #requireadmin

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

    $guiname = IniRead(@ScriptDir & "\config.ini", "main", "name", "philsign")
    $guiwidth = IniRead(@ScriptDir & "\config.ini", "main", "width", "1680")
    $guiheight = IniRead(@ScriptDir & "\config.ini", "main", "height", "1050")
    $posguix = IniRead(@ScriptDir & "\config.ini", "main", "posguix", "0")
    $posguiy = IniRead(@ScriptDir & "\config.ini", "main", "posguiy", "0")

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

    $anzbtn = IniRead(@ScriptDir & "\config.ini", "main", "anzahl-button", "4")
    $guipic = IniRead(@ScriptDir & "\config.ini", "main", "pfad-hg", "")
    $pospicx = IniRead(@ScriptDir & "\config.ini", "main", "pospicx", "0")
    $pospicy = IniRead(@ScriptDir & "\config.ini", "main", "pospicy", "0")
    $i = 0

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

    $background = GUICreate($guiname,$guiwidth,$guiheight,$posguix,$posguiy,$WS_POPUP,$WS_EX_TOOLWINDOW)
    GuiCtrlCreatePic($guipic,$pospicx,$pospicy,$guiwidth,$guiheight)
    GUICtrlSetState(-1,$GUI_DISABLE)

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

    Do
    $btnname[$i] = IniRead(@ScriptDir & "\config.ini", "button" & $i, "name", "")
    $btnposx[$i] = IniRead(@ScriptDir & "\config.ini", "button" & $i, "posx", "")
    $btnposy[$i] = IniRead(@ScriptDir & "\config.ini", "button" & $i, "posy", "")
    $btnwidth[$i] = IniRead(@ScriptDir & "\config.ini", "button" & $i, "width", "")
    $btnheight[$i] = IniRead(@ScriptDir & "\config.ini", "button" & $i, "height", "")
    $btnpic1[$i] = IniRead(@ScriptDir & "\config.ini", "button" & $i, "pic1", "")
    $btnpic2[$i] = IniRead(@ScriptDir & "\config.ini", "button" & $i, "pic2", "")
    $btnprog[$i] = IniRead(@ScriptDir & "\config.ini", "button" & $i, "programm", "Meldung")
    $btnprogdir[$i] = IniRead(@ScriptDir & "\config.ini", "button" & $i, "programmdir", "")

    $i = $i + 1
    Until $i = $anzbtn

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

    $i = 0
    Do
    $button[$i] = GUICtrlCreatePic($btnpic1[$i], $btnposx[$i], $btnposy[$i], $btnwidth[$i], $btnheight[$i])
    $i = $i + 1
    Until $i = $anzbtn

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

    GUISetState()

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

    While 1

    $nMsg = GUIGetMsg()

    Select
    Case $nMsg = $GUI_EVENT_CLOSE
    Exit
    EndSelect

    $i = 0
    Do
    _PicButtonFromFile($background, $button[$i], $btnpic1[$i], $btnpic2[$i], $btnpic2[$i], $btnname[$i])
    $i = $i + 1
    Until $i = $anzbtn

    WEnd

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

    Func _PicButtonFromFile($hWnd, $controlID, $defaultPic, $onHoverPic, $onClickPic, $Function = '')

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

    Local $resFunc
    If $onClickPic = '' Or $onClickPic = -1 Then $onClickPic = $onHoverPic
    $cMsg = GUIGetCursorInfo($hWnd)
    If $cMsg[4] = $controlID Then
    GUICtrlSetImage( $controlID, $onHoverPic)
    $cMsg = GUIGetCursorInfo($hWnd)
    While $cMsg[4] = $controlID
    If GUIGetMsg() = $controlID Then
    GUICtrlSetImage( $controlID, $onClickPic)
    $resFunc = Call($Function)
    EndIf
    Sleep(10)
    $cMsg = GUIGetCursorInfo($hWnd)
    WEnd
    GUICtrlSetImage($controlID, $defaultPic)
    Return $resFunc
    EndIf

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

    EndFunc ;==>_PicButtonFromFile

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

    $i = 0

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

    Do

    Func _funktion()

    Select

    Case $btnprog[$i] = 'EXIT'
    Exit

    Case $btnprog[$i] = 'Meldung'
    MsgBox(4096,"Meldung","Dieser Button wurde noch nicht belegt")

    Case Else
    Run($btnprog[$i], $btnprogdir[$i])

    EndSelect

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

    EndFunc

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

    $i = $i + 1

    Until $i = $anzbtn

    [/autoit]

    und hier noch die *.ini datei

    Spoiler anzeigen


    [main]
    name=philsign
    width=1680
    height=1050
    posguix=0
    posguiy=0

    pfad-hg=hg.jpg
    pospicx=0
    pospicy=0

    anzahl-button=4


    [button0]
    name=x
    posx=1640
    posy=0
    width=40
    height=40
    pic1=x1.jpg
    pic2=x2.jpg
    programm=EXIT
    programmdir=

    [button1]
    name=tv
    posx=1275
    posy=85
    width=205
    height=109
    pic1=tv1.jpg
    pic2=tv2.jpg
    programm=C:\Programme\WinTV\WinTV2K.EXE
    programmdir=C:\Programme\WinTV\

    [button2]
    name=musik
    posx=1210
    posy=481
    width=352
    height=84
    pic1=musik1.jpg
    pic2=musik2.jpg
    programm=C:\Programme\Winamp\winamp.exe
    programmdir=C:\Programme\Winamp\

    [button3]
    name=video
    posx=1202
    posy=868
    width=343
    height=92
    pic1=vid1.jpg
    pic2=vid2.jpg
    programm=movie.exe
    programmdir=

    Ist das überhaupt möglich?

    Bin für jede Hilfe dankbar.

    thx

  • Ok hab das Problem selber gelöst.
    Manchmal sieht man den Wald vor lauter Bäumen nicht.

    Ich habs so gelöst:

    Spoiler anzeigen
    [autoit]


    #include <GuiConstants.au3>
    #include <File.au3>
    #include <array.au3>
    #NoTrayIcon
    #requireadmin

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

    $guiname = IniRead(@ScriptDir & "\config.ini", "main", "name", "philsign")
    $guiwidth = IniRead(@ScriptDir & "\config.ini", "main", "width", "1680")
    $guiheight = IniRead(@ScriptDir & "\config.ini", "main", "height", "1050")
    $posguix = IniRead(@ScriptDir & "\config.ini", "main", "posguix", "0")
    $posguiy = IniRead(@ScriptDir & "\config.ini", "main", "posguiy", "0")

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

    $anzbtn = IniRead(@ScriptDir & "\config.ini", "main", "anzahl-button", "4")
    $guipic = IniRead(@ScriptDir & "\config.ini", "main", "pfad-hg", "")
    $pospicx = IniRead(@ScriptDir & "\config.ini", "main", "pospicx", "0")
    $pospicy = IniRead(@ScriptDir & "\config.ini", "main", "pospicy", "0")

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

    $background = GUICreate($guiname,$guiwidth,$guiheight,$posguix,$posguiy,$WS_POPUP,$WS_EX_TOOLWINDOW)
    GuiCtrlCreatePic($guipic,$pospicx,$pospicy,$guiwidth,$guiheight)
    GUICtrlSetState(-1,$GUI_DISABLE)

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

    Dim $btnname[$anzbtn], $btnposx[$anzbtn], $btnposy[$anzbtn], $btnwidth[$anzbtn], $btnheight[$anzbtn], $btnpic1[$anzbtn], $btnpic2[$anzbtn], $btnprog[$anzbtn], $btnprogdir[$anzbtn], $button[$anzbtn]

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

    $i = 0
    Do
    $btnname[$i] = IniRead(@ScriptDir & "\config.ini", "button" & $i, "name", "")
    $btnposx[$i] = IniRead(@ScriptDir & "\config.ini", "button" & $i, "posx", "")
    $btnposy[$i] = IniRead(@ScriptDir & "\config.ini", "button" & $i, "posy", "")
    $btnwidth[$i] = IniRead(@ScriptDir & "\config.ini", "button" & $i, "width", "")
    $btnheight[$i] = IniRead(@ScriptDir & "\config.ini", "button" & $i, "height", "")
    $btnpic1[$i] = IniRead(@ScriptDir & "\config.ini", "button" & $i, "pic1", "")
    $btnpic2[$i] = IniRead(@ScriptDir & "\config.ini", "button" & $i, "pic2", "")
    $btnprog[$i] = IniRead(@ScriptDir & "\config.ini", "button" & $i, "programm", "Meldung")
    $btnprogdir[$i] = IniRead(@ScriptDir & "\config.ini", "button" & $i, "programmdir", "")

    $i = $i + 1
    Until $i = $anzbtn

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

    $i = 0
    Do
    $button[$i] = GUICtrlCreatePic($btnpic1[$i], $btnposx[$i], $btnposy[$i], $btnwidth[$i], $btnheight[$i])
    $i = $i + 1
    Until $i = $anzbtn

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

    GUISetState()

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

    While 1

    $nMsg = GUIGetMsg()

    Select
    Case $nMsg = $GUI_EVENT_CLOSE
    Exit
    EndSelect

    $i = 0
    Do
    _PicButtonFromFile($background, $button[$i], $btnpic1[$i], $btnpic2[$i], $btnpic2[$i], $btnname[$i])
    $i = $i + 1
    Until $i = $anzbtn

    WEnd

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

    Func _PicButtonFromFile($hWnd, $controlID, $defaultPic, $onHoverPic, $onClickPic, $Function = "")

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

    Local $resFunc
    If $onClickPic = '' Or $onClickPic = -1 Then $onClickPic = $onHoverPic
    $cMsg = GUIGetCursorInfo($hWnd)
    If $cMsg[4] = $controlID Then
    GUICtrlSetImage( $controlID, $onHoverPic)
    $cMsg = GUIGetCursorInfo($hWnd)
    While $cMsg[4] = $controlID
    If GUIGetMsg() = $controlID Then
    GUICtrlSetImage( $controlID, $onClickPic)
    $resFunc = Call("_aufruf",$Function)
    EndIf
    Sleep(10)
    $cMsg = GUIGetCursorInfo($hWnd)
    WEnd
    GUICtrlSetImage($controlID, $defaultPic)
    Return $resFunc
    EndIf

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

    EndFunc ;==>_PicButtonFromFile

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

    Func _aufruf($name)

    $i = 0
    $zahl = 0

    Do
    If $name = $btnname[$i] Then
    $zahl = $i
    ExitLoop
    EndIf
    $i = $i + 1
    Until $i = $anzbtn

    Select

    Case $btnprog[$zahl] = 'EXIT'
    Exit

    Case $btnprog[$zahl] = ''
    MsgBox(4096,"Meldung","Dieser Button wurde noch nicht belegt")

    Case $btnprog[$zahl] <> ''
    Run($btnprog[$zahl], $btnprogdir[$zahl])

    EndSelect

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

    EndFunc

    [/autoit]

    Und nochmals BIG THX an Greenhorn der mich erst soweit gebracht hat :thumbup: