TrayMenu mit Icons ohne ModernMenu?

  • Die Idee musste erst getestet werden ;)

    Spoiler anzeigen
    [autoit]


    #include <GuiMenu.au3>
    #include <GuiConstantsEx.au3>
    #include <WinAPI.au3>

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

    Opt('MustDeclareVars', 1)
    Opt('TrayAutoPause', 0)
    Opt('TrayMenuMode', 2)
    Global $iMemo, $hAboutIMG
    OnAutoItExitRegister("FreeResources")

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

    Func FreeResources()
    _WinAPI_DeleteObject($hAboutIMG)
    EndFunc

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

    Local $hGUI, $hEdit, $nMsg

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

    ; Erstellt eine GUI
    $hGUI = GUICreate("Menu", 400, 300)

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

    ; Erstellt ein Memo Control
    $iMemo = GUICtrlCreateEdit("Im Tray ist ein Item mit Bild", 2, 2, 396, 276, 0)
    GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
    GUISetState()

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

    Local $AboutItem = TrayCreateItem("Über")

    $hAboutIMG = _WinAPI_CreateSolidBitmap($hGUI, 0xFF0000, 16, 16)
    Local $hTraymenu = TrayItemGetHandle(0)
    _GUICtrlMenu_SetItemBmp($hTraymenu, $AboutItem, $hAboutIMG, False)

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

    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    Do
    $nMsg = GUIGetMsg()
    If TrayGetMsg() = $AboutItem Then TrayTip("TrayAbout", "Beispiel von ProgAndy", 10)
    Until $nMsg = $GUI_EVENT_CLOSE

    [/autoit]
  • Erst das Icon mit _WinAPI_ExtractIconEx extrahieren, dann eine Bitmap erstellen (_WinAPI_CreateCompatibleBitmap), dann das icon darauf zeichen und anschließend alles nicht mehr benötigte freigeben und die Bitmap setzen

    oder du verwendest

    HBMMENU_CALLBACK
    A bitmap that is drawn by the window that owns the menu. The application
    must process the WM_MEASUREITEM
    and WM_DRAWITEM
    messages.

  • Hmm da wird irgendwie kein Icon geladen ...

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.1
    Author: myName

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    #include <GuiMenu.au3>
    #include <GuiConstantsEx.au3>
    #include <WinAPI.au3>

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

    Opt('MustDeclareVars', 1)
    Opt('TrayAutoPause', 0)
    Opt('TrayMenuMode', 2)
    Global $iMemo, $hAboutIMG
    OnAutoItExitRegister("FreeResources")

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

    Func FreeResources()
    _WinAPI_DeleteObject($hAboutIMG)
    EndFunc

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

    Local $hGUI, $hEdit, $nMsg, $hicon

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

    ; Erstellt eine GUI
    $hGUI = GUICreate("Menu", 400, 300)

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

    ; Erstellt ein Memo Control
    $iMemo = GUICtrlCreateEdit("Im Tray ist ein Item mit Bild", 2, 2, 396, 276, 0)
    GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
    GUISetState()

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

    Local $AboutItem = TrayCreateItem("Über")

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

    $hicon = _WinAPI_ExtractIconEx("shell32.dll", -5, 0, 0, 0)

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

    $hicon = _WinAPI_GetDC($hicon)

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

    $hAboutIMG = _WinAPI_CreateCompatibleBitmap($hicon, 16, 16)

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

    ConsoleWrite($hAboutIMG & @CRLF)

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

    Local $hTraymenu = TrayItemGetHandle(0)
    _GUICtrlMenu_SetItemBmp($hTraymenu, $AboutItem, $hAboutIMG, False)

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

    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    Do
    $nMsg = GUIGetMsg()
    If TrayGetMsg() = $AboutItem Then TrayTip("TrayAbout", "Beispiel von ProgAndy", 10)
    Until $nMsg = $GUI_EVENT_CLOSE

    [/autoit]
  • Das ist zu wenig Code ;)

    Spoiler anzeigen
    [autoit]

    #cs ----------------------------------------------------------------------------

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

    AutoIt Version: 3.3.6.1
    Author: myName

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

    Script Function:
    Template AutoIt script.

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

    #ce ----------------------------------------------------------------------------

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

    ; Script Start - Add your code below here

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

    #include <GuiMenu.au3>
    #include <GuiConstantsEx.au3>
    #include <WinAPI.au3>

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

    Opt('MustDeclareVars', 1)
    Opt('TrayAutoPause', 0)
    Opt('TrayMenuMode', 2)
    Global $iMemo, $hAboutIMG
    OnAutoItExitRegister("FreeResources")

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

    Func FreeResources()
    _WinAPI_DeleteObject($hAboutIMG)
    EndFunc

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

    Local $hGUI, $hEdit, $nMsg, $hicon

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

    ; Erstellt eine GUI
    $hGUI = GUICreate("Menu", 400, 300)

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

    ; Erstellt ein Memo Control
    $iMemo = GUICtrlCreateEdit("Im Tray ist ein Item mit Bild", 2, 2, 396, 276, 0)
    GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
    GUISetState()

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

    Local $AboutItem = TrayCreateItem("Über")

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

    Local $hTraymenu = TrayItemGetHandle(0)
    Local $hicon = DllStructCreate("ptr")
    _WinAPI_ExtractIconEx("shell32.dll", -5, 0, DllStructGetPtr($hicon), 1)
    $hicon = DllStructGetData($hicon,1)

    Local $hDC = _WinAPI_GetDC(_WinAPI_GetDesktopWindow())

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

    $hAboutIMG = _WinAPI_CreateCompatibleBitmap($hDC, 16, 16)
    Local $hDC2 = _WinAPI_CreateCompatibleDC($hDC)
    _WinAPI_ReleaseDC(_WinAPI_GetDesktopWindow(), $hDC)
    _WinAPI_SelectObject($hDC2, $hAboutIMG)
    _WinAPI_DrawIconEx($hDC2, 0, 0, $hicon, 16, 16, 0, _WinAPI_GetSysColorBrush(4), 3) ; der Brush ist die Standardhintergrundfarbe des Menüs
    _WinAPI_DeleteDC($hDC2)
    _WinAPI_DestroyIcon($hicon)

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

    ConsoleWrite($hAboutIMG & @CRLF)

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


    _GUICtrlMenu_SetItemBmp($hTraymenu, $AboutItem, $hAboutIMG, False)

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

    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    Do
    $nMsg = GUIGetMsg()
    If TrayGetMsg() = $AboutItem Then TrayTip("TrayAbout", "Beispiel von ProgAndy", 10)
    Until $nMsg = $GUI_EVENT_CLOSE

    [/autoit]
  • Hallo progandy,


    tut mir Leid diesen Thread wieder zu beleben.


    Da ich eine konkrete Nachfrage zu Deiner UDF habe, möchte ich hier nochmal anknüpfen dürfen...


    Die UDF funktioniert wie sie soll, jedoch erhält man unter MS-Windows XP bzw. Vista/7 unterschiedliche Ergebnisse. Unter MS-Windows XP fehlt zwischen dem Icon und dem Text der "übliche" Abstand. Unter Vista/7 passiert das gleiche, wenn der Dienst "Themes" deaktiviert ist; mit akt. Dienst sieht alles wie gewünscht aus. Weiterhin sehen deaktivierte Icons unschön aus - transparente Bereiche des Icons werden ausgefüllt. Wenn man mit der Maus über die Icons geht, werden diese farblich invertiert dargestellt.


    Der Funktion tut das alles keinen Abbruch... Ich wäre jedoch sehr entzückt, wenn es dafür Abhilfe geben könnte... Hättest Du diesbezüglich eine Idee?


    VG,
    -supersonic.

  • Tut mir leid, dazu habe ich leider keine richtige Idee. Wenn du irgendwie an das Hintergrundbild des Menüs kommen kannst, ist es möglich, einen PatternBrush? zu erstellen, den du anstatt des SysColorBrush(4) verwenden kannst. Damit hast du den Hintergrund abgedeckt. Für das Invertieren weiß ich gar keine Abhilfe.

  • ProgAndy,

    danke für die Information. Da ich diesbzgl. selbst nicht so tief in der Programmierung stehe, haben ich mich für einen anderen Weg entschlossen: Anhand der Betriebssystemversion und des Dienstzustands von 'Themes' wird entschieden, wie mit den Icons im Traymenü verfahren wird. Da ich bei anderen AutoIt-Projekten ebenfalls keine bessere Lösung gesehen habe, wird eine überall zufriedenstellende Lösung wohl auch nicht ganz einfach sein...

    VG,

    -supersonic.