Hier meine Version, um "Icons" (eigentlich Bitmaps) in GUI Menüs darzustellen.
UDF:
Spoiler anzeigen
C
;~ #AutoIt3Wrapper_AU3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#include-once
#include <GDIPlus.au3>
#include <WinAPIShellEx.au3>
#include <WinAPISysWin.au3>
#include <WindowsConstants.au3>
_GDIPlus_Startup()
OnAutoItExitRegister("_Exit_GUICtrlMenu_CreateBitmap")
; #FUNCTION# ============================================================================================================
; Name...................: _GUICtrlMenu_CreateBitmap
; Description .......: Extracts the icon from $sFile and converts it to a HBitmap format
; Syntax................: _GUICtrlMenu_CreateBitmap($sFile, $iIndex = 0, $iX = 16, $iY = 16)
; Parameters ......: $sFile - file name where the icon should be extracted from or an image should be loaded (*.dll, *.ico, *.exe, *.jpg, *.png, *.bmp, *.gif, *.tif)
; $iIndex - index of the icon from $sFile
; $iW - set the width of the extracted icon
; $iH - set the height of the extracted icon
; $iBgColor - set background color from _WinAPI_GetSysColor($COLOR_MENU) if $iBgColor = -1
; Return values .: Success - handle to a HBITMAP
; Failure - Returns 0 and sets error to 1-7
; Author ..............: UEZ
; Version .............: v0.71 Build 2018-08-17 beta
; Remarks ...........: Don't forget to use _WinAPI_DeleteObject($<handle to the HBITMAP>) when closing to to release the resources
; =======================================================================================================================
Func _GUICtrlMenu_CreateBitmap($sFile, $iIndex = 0, $iW = 16, $iH = 16, $iBgColor = -1)
Local $hIcon, $Ret, $hBitmap, $hContext, $bBinary = False
Local $aChk = _GDIPlus_ImageGetFlags($sFile)
If Not @error Then $bBinary = True
If FileExists($sFile) Or $bBinary Then
Local $sExt = StringMid($sFile, StringLen($sFile) - 3)
If $bBinary Then $sExt = "0815"
Switch $sExt
Case ".dll", ".exe", ".ico"
Return _WinAPI_GetFileIcon($sFile, $iIndex, $iW, $iH, $iBgColor)
Case ".jpg", ".png", ".bmp", ".gif", ".tif", "0815"
Local $hImage
If Not $bBinary Then
$hImage = _GDIPlus_ImageLoadFromFile($sFile)
If @error Then Return SetError(4, @extended, 0)
Else
$hImage = $sFile
EndIf
$hBitmap = _GDIPlus_BitmapCreateFromScan0($iW, $iH)
If @error Then Return SetError(5, @extended, 0)
$hContext = _GDIPlus_ImageGetGraphicsContext($hBitmap)
_GDIPlus_GraphicsSetInterpolationMode($hContext, $GDIP_INTERPOLATIONMODE_HIGHQUALITY)
_GDIPlus_GraphicsDrawImageRect($hContext, $hImage, 0, 0, $iW, $iH)
$hIcon = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
_GDIPlus_GraphicsDispose($hContext)
_GDIPlus_BitmapDispose($hBitmap)
_GDIPlus_BitmapDispose($hImage)
If Not $hIcon Then Return SetError(6, 0, 0)
Case Else
Return SetError(7, 0, 0)
EndSwitch
Return $hIcon
Else
Return SetError(1, 0, 0)
EndIf
EndFunc ;==>_GUICtrlMenu_CreateBitmap
Func _WinAPI_GetFileIcon($sFile, $iIndex, $iW, $iH, $iColor)
Local $aRet, $hIcon, $hHBitmap
Local $hDC, $hBackDC, $hBackSv
$hIcon = _WinAPI_ShellExtractIcon($sFile, $iIndex, $iW, $iH)
If @error Then Return SetError(6, @extended, 0)
$hDC = _WinAPI_GetDC(0)
$hBackDC = _WinAPI_CreateCompatibleDC($hDC)
If $iColor = -1 Then $iColor = _WinAPI_GetSysColor($COLOR_MENU)
$hHBitmap = _WinAPI_CreateSolidBitmap(0, $iColor, $iW, $iH)
$hBackSv = _WinAPI_SelectObject($hBackDC, $hHBitmap)
_WinAPI_DrawIconEx($hBackDC, 0, 0, $hIcon, $iW, $iH)
_WinAPI_DestroyIcon($hIcon)
_WinAPI_SelectObject($hBackDC, $hBackSv)
_WinAPI_ReleaseDC(0, $hDC)
_WinAPI_DeleteDC($hBackDC)
Return $hHBitmap
EndFunc ;==>_GUICtrlMenu_CreateBitmap
Func _Exit_GUICtrlMenu_CreateBitmap()
_GDIPlus_Shutdown()
EndFunc
Alles anzeigen
Beispiel1:
Spoiler anzeigen
C
#include <GDIPlus.au3>
#include <GuiMenu.au3>
#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <_GUICtrlMenu_CreateBitmap.au3>
Opt('MustDeclareVars', 1)
Global $iMemo
_Main()
Func _Main()
Local $hGUI, $hFile, $hEdit, $hHelp, $hMain
Local Enum $idNew = 1000, $idOpen, $idSave, $idExit, $idCut, $idCopy, $idPaste, $idAbout
#region
; Create GUI
$hGUI = GUICreate("Menu", 400, 300)
; Create File menu
$hFile = _GUICtrlMenu_CreateMenu()
_GUICtrlMenu_InsertMenuItem($hFile, 0, "&New", $idNew)
_GUICtrlMenu_InsertMenuItem($hFile, 1, "&Open", $idOpen)
_GUICtrlMenu_InsertMenuItem($hFile, 2, "&Save", $idSave)
_GUICtrlMenu_InsertMenuItem($hFile, 3, "", 0)
_GUICtrlMenu_InsertMenuItem($hFile, 4, "E&xit", $idExit)
; Create Edit menu
$hEdit = _GUICtrlMenu_CreateMenu()
_GUICtrlMenu_InsertMenuItem($hEdit, 0, "&Cut", $idCut)
_GUICtrlMenu_InsertMenuItem($hEdit, 1, "C&opy", $idCopy)
_GUICtrlMenu_InsertMenuItem($hEdit, 2, "&Paste", $idPaste)
; Create Help menu
$hHelp = _GUICtrlMenu_CreateMenu()
_GUICtrlMenu_InsertMenuItem($hHelp, 0, "&About", $idAbout)
; Create Main menu
$hMain = _GUICtrlMenu_CreateMenu()
_GUICtrlMenu_InsertMenuItem($hMain, 0, "&File", 0, $hFile)
_GUICtrlMenu_InsertMenuItem($hMain, 1, "&Edit", 0, $hEdit)
_GUICtrlMenu_InsertMenuItem($hMain, 2, "&Help", 0, $hHelp)
; Set window menu
_GUICtrlMenu_SetMenu($hGUI, $hMain)
; Create memo control
$iMemo = GUICtrlCreateEdit("", 2, 2, 396, 276, 0)
GUICtrlSetFont($iMemo, 9, 400, 0, "Courier New")
GUISetState()
#endregion
Local $hBMP_File_New = _GUICtrlMenu_CreateBitmap(StringReplace(@AutoItExe, "autoit3.exe", "Examples\GUI\Torus.png"), 0, 32, 32)
; Set New menu item to have a bitmap
_GUICtrlMenu_SetItemBmp($hFile, 0, $hBMP_File_New)
MemoWrite("Item bitmap handle: 0x" & Hex(_GUICtrlMenu_GetItemBmp($hFile, 0)))
Local $hBMP_File_Open = _GUICtrlMenu_CreateBitmap(@SystemDir & "\Shell32.dll", 4, 32, 32)
; Set New menu item to have a bitmap
_GUICtrlMenu_SetItemBmp($hFile, 1, $hBMP_File_Open)
MemoWrite("Item bitmap handle: 0x" & Hex(_GUICtrlMenu_GetItemBmp($hFile, 1)))
Local $hBMP_File_Save = _GUICtrlMenu_CreateBitmap(@SystemDir & "\Shell32.dll", 6, 32, 32)
; Set New menu item to have a bitmap
_GUICtrlMenu_SetItemBmp($hFile, 2, $hBMP_File_Save)
MemoWrite("Item bitmap handle: 0x" & Hex(_GUICtrlMenu_GetItemBmp($hFile, 2)))
Local $hBMP_File_Quit = _GUICtrlMenu_CreateBitmap(@SystemDir & "\Shell32.dll", 27, 32, 32)
; Set New menu item to have a bitmap
_GUICtrlMenu_SetItemBmp($hFile, 4, $hBMP_File_Quit)
MemoWrite("Item bitmap handle: 0x" & Hex(_GUICtrlMenu_GetItemBmp($hFile, 4)))
; Loop until user exits
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
_WinAPI_DeleteObject($hBMP_File_New)
_WinAPI_DeleteObject($hBMP_File_Open)
_WinAPI_DeleteObject($hBMP_File_Save)
_WinAPI_DeleteObject($hBMP_File_Quit)
EndFunc ;==>_Main
; Write message to memo
Func MemoWrite($sMessage)
GUICtrlSetData($iMemo, $sMessage & @CRLF, 1)
EndFunc ;==>MemoWrite
Alles anzeigen
Gruß,
UEZ