Bei Mausklick in GUI soll _Func() ausgeführt wrden.

  • Hi,

    ich habe eine GUI geschrieben, in der mehrere Rechtecke sind. Wenn man eins dieser Rechtecke anklickt, soll der Farbwahldialog geöffnet werden.
    Mein Problem liegt jetzt darin, das ich nicht weiss wie ich feststelle das die linke Maustaste gedrückt wurde. Wichtig ist, das das ganze nur ausgeführt wird wenn meine GUI bzw. mein Programm aktiv ist.

    Hier mal mein Ansatz:

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $nMsg = $GUI_EVENT_PRIMARYDOWN
    $ctrlMsg = GUIGetCursorInfo()
    ToolTip($ctrlMsg[0] & "," & $ctrlMsg[1])

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

    Case $GUI_EVENT_CLOSE
    _GDI_close()
    Exit

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

    Case -3
    _GDI_close()
    Exit
    EndSwitch
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, $x0, $y0); Backbuffer in den Frontbuffer übertragen
    WEnd

    [/autoit]


    sry für die schlechte Formatierung irgendwie krieg ich das gerade nicht besser hin.

    Danke
    Gruß Daniel

    Einmal editiert, zuletzt von danielsan85 (11. Februar 2011 um 15:36)

  • [autoit]

    ;;;;;;Kann mir jemand nochmal sagen, wie ich spoiler mache???
    Select
    Case _IsPressed("01")
    $Info = guigetcursorinfo("Deine GUI")
    ;; Dann position auf dein zeug hin prüfen...
    Endselect

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

    ;; Ps ich weis, das ist SEHR unnötig geschrieben, aber ich mach das einfach immer so(machtdergewohnheit)

    [/autoit]
    • Offizieller Beitrag

    @danielsan85,der Code kann nicht funktionieren.

    Zeile 4 ist falsch. Diese würde bei Select funktionieren , nicht bei Switch ;)

    [autoit]

    Case $nMsg = $GUI_EVENT_PRIMARYDOWN

    [/autoit]


    Diese Abfrage ist gleichzusetzen wie

    [autoit]

    Case 0

    [/autoit]


    Und erstpricht den Wert von $nMsg, wenn kein Event vorhanden ist :!:
    So funzt es:

    Spoiler anzeigen
    [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_PRIMARYDOWN
    $ctrlMsg = GUIGetCursorInfo()
    ToolTip($ctrlMsg[0] & "," & $ctrlMsg[1])

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

    Case $GUI_EVENT_CLOSE
    _GDI_close()
    Exit

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

    Case -3
    _GDI_close()
    Exit
    EndSwitch
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, $x0, $y0); Backbuffer in den Frontbuffer übertragen
    WEnd

    [/autoit]

    Edit: $GUI_EVENT_CLOSE und -3 ist das selbe :D

    Das würde reichen:

    [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_PRIMARYDOWN
    $ctrlMsg = GUIGetCursorInfo()
    ToolTip($ctrlMsg[0] & "," & $ctrlMsg[1])
    Case $GUI_EVENT_CLOSE
    _GDI_close()
    Exit
    EndSwitch
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap, $x0, $y0); Backbuffer in den Frontbuffer übertragen
    WEnd

    [/autoit]

    Edit x: Sorry für die vielen Edits, mein Browser spinnt :P

  • Hi,
    ich hatte mal vor einiger Zeit das hier gemacht.
    Ab Zeile 62 ist die Quadrat-Klickprüfung ^^

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include <GDIPlus.au3>
    #include <Misc.au3>
    #include <WindowsConstants.au3>
    HotKeySet("{Esc}", "_Exit")

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

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

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

    $hGUI_DC = _WinAPI_GetDC($hGUI)

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

    $hBitmap = _WinAPI_CreateCompatibleBitmap($hGUI_DC, 500, 500)
    $hBitmapDC = _WinAPI_CreateCompatibleDC($hGUI_DC)

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

    _WinAPI_SelectObject($hBitmapDC, $hBitmap)

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

    GUISetState()

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

    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHDC($hBitmapDC)
    $hBrush_Schwarz = _GDIPlus_BrushCreateSolid()
    $hBrush_Weiss = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    $hPen_Schwarz = _GDIPlus_PenCreate()

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

    Dim $aPositionen[4][5] = [[0, 0, 50, 50, 1], _
    [200, 0, 50, 50, 1], _
    [0, 200, 50, 50, 1], _
    [200, 200, 50, 50, 1]]

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

    Global $iFPS, $hTimer = TimerInit(), $MaxFPS = 100, $iSleep = 10, $FPSWert, $hDll = DllOpen("user32.dll")

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

    While Sleep($iSleep)
    _GDIPlus_GraphicsFillRect($hGraphics, 0, 0, 500, 500, $hBrush_Weiss)

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

    ;Zeichnen
    For $x = 0 To UBound($aPositionen) - 1
    Switch $aPositionen[$x][4]
    Case 1
    _GDIPlus_GraphicsFillRect($hGraphics, $aPositionen[$x][0], $aPositionen[$x][1], $aPositionen[$x][2], $aPositionen[$x][3], $hBrush_Schwarz)
    Case 0
    _GDIPlus_GraphicsDrawRect($hGraphics, $aPositionen[$x][0], $aPositionen[$x][1], $aPositionen[$x][2], $aPositionen[$x][3], $hPen_Schwarz)
    EndSwitch
    Next
    _WinAPI_BitBlt($hGUI_DC, 0, 0, 500, 500, $hBitmapDC, 0, 0, $SRCCOPY)

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

    $iFPS += 1
    ;FPS Control
    $FPSWert = Int($iFPS / (TimerDiff($hTimer) / 1000))
    WinSetTitle($hGUI, "", "FPS:" & $FPSWert)
    If $FPSWert > $MaxFPS Then
    $iSleep += 5
    EndIf
    If $FPSWert < $MaxFPS Then
    $iSleep -= 5
    If $iSleep < 0 Then $iSleep = 0
    EndIf

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

    If Not _IsPressed("01", $hDll) Then ContinueLoop ;Wenn die Linke Maustaste nicht gedrückt wurde
    While _IsPressed("01", $hDll);Warten bis Maustaste losgelassen wird (sonst flackern die Quadrate)
    Sleep(10)
    WEnd
    $aCoords = GUIGetCursorInfo() ; Maus Koordinaten relativ zur GUI hohlen
    If @error Then ContinueLoop

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

    For $x = 0 To UBound($aPositionen) - 1 ;Prüfen ob Coordinaten sich in einem Dreieck befinden
    If _RectCollision($aCoords[0], $aCoords[1], 0, 0, $aPositionen[$x][0], $aPositionen[$x][1], $aPositionen[$x][2], $aPositionen[$x][3]) Then $aPositionen[$x][4] = Not $aPositionen[$x][4]
    Next

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

    WEnd

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

    Func _Exit()
    _GDIPlus_PenDispose($hPen_Schwarz)
    _GDIPlus_BrushDispose($hBrush_Schwarz)
    _GDIPlus_BrushDispose($hBrush_Weiss)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    _WinAPI_ReleaseDC($hGUI, $hGUI_DC)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hBitmapDC)
    DllClose($hDll)
    Exit
    EndFunc ;==>_Exit

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

    Func _RectCollision($iX1, $iY1, $iWidth1, $iHeight1, $iX2, $iY2, $iWidth2, $iHeight2)
    ;Author: Faweyr
    Return $iX1 + $iWidth1 > $iX2 And $iX1 < $iX2 + $iWidth2 And $iY1 + $iHeight1 > $iY2 And $iY1 < $iY2 + $iHeight2
    EndFunc ;==>_RectCollision

    [/autoit]
  • Hi,

    danke für die Antworten.

    autoBert: Würde das mein Problem lösen? Ich sehe da den zusammenhang nicht. Denn meine Rechtecke einzeln ansprechen und ändern kann ich schon.

    Edit: Jetzt klappt es!!! (So wie Raupi das vorgeschlagen hat)
    Hatte irgendwie noch etwas Codemüll!

    Danke
    Gruß Daniel

    • Offizieller Beitrag
    Zitat

    Raupi : leider das gleiche wie bei floschlo.

    Es wird nur ein Event ausgelöst , wenn im Arbeitsbereich der Gui geklickt wird.
    Hast du meine Edits mal getestet?

    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    GUICreate("test", 300, 200)
    GUISetState()
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_PRIMARYDOWN
    $ctrlMsg = GUIGetCursorInfo()
    ToolTip($ctrlMsg[0] & "," & $ctrlMsg[1])

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

    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]
    Zitat

    Edit: Jetzt klappt es!!! (So wie Raupi das vorgeschlagen hat)
    Hatte irgendwie noch etwas Codemüll!

    Hätte mich auch gewundert wenn mein Code auf jeden klick reagieren würde. :D

  • Mach ich mal!
    Selbst wenn es mir jetzt nicht helfen sollte, irgendwann brauch ich das evtl.!

    Edit: Ok habs angeguckt. Auf den ersten Blick sieht das extrem hilfreich aus! Dann muss ich mir nicht kompliziert die Koordinaten zusammensuchen.

    Danke nochmal an alle!

    Gruß Daniel

  • Ich weis, höhrt sich jetzt dumm an, aber WIE ZUM TEUFEL MACHE ICH SPOILER !!!???

    Glaub ich bin zu doo.... klug für diese welt ^^


    Florian

    • Offizieller Beitrag

    Wenn du eine Post erstellst dann ist in der Editorleiste ein Button mi SP drauf. Das ist der Spoiler.
    Alles was zwischen [ spoiler] und [ /spoiler] steht ist dann im Spoiler enthalten.

  • Übrigens ist die Methode GuiSetOnEvent($GUI_EVENT_PRIMARYDOWN, "_DrawQuad") zu verwenden in verbindung mit
    Opt("GuiOnEventMode", 1) CPU effizienter ;) Dann brauch das nicht in die While-Schleife.
    Aber euer weg geht auch gut (nur eben mit mehr CPU aufwand)

    Meine Werke


    EasyScreen (teilweise Crocoframe): <EasyScreen>
    Spotify2Title: <Spotify2Title> (zur Info, dies ist KEIN Spotify-Downloader! Wer das dachte... :rofl: sowas gibts hier nicht :thumbdown: )