Mouseover und Buttonklicks in der selben Loop

  • Ziel des Ganzen ist es, das Nebenstehende Labels eines Buttons zu färben sobald die Maus über den Button fährt.
    Das ist soweit auch schon geschafft, ABER - nun kommt das Problem ?( - sobald ich auf den Button klicke habe ich mal das Glück, dass er seine Funktion ausführt, die meißte Zeit klick ich jedoch ins leere.
    Hängt wohl damit zusammen, dass beides in der gleichen Loop ist, aber ich habe keine Idee wie ich mich aus der Sache halbwegs elegant hinausmanövriere :wacko: .

    Spoiler anzeigen
    [autoit]

    Local $fLableHovered

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

    While 1
    $msg = GUIGetMsg()
    $nmsg = GUIGetMsg()

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

    Switch $nmsg
    Case 0 ; kein GUI_Event
    $aCursor = GUIGetCursorInfo($frm_central)
    If Not IsArray($aCursor) Then ContinueLoop

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

    If $aCursor[4] = $cmd_clean Then ; Maus über Label
    If Not $fLableHovered Then
    GUICtrlSetColor($lbl_clean,0xFF0000)
    $fLableHovered = True
    EndIf
    Else ; Maus nicht über Label
    If $fLableHovered Then
    GUICtrlSetColor($lbl_clean,0x000000)
    $fLableHovered = False
    EndIf
    EndIf
    EndSwitch
    Select
    Case $msg = $cmd_ok

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

    Case $msg = $cmd_cancel
    If MsgBox(36,"Beenden","Wollen sie das Programm beenden?") = 6 Then
    Exit
    EndIf
    Case $msg = $GUI_EVENT_MINIMIZE
    MsgBox(0, "", "Dialog wurde minimiert", 2)
    Case $msg = $GUI_EVENT_MAXIMIZE
    MsgBox(0, "", "Dialog wurde wiederhergestellt", 2)
    Case $msg = $GUI_EVENT_CLOSE
    Exit
    Case $msg = $cmd_defrag
    If $windows = "Windows 7" Then
    ShellExecute(@WindowsDir&"\system32\dfrgui.exe",@SW_MAXIMIZE)
    Else
    ShellExecute(@WindowsDir&"\system32\dfrg.msc",@SW_MAXIMIZE)
    EndIf
    Case $msg = $cmd_clean
    ShellExecute(@WindowsDir&"\system32\cleanmgr.exe",@SW_MAXIMIZE)
    Case $msg = $cmd_software
    _RunDOS("APPWIZ.CPL")
    Case $msg = $cmd_wireshark
    Run("program\WiresharkPortable\WiresharkPortable.exe","",@SW_MAXIMIZE)
    Case $msg = $cmd_cports
    Run("program\cports\cports.exe")
    Case $msg = $cmd_etoolz
    Run("program\eToolz\eToolz.exe")
    Case $msg = $cmd_freecom
    Run("program\FreeCommander\FreeCommanderPortable.exe")
    Case $msg = $cmd_homedale
    Run("program\Homedale\Homedale.exe")
    Case $msg = $cmd_macadress
    Run("program\Macadressview\MACAddressView.exe")
    Case $msg = $cmd_netscan
    Run("program\Netscan\netscan.exe","")
    Case $msg = $cmd_nmap

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

    Case $msg = $cmd_notepad
    Run("program\Notepad++Portable\Notepad++Portable.exe")
    Case $msg = $cmd_netpass
    Run("program\Netpass\netpass.exe")
    Case $msg = $cmd_tmview
    Run("program\Teamviewer\TeamViewer.exe")
    Case $msg = $cmd_winpcap

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

    EndSelect
    WEnd

    [/autoit]

    Einmal editiert, zuletzt von ChuckSOG (15. Oktober 2011 um 20:35)

  • Ich empfehle den OnEvent-Modus:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    Opt("GUIOnEventMode", 1)

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

    $hGui = GUICreate("Test")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUISetOnEvent($GUI_EVENT_MOUSEMOVE, "_MouseMove")

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

    $cButton1 = GUICtrlCreateButton("Test 1", 10, 10, 80, 20)
    GUICtrlSetOnEvent(-1, "_Click")
    $cLabel1 = GUICtrlCreateLabel("", 100, 10, 20, 20)

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

    $cButton2 = GUICtrlCreateButton("Test 2", 10, 40, 80, 20)
    GUICtrlSetOnEvent(-1, "_Click")
    $cLabel2 = GUICtrlCreateLabel("", 100, 40, 20, 20)
    GUISetState()

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

    While Sleep(100)
    WEnd

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

    Func _Click()
    Switch @GUI_CtrlId
    Case $cButton1
    MsgBox(0, "", "Button 1")
    Case $cButton2
    MsgBox(0, "", "Button 2")
    EndSwitch
    EndFunc ;==>_Click

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

    Func _MouseMove()
    Local $aInfo = GUIGetCursorInfo($hGui)

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

    GUICtrlSetBkColor($cLabel1, 0xFF0000)
    GUICtrlSetBkColor($cLabel2, 0xFF0000)

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

    Switch $aInfo[4]
    Case $cButton1
    GUICtrlSetBkColor($cLabel1, 0x00FF00)
    Case $cButton2
    GUICtrlSetBkColor($cLabel2, 0x00FF00)
    EndSwitch

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

    EndFunc ;==>_MouseMove

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Um das evtl. Flackern noch abzustellen, müsste man noch etwas in die Trickkiste greifen ;)


    Alternativ dazu findest du im Forum die UDF "GuiCtrlSetOnHover" oder so ähnlich, damit sollte das auch funktionieren...

    E

  • Hat soweit wunderbar funktioniert. :)
    Danke hierfür :)

    Wenn du so sprichst, hast du bestimmt schon etwas in petto gegen das Flackern? :thumbup:

    Zudem ist ein neues Problem aufgetaucht.
    Die Buttons befinden sich in einem Tab Control.
    Außerhalb existieren noch zwei weitere, welche jetzt jegliche Funktion verloren haben.

    Woran könnte das liegen?

  • Ich nehme an, du hast GuiCtrlSetOnEvent bei ein paar Buttons vergessen.
    Falls du den OnEvent-Modus verwenden möchtest, dann musst du auch die bisherigen GetMsg-Befehle rausnehmen.

    Wahrscheinlich hast du schon ein funktionierendes Script und willst nicht allzuviel ändern, deshalb probier doch mal diese UDF:
    http://www.autoitscript.com/forum/topic/55…post__p__417780
    Damit solltest du beim original Script mit wenigen Zeilen deine Wünsche umsetzen können

    schau dir am besten mal die Beispiele an, die im Ziparchiv dabei sind

    E

  • Vergessen :pinch:
    Läuft :thumbup:
    Ne, hab noch kein fertiges Skript, bin am Basteln und für alles offen. ;)
    Falls du Zeit hast ^^

    Werd mir das UDF mal anschauen, muss aber gleich dazu sagen, das ich von UDF soeben das erste Mal höre.

  • Hier ein Ansatz:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include "GUICtrlOnHover.au3"

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

    Opt("GUIOnEventMode", 1)

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

    $hGui = GUICreate("Test")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

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

    Global $aButtons[1] = [0]

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

    _CreateButton("Test 1", 10, 10, 80, 20)
    _CreateButton("Test 2", 10, 40, 80, 20)

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

    GUISetState()

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

    While Sleep(100)
    WEnd

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

    Func _CreateButton($sText, $iX, $iY, $iW, $iH)
    Local $iIndex = $aButtons[0] + 1
    ReDim $aButtons[$iIndex + 1]
    $aButtons[0] = $iIndex
    $aButtons[$iIndex] = GUICtrlCreateButton($sText, $iX, $iY, $iW, $iH)
    GUICtrlSetOnEvent($aButtons[$iIndex], "_Click")
    _GUICtrl_OnHoverRegister($aButtons[$iIndex], "_MouseOver", "_MouseLeave")
    GUICtrlCreateLabel("", $iX + $iW + 10, $iY, 20, 20)
    GUICtrlSetBkColor(-1, 0xFF0000)
    EndFunc ;==>_CreateButton

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

    Func _Click()
    Switch @GUI_CtrlId
    Case $aButtons[1]
    MsgBox(0, "", "Button 1")
    Case $aButtons[2]
    MsgBox(0, "", "Button 2")
    EndSwitch
    EndFunc ;==>_Click

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

    Func _MouseOver($iCtrlID)
    GUICtrlSetBkColor($iCtrlID + 1, 0x00FF00)
    EndFunc ;==>_MouseOver

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

    Func _MouseLeave($iCtrlID)
    GUICtrlSetBkColor($iCtrlID + 1, 0xFF0000)
    EndFunc ;==>_MouseLeave

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    UDF steht für "User defined functions" und ist eine AutoItScript-Datei, die zusätzliche Funktionen enthält.
    Alles, was am Scriptanfang so eingebunden wird:

    [autoit]

    #include "GUICtrlOnHover.au3"

    [/autoit]

    nennt sich UDF

    E

  • Hat soweit alles funktioniert.
    Mit dem Array konnte ich nur nicht viel anfangen, da Buttons und Labels schon erstellt waren, danke trotzdem. :)

    Noch ne kurze Verständnisfrage: Wenn ich die GUICtrlOnHover.au3 in den Includes Ordern von AutoIt stecke, muss ich dann immernoch mit "GUI..." arbeiten, oder kann ich <GUI...> verwenden.

    Danke :)

    Chuck