Png, Jpg in Menü einfügen?

  • Abend,

    einmal muss ich euch heute noch nerven, da ich gerade bei einer größeren Planung bin und mir noch diese kleine Informationen fehlt.

    Wie bekomme ich ein Png oder ein Jpg in mein Menü? Das Png und das Jpg habe ich ihm selben Ordner liegen.

    Script :

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #Include <GuiMenu.au3>
    $GUI = GUICreate("TestGUI", 615, 438, 192, 124)
    $filemenu = GUICtrlCreateMenu("Datei")
    $fileitem = GUICtrlCreateMenuItem("Speichern", $filemenu)
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit

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

    EndSwitch
    WEnd

    [/autoit]

    Könnte mir mal bitte jemand ein Beispiel geben oder es für mich einfügen? Wäre sehr dankbar.

    Gruß,

    Julien

    Einmal editiert, zuletzt von Julien (7. Januar 2012 um 10:00)

  • Geht ohne weiteres nur mit Bitmaps

    [autoit]

    _GUICtrlMenu_SetItemBitmaps

    [/autoit]

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Hi,
    mal nur zur Info....

    Zitat

    Wie bekomme ich ein Png oder ein Jpg in mein Menü?

    PNG und JPG sind DATEIFORMATE, die müssen sowieso immer in eine BITMAP bzw. HBITMAP umgewandelt werden um sie in Windows weiterzuverarbeiten.

    Zitat

    Schade, dann muss ich wohl bmp´s verwenden.

    Auch nicht :D , BMP ist wiederum ein DATEIFORMAT und hat mit BITMAP nur indirekt zu tun...

    Spoiler anzeigen
    [autoit]

    #include <GuiMenu.au3>
    #include <WinAPI.au3>
    #include <GUIConstantsEx.au3>
    #include <GDIPlus.au3>

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

    Opt('MustDeclareVars', 1)

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

    Global $iMemo
    _GDIPlus_Startup()

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

    _Main()

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

    Func _Main()
    Local $hGUI, $hFile, $hEdit, $hHelp, $hMain, $hBmp1, $hBmp2, $hbmp3
    Local Enum $idNew = 1000, $idOpen, $idSave, $idExit, $idCut, $idCopy, $idPaste, $idAbout

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

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

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

    ; Erstellt den Menüpunkt "Datei"
    $hFile = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hFile, 0, "&Neu", $idNew)
    _GUICtrlMenu_InsertMenuItem($hFile, 1, "&Öffnen", $idOpen)
    _GUICtrlMenu_InsertMenuItem($hFile, 2, "&Speichern", $idSave)
    _GUICtrlMenu_InsertMenuItem($hFile, 3, "", 0)
    _GUICtrlMenu_InsertMenuItem($hFile, 4, "B&earbeiten", $idExit)

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

    ; Erstellt den Menüpunkt "Bearbeiten"
    $hEdit = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hEdit, 0, "&Ausschneiden", $idCut)
    _GUICtrlMenu_InsertMenuItem($hEdit, 1, "K&opieren", $idCopy)
    _GUICtrlMenu_InsertMenuItem($hEdit, 2, "&Einfügen", $idPaste)

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

    ; Erstellt den Menüpunkt "Hilfe"
    $hHelp = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hHelp, 0, "&Über", $idAbout)

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

    ; Erstellt das Hauptmenü
    $hMain = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hMain, 0, "&Datei", 0, $hFile)
    _GUICtrlMenu_InsertMenuItem($hMain, 1, "&Bearbeiten", 0, $hEdit)
    _GUICtrlMenu_InsertMenuItem($hMain, 2, "&Hilfe", 0, $hHelp)

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

    ; Setzt das neue Menü
    _GUICtrlMenu_SetMenu($hGUI, $hMain)

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

    ; Erstellt ein Memo Control
    $iMemo = GUICtrlCreateEdit("", 2, 2, 396, 276, 0)
    GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
    GUISetState()

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

    ; Sezt die Datei Menü checked/unchecked Bitmaps
    $hBmp1 = _WinAPI_CreateSolidBitmap($hGUI, 0xFF0000, 11, 11)
    $hBmp2 = _WinAPI_CreateSolidBitmap($hGUI, 0x00FF00, 11, 11)

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

    ;********************************************************************************************************
    $hbmp3 = _GDIPlus_BitmapCreateFromFile("avatar_autoit16x16.jpg")
    local $hbitmap =_GDIPlus_BitmapCreateHBITMAPFromBitmap($hbmp3)
    ;********************************************************************************************************

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

    _GUICtrlMenu_SetItemBitmaps($hFile, 0, $hBmp1, $hbmp3)
    _GUICtrlMenu_SetItemBitmaps($hFile, 1, $hbitmap, $hBmp2)
    _GUICtrlMenu_SetItemBitmaps($hFile, 2, $hBmp1, $hBmp2)

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

    ; Überprüft das Öffnen Menü Item
    _GUICtrlMenu_CheckMenuItem($hFile, 1)

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

    ; Zeigt ob das Bitmap Handle übereinstimmt
    MemoWrite("Handle Status ausgewählt ......: 0x" & Hex($hBmp1))
    MemoWrite("Handle Status nicht ausgewählt ....: 0x" & Hex($hBmp2))
    MemoWrite("Handle Bild ausgewählt .: 0x" & Hex(_GUICtrlMenu_GetItemBmpChecked($hFile, 0)))
    MemoWrite("Handle Bild nicht ausgewählt: 0x" & Hex(_GUICtrlMenu_GetItemBmpUnchecked($hFile, 0)))

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

    ; Die Schleife wiederholt sich, bis der Benutzer die Beenden-Aktion der GUI auslöst
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    EndFunc ;==>_Main

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

    ; Schreibt eine Nachricht in das Memo
    Func MemoWrite($sMessage)
    GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
    EndFunc ;==>MemoWrite

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


    z.b. zu verwenden mit diesem Bildchen
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

  • Ich steige bei dem Beispielscript nicht ganz durch, da mich andere Befehle, die mit dem Bitmap nichts zu tun haben, mich immer verwirren.
    Zusätzlich möchte ich mein Bild erst nach dem Text stehen haben.
    Könnte es mir vielleicht so in meinem Script oben schreiben, dass dort ein Bitmap nach dem Text kommt?
    Gruß,

    Julien

  • Moin,

    zunächst muss ich Andy Recht geben. Pengs, Pongs, Jpegs usw. machen in Win32-Anwendungen keinen Sinn, das ist etwas für Web-Programmierung.
    EDIT: (Es sei denn man möchte eine Anwendung zur Bildbearbeitung erstellen)

    Zusätzlich möchte ich mein Bild erst nach dem Text stehen haben.


    Da bleiben dir zwei Möglichkeiten: Entweder den Menüelementen das Ownerdraw-Flag (MFT_OWNERDRAW) verpassen und diese dann selbst zeichnen. Oder die Menüelemente als Bitmap erstellen (Text und Symbol) und den Menüelementen das Bitmap-Flag (MFT_BITMAP) mitgeben.


    Gruß
    Greenhorn


    Einmal editiert, zuletzt von Greenhorn (7. Januar 2012 um 17:46)

  • Erstmal danke für eure Hilfe.

    Ich habe es nun mal mit der UDF von UEZ probiert und habe anstatt sie zu includen, sie einfach in mein Script reingebaut.

    Aber ich verstehe nicht ganz, was ein Index ist, ich habe mir auch schon einige Definitionen davon durchgelesen, aber irgendwie komme ich auf keine Lösung.

    Wieso erstellt er nun kein Bitmap bei meinem MenüItem?

    Script :

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #Include <GuiMenu.au3>
    $Form1 = GUICreate("Form1", 615, 438, 192, 124)
    $filemenu = GUICtrlCreateMenu("Datei")
    $fileitem = GUICtrlCreateMenuItem("Speichern", $filemenu)
    $file = "C:\Users\User\Desktop\Autoit 3 Miniskripte\A.bmp"
    Func _GUICtrlMenu_CreateBitmap($file,$iIndex = $fileitem, $iW = 18, $iH = 18)
    If FileExists($file) Then
    Local $iStride = 0, $iPixelFormat = $GDIP_PXF32ARGB, $pScan0 = 0
    Local $GDIp = True, $Ret, $hIcon, $hImage, $hBitmap, $hContext, $hIcon
    $Ret = DllCall("shell32", "long", "ExtractAssociatedIcon", "int", 0, "str", $file, "int*", $iIndex)
    If @error Then Return SetError(2, @extended, 0)
    $hIcon = $Ret[0]
    If Not $ghGDIPDll Then
    $GDIp = False
    _GDIPlus_Startup()
    EndIf
    $Ret = DllCall($ghGDIPDll, "int", "GdipCreateBitmapFromHICON", "ptr", $hIcon, "int*", 0)
    If @error Then Return SetError(3, @extended, 0)
    $hImage = $Ret[2]
    _WinAPI_DestroyIcon($hIcon)
    $Ret = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iW, "int", $iH, "int", $iStride, "int", $iPixelFormat, "ptr", $pScan0, "int*", 0)
    If @error Then Return SetError(4, @extended, 0)
    $hBitmap = $Ret[6]
    $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsDrawImageRect($hContext, $hImage, 0, 0, $iW, $iH)
    $hIcon = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap, 0xFF000000)
    _GDIPlus_GraphicsDispose($hContext)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_BitmapDispose($hImage)
    If Not $GDIp Then _GDIPlus_Shutdown()
    Return $hIcon
    Else
    Return SetError(1, 0, 0)
    EndIf
    EndFunc
    GUISetState(@SW_SHOW)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]
  • Probiere es mal damit:

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>
    #include <GuiMenu.au3>
    #include <WindowsConstants.au3>
    #include <GDIPlus.au3>
    #Include <GuiMenu.au3>
    $Form1 = GUICreate("Form1", 615, 438, 192, 124)
    Global Enum $idSave = 1000
    $hFile = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hFile, 0, "&Speichern", $idSave)
    $hMain = _GUICtrlMenu_CreateMenu()
    _GUICtrlMenu_InsertMenuItem($hMain, 0, "&Datei", 0, $hFile)
    _GUICtrlMenu_SetMenu($Form1, $hMain)
    GUISetState()
    Global Const $sFile = StringReplace(@AutoItExe, "autoit3.exe", "Examples\GUI\Torus.png")
    Global $hBMP_File_Save = _GUICtrlMenu_CreateBitmap($sFile, 0)
    _GUICtrlMenu_SetItemBmp($hFile, 0, $hBMP_File_Save)

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    _WinAPI_DeleteObject($hBMP_File_Save)
    Exit
    EndSwitch
    WEnd

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

    Func _GUICtrlMenu_CreateBitmap($file, $iIndex = 0, $iW = 18, $iH = 18)
    If FileExists($file) Then
    Local $iStride = 0, $iPixelFormat = $GDIP_PXF32ARGB, $pScan0 = 0
    Local $GDIp = True, $Ret, $hIcon, $hImage, $hBitmap, $hContext, $hIcon
    If Not $ghGDIPDll Then
    $GDIp = False
    _GDIPlus_Startup()
    EndIf
    Local $fext = StringMid($file, StringLen($file) - 3)
    Switch $fext
    Case ".dll"
    $Ret = DllCall("shell32", "long", "ExtractAssociatedIcon", "int", 0, "str", $file, "int*", $iIndex)
    If @error Then Return SetError(2, @extended, 0)
    $hIcon = $Ret[0]
    $Ret = DllCall($ghGDIPDll, "int", "GdipCreateBitmapFromHICON", "ptr", $hIcon, "int*", 0)
    If @error Then Return SetError(3, @extended, 0)
    $hImage = $Ret[2]
    _WinAPI_DestroyIcon($hIcon)
    Case ".jpg", ".png", ".bmp", ".gif"
    $hImage = _GDIPlus_ImageLoadFromFile($file)
    If @error Then Return SetError(4, @extended, 0)
    EndSwitch

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

    $Ret = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iW, "int", $iH, "int", $iStride, "int", $iPixelFormat, "ptr", $pScan0, "int*", 0)
    If @error Then Return SetError(5, @extended, 0)
    $hBitmap = $Ret[6]
    $hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    _GDIPlus_GraphicsDrawImageRect($hContext, $hImage, 0, 0, $iW, $iH)
    $hIcon = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
    _GDIPlus_GraphicsDispose($hContext)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_BitmapDispose($hImage)
    If Not $GDIp Then _GDIPlus_Shutdown()
    Return $hIcon
    Else
    Return SetError(1, 0, 0)
    EndIf
    EndFunc ;==>_GUICtrlMenu_CreateBitmap

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

    Func _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
    Local $tBIHDR, $Ret, $tData, $pBits, $hResult = 0
    $Ret = DllCall($ghGDIPDll, 'uint', 'GdipGetImageDimension', 'ptr', $hBitmap, 'float*', 0, 'float*', 0)
    If (@error) Or ($Ret[0]) Then Return 0
    $tData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $Ret[2], $Ret[3], $GDIP_ILMREAD, $GDIP_PXF32ARGB)
    $pBits = DllStructGetData($tData, 'Scan0')
    If Not $pBits Then Return 0
    $tBIHDR = DllStructCreate('dword;long;long;ushort;ushort;dword;dword;long;long;dword;dword')
    DllStructSetData($tBIHDR, 1, DllStructGetSize($tBIHDR))
    DllStructSetData($tBIHDR, 2, $Ret[2])
    DllStructSetData($tBIHDR, 3, $Ret[3])
    DllStructSetData($tBIHDR, 4, 1)
    DllStructSetData($tBIHDR, 5, 32)
    DllStructSetData($tBIHDR, 6, 0)
    $hResult = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBIHDR), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'dword', 0)
    If (Not @error) And ($hResult[0]) Then
    DllCall('gdi32.dll', 'dword', 'SetBitmapBits', 'ptr', $hResult[0], 'dword', $Ret[2] * $Ret[3] * 4, 'ptr', DllStructGetData($tData, 'Scan0'))
    $hResult = $hResult[0]
    Else
    $hResult = 0
    EndIf
    _GDIPlus_BitmapUnlockBits($hBitmap, $tData)
    Return $hResult
    EndFunc ;==>_GDIPlus_BitmapCreateDIBFromBitmap

    [/autoit]

    Ich werde bei Gelegenheit die UDF anpassen, damit sie auch Bilderdateien laden kann.

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Danke für die schnelle Antwort.

    Ich möchte aber mein .bmp hinter meinem Text stehen haben und nicht davor.

    Hast du dafür vielt auch noch eine Lösung?