Problem gelöst!
Gesucht war:
_GDIPlus_ImageDispose($hGUIHeaderIcon)
[/autoit]Genauer Lösungsweg in Post #5.
Danke an Make-Grafik
Thread auf gelöst gesetzt.
###############################################################################################
Guten Tag allerseits.
Ich hätte da mal ein kleines Problem, wo ich nicht weiter weiß.
Und zwar:
Problem:
Ich habe ein eigenes kleines GUI.
In diesem GUI sind 4 Grafiken eingebunden.
3x .png
1x .ico
Die 3 Grafiken löscht er.
Das Icon will er nicht löschen.
Die 4 Grafiken werden mit FileInstall in den @TempDir geschrieben.
Als Beispiel:
FileInstall("img/Icon16px.ico", @TempDir & "/PMGEICO.ico", 1)
[/autoit]Denn am Ende des Scriptes wird eine Funktion aufgerufen um die Grafiken zu löschen und das Script zu Beenden.
[autoit]
Func _PMClose() ; Beim Aufruf wird das Programm beendet
_WinAPI_DeleteObject($hGUIStartButtonBmpNew)
_WinAPI_DeleteObject($hGUITesttypButtonBmpNew)
_WinAPI_DeleteObject($hGUIZielendpunktButtonBmp)
GUIDelete($hGUIDisplay) ; Lösche das GUI
_ProgressDelete($hGUIProgressBar) ; MUST BE DONE ON EXIT
_Progress_CallBack_Free(1) ; Force Killing Timer
_GDIPlus_Shutdown()
$temp = 1
While FileExists(@TempDir & "\PMNETCOR*.png") = True And $temp < 10
$temp += $temp
;~ FileDelete(@TempDir & "\PMGEICO.png") ; Funktioniert zurzeit nicht
FileDelete(@TempDir & "\PMNstart.png")
FileDelete(@TempDir & "\PMNtesttyp.png")
FileDelete(@TempDir & "\PMNzielendpunkt.png")
FileDelete(@TempDir & "\PMGEICO.ico") ; Funktioniert zurzeit nicht
WEnd
Exit
EndFunc ;==>_PMClose
Die 4 Grafiken werden nur angezeigt.
Die 3 .png als Button und das Icon als Icon.
$hGUIDisplay = GUICreate($sGUITitle, $iGUIWidth, $iGUIHeight, -1, -1, $WS_POPUP)
[...]
[/autoit][autoit][/autoit][autoit]GUICtrlCreateLabel("", $iGUIBorderWidth, $iGUIBorderWidth, 17, 17, 0, 0x100000)
$hGUIHeaderIcon = _GDIPlus_ImageLoadFromFile(@TempDir & "/PMGEICO.ico")
$hGUIHeaderIconNew = _GDIPlus_GraphicsCreateFromHWND($hGUIDisplay)
GUIRegisterMsg($WM_PAINT, "MY_WM_PAINT")
[...]
[/autoit][autoit][/autoit][autoit]Func MY_WM_PAINT($hWnd, $msg, $wParam, $lParam) ; Draw PNG image
_WinAPI_RedrawWindow($hGUIDisplay, 0, 0, $RDW_UPDATENOW)
_GDIPlus_GraphicsDrawImage($hGUIHeaderIconNew, $hGUIHeaderIcon, 3, 3)
_WinAPI_RedrawWindow($hGUIDisplay, 0, 0, $RDW_VALIDATE)
Return $GUI_RUNDEFMSG
EndFunc ;==>MY_WM_PAINT
Folgender Code ist für die 3 Buttuns.
[autoit]
; Start Button
$hGUIStartButton = GUICtrlCreateButton("Start", 10, 96, 32, 32, $BS_BITMAP)
$hGUIStartButtonBmp = _GDIPlus_BitmapCreateFromFile(@TempDir & "/PMNstart.png")
If @OSBuild < 6000 Then
$hGUIStartButtonBmpNew = ConvertBitmap($hGUIStartButtonBmp)
Else
$hGUIStartButtonBmpNew = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hGUIStartButtonBmp)
EndIf
_GDIPlus_BitmapDispose($hGUIStartButtonBmp)
_WinAPI_DeleteObject(GUICtrlSendMsg($hGUIStartButton, $BM_SETIMAGE, $IMAGE_BITMAP, $hGUIStartButtonBmpNew))
[...]
[/autoit][autoit][/autoit][autoit]Func ConvertBitmap($hBitmap) ; Workaround für WinXP
Local $iButtonColor = _WinAPI_GetSysColor($COLOR_BTNFACE)
$iButtonColor = 0x10000 * BitAND($iButtonColor, 0xFF) + BitShift($iButtonColor, 16) + BitAND($iButtonColor, 0x00FF00)
Local $iWidth = _GDIPlus_ImageGetWidth($hBitmap), $iHeight = _GDIPlus_ImageGetHeight($hBitmap)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iWidth, "int", $iHeight, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
Local $hBitmap_New = $aResult[6]
Local $hCtx_new = _GDIPlus_ImageGetGraphicsContext($hBitmap_New)
Local $hBrush = _GDIPlus_BrushCreateSolid(0xFF000000 + $iButtonColor)
_GDIPlus_GraphicsFillRect($hCtx_new, 0, 0, $iWidth, $iHeight, $hBrush)
_GDIPlus_GraphicsDrawImageRect($hCtx_new, $hBitmap, 0, 0, $iWidth, $iHeight)
Local $hHBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap_New)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_BitmapDispose($hBitmap_New)
_GDIPlus_GraphicsDispose($hCtx_new)
Return $hHBitmap
EndFunc ;==>ConvertBitmap
Gescheiterte Lösungsversuche:
- Anderes Dateiformat
- Paar andere Sachen, welche ich gerade nicht mehr im Kopf hab...
- Sicherstellen, dass icon eine Datei ist:
ConsolWrite(FileGetAttrib(@TempDir & "\PMGEICO.ico") & @CRLF)
-> A
Mal gucken, vielleicht kann mir einer von euch sagen, wo ich einen Fehler eingebaut habe.
Mit freundlichen Grüßen