Contextmenü für dimesionierte Icons

  • Vorab: Sollte meine Überschrift nicht der Syntax entsprechen habt bitte Nachsicht mit einem Frischling :rolleyes:

    Ich habe folgendes Problem:

    Irgendwo, ganz am Anfang meines Scripts baue ich mir ein Context-Menü. Ungefähr so:

    [autoit]


    #Region Contextmenü für die Standard Icons ############################
    $IconStdContext = GUICtrlCreateContextMenu()
    $conIconStdVerschieben = GUICtrlCreateMenuItem("Verschieben", $IconStdContext)
    $conIconStdLoeschen = GUICtrlCreateMenuItem("Löschen", $IconStdContext)
    #EndRegion Contextmenü für die Standard Icons #########################

    [/autoit]

    Später werden im Laufe der Zeit Icon's erstellt. Ungefähr so:

    [autoit]

    $Icons[$GesamtIcons] = GUICtrlCreateIcon($Icon....

    [/autoit]

    Nun möchte ich das oben erzeugte Context-Menü allen Icons zuweisen. Um ehrlich zu sein, ich weiß im Moment garnicht ob mein Ansatz überhaupt richtig ist. Kann mir jemand helfen?

    Herzlichen Dank!

  • Ich glaube du kannst diesem Menü zur Laufzeit kein Control zuordnen. Du müsstest wahrscheinlich in einer Schleife für jedes Icon ein eigenes Menü erstellen. Mir fällt sonst gerade kein Weg ein...

    Gruss Shadowigor

  • Hallo Shadow,

    wäre schade wenn es nur auf diese Art ginge denn es können recht viele Icons werden. Ich warte mal ab. Vielleicht weiß jemand noch eine Lösung.

    Zwischenzeitlich ist noch eine weitere Frage aufgetaucht und ich hänge sie hier an da sie zum Thema passt.

    Wie kann ich es machen, dass ein Context-Menü nicht zu geht nachdem ich einen Punkt angeklickt habe?

  • Mann, du stellst Fragen ;) . Aber ich befürchte, dass auch das schwierig wird. Da fällt mir auch gerade keine saubere Lösung ein... Du könntest höchstens noch einmal auf das Icon Klicken mittels MouseClick um es wieder hervorzuholen. Aber vielleicht weis jemand anderes Rat.

    • Offizieller Beitrag

    Machbar ist das mit 1 ContextMenü für alle Icons schon.
    Da wird aber eine Menge Arbeit fällig, einfach mal per GUICtrlCreateContextMenu geht das aber nicht.
    Das Context würde ich mittels _GUICtrlMenu_CreatePopup erstellen und die notwendige
    Zuweisung kann per WM_CONTEXTMENU ausgewertet werden.
    Ich denke aber das ein Neuling das nicht so ohne weiteres hinbekommt.

    Es muß ja nicht nur das Context beim Klick auf das Icon angezeigt werden, sondern die Befehle des Menüs müssen
    mit dem jeweiligen Kontrol verbunden werden.

    Einträge wie verschieben oder löschen müssen ja auf das jeweilige Icon umgesetzt werden.

  • Vielleicht habt ihr recht und ich mute mir ein wenig zu viel zu aber vollkommen möchte ich noch nicht aufgeben. Inzwischen habe ich 1500 Zeilen Code der (man glaubt es kaum) funktioniert auch noch :rofl:

    Erlaubt mir noch eine Frage. Kann ich feststellen über welchem Icon ich die rechte Maustatse gedrückt habe?
    Mit der linken Maustaste mach ich es ja wie üblich mit:

    [autoit]

    For $i = 0 To $GesamtIcons - 1
    If $i_Msg = $Icons[$i] Then
    $IconNummer = $i
    IconsAuswerten()
    EndIf
    Next

    [/autoit]

    Geht so etwas auch mit der rechten Taste?

    Danke für eure Ausdauer

    • Offizieller Beitrag

    Sicher kannst du rausbekommen auf welches Control du einen Rechtsklick machst.
    Die Abfragbaren Messages sind $GUI_EVENT_SECONDARYUP oder $GUI_EVENT_SECONDARYDOWN
    und per GUIGetCursorInfo bekommst du raus auf welches Control geklickt wurde.

  • Raupi hat ja jetzt eigentlich schon alles gesagt, was es zu sagen gibt :D. Aber auch wenn es für v206 momentan noch ein wenig kompliziert ist, hab ich mal ein beispiel geschrieben.

    Beispiel
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstants.au3>
    #include <GUIMenu.au3>

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

    ; -Author: name22 (http://www.autoit.de)

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

    Global $iButtons = 10 ;Number of Buttons
    Global $aButtons[$iButtons + 1][2] = [[$iButtons]]
    Global Enum $iTestItem1 = 1000, $iTestItem2, $iTestItem3 ;Im Prinzip darfst du dir hier deine eigenen ControlIDs für die MenuItems aussuchen.
    Global $iCurContext ;Variable die den Array-Index für den Button enthält über den gerade das ContextMenu geöffnet wurde.

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

    $hWnd_GUI = GUICreate("ContextMenu Example by name22", 400, 100)
    For $i = 1 To $aButtons[0][0]
    $aButtons[$i][0] = GUICtrlCreateButton($i, 5 + ($i - 1) * 40, 40, 30, 30)
    $aButtons[$i][1] = GUICtrlGetHandle($aButtons[$i][0])
    Next
    GUISetState()

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

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
    GUIRegisterMsg($WM_CONTEXTMENU, "WM_CONTEXTMENU")

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

    $hMenu_Context = _GUICtrlMenu_CreatePopup() ;Hier wird das eigentliche menü erstellt
    _GUICtrlMenu_InsertMenuItem($hMenu_Context, 0, "Test-Item 1", $iTestItem1)
    _GUICtrlMenu_InsertMenuItem($hMenu_Context, 1, "Test-Item 2", $iTestItem2)
    _GUICtrlMenu_InsertMenuItem($hMenu_Context, 2, "Test-Item 3", $iTestItem3)

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

    While True
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $aButtons[1][0] To $aButtons[$aButtons[0][0]][0]
    MsgBox(64, "Button", "Button Clicked: " & $nMsg - $aButtons[1][0] + 1)
    EndSwitch
    WEnd

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

    Func WM_COMMAND($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $ilParam
    Switch $iwParam
    Case $iTestItem1
    ConsoleWrite("Button: " & $iCurContext & @TAB & "Context: Test-Item 1" & @CRLF)
    Case $iTestItem2
    ConsoleWrite("Button: " & $iCurContext & @TAB & "Context: Test-Item 2" & @CRLF)
    Case $iTestItem3
    ConsoleWrite("Button: " & $iCurContext & @TAB & "Context: Test-Item 3" & @CRLF)
    EndSwitch
    EndFunc ;==>WM_COMMAND

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

    Func WM_CONTEXTMENU($hWnd, $iMsg, $iwParam, $ilParam)
    #forceref $hWnd, $iMsg, $ilParam
    For $i = 1 To $aButtons[0][0]
    If $aButtons[$i][1] = $iwParam Then
    $iCurContext = $i
    _GUICtrlMenu_TrackPopupMenu($hMenu_Context, $hWnd_GUI) ;Das Contextmenü wird nur bei einem Rechtsklick auf die Buttons als Child der HauptGUI erstellt
    ExitLoop
    EndIf
    Next
    Return True
    EndFunc ;==>WM_CONTEXTMENU

    [/autoit]
    • Offizieller Beitrag

    Hier noch eine Variante im OnEventMode:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>

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

    Opt("GUIOnEventMode", 1)

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

    Global $iButtons = 10 ; Anzahl der Buttons
    Global $aIDButtons[$iButtons], $IDContext, $IDStart, $IDEnd, $iDiv

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

    $hGui = GUICreate("ContextMenu Example by Oscar", 400, 100)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_End")

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

    $IDStart = GUICtrlCreateDummy()
    For $i = 0 To $iButtons - 1
    $aIDButtons[$i] = GUICtrlCreateButton($i + 1, 5 + $i * 40, 40, 30, 30)
    GUICtrlSetOnEvent(-1, "_Button")
    $IDContext = GUICtrlCreateContextMenu($aIDButtons[$i])
    GUICtrlCreateMenuItem("Test-Item 1", $IDContext, 0)
    GUICtrlSetOnEvent(-1, "_Context1")
    GUICtrlCreateMenuItem("Test-Item 2", $IDContext, 1)
    GUICtrlSetOnEvent(-1, "_Context2")
    GUICtrlCreateMenuItem("Test-Item 3", $IDContext, 2)
    GUICtrlSetOnEvent(-1, "_Context3")
    Next
    $IDEnd = GUICtrlCreateDummy()

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

    $iDiv = ($IDEnd - $IDStart - 1) / $iButtons
    GUISetState()

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

    While Sleep(1000)
    WEnd

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

    Func _End()
    Exit
    EndFunc

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

    Func _Button()
    Local $iButton = (@GUI_CtrlId - $aIDButtons[0]) / $iDiv + 1
    MsgBox(0, "Button", "ButtonClick" & @CR & "Button = " & $iButton)
    EndFunc

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

    Func _Context1()
    Local $iButton = (@GUI_CtrlId - $aIDButtons[0] - 2) / $iDiv + 1
    MsgBox(0, "Context1", "ContextClick 1" & @CR & "Button = " & $iButton)
    EndFunc

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

    Func _Context2()
    Local $iButton = (@GUI_CtrlId - $aIDButtons[0] - 3) / $iDiv + 1
    MsgBox(0, "Context2", "ContextClick 2" & @CR & "Button = " & $iButton)
    EndFunc

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

    Func _Context3()
    Local $iButton = (@GUI_CtrlId - $aIDButtons[0] - 4) / $iDiv + 1
    MsgBox(0, "Context3", "ContextClick 3" & @CR & "Button = " & $iButton)
    EndFunc

    [/autoit]