Hallo zusammen!
Ich möchte ein Bild auf eine Gui zeichnen. Da auch PNG's zur Verwendung kommen, muss ich einen "Umweg" nehmen, um trotzdem GUICtrlCreatePic verwenden zu können.
Der Vorteil ist, dass man sich dann nicht mehr um re-paint Aktionen kümmern muss, wenn sich Teile der Gui außerhalb des Desktops befinden.
Des weiteren sieht das mit Hilfe des StretchBltMode "Halftone" skalierte Bild deutlich besser aus. (Info: _WinAPI_AdjustBitmap verwendet _WinAPI_SetStretchBltMode, um den Modus zu setzen)
Leider tritt ein (für mich) nicht nachvollziebarer Effekt auf: Das im Modus Halftone skalierte Bild wird NICHT neu gezeichnet, wenn sich ein Teil der Gui außerhalb des Desktops befindet.
Im Gegensatz dazu funktioniert ohne Verwendung des Modus alles wie es sollte.
Hier ein kleines Testskript:
Spoiler anzeigen
#include <GUIConstants.au3>
#include <WinAPIGdi.au3>
#include <GdiPlus.au3>
Global $hGui = GUICreate("Beweg mich außerhalb des Desktops und zurück!", 1280, 720)
Global $idPic = GUICtrlCreatePic("", 0, 0, 1280, 720)
If Not InetGet("https://interfacelift.com/wallpaper/7yz4ma1/04106_wwww_1920x1080.jpg", @TempDir & "/04106_wwww_1920x1080.jpg") Then Exit
GUISetState()
;Bildteile außerhalb des Desktops werden gelöscht, wenn $HALFTONE bei der Skalierung verwendet wird
_SetPic($HALFTONE)
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
;Bild bleibt komplett erhalten, wenn das Fenster außerhalb des Desktops bewegt wird
_SetPic()
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
Func _SetPic($iHalftone = Default)
_GDIPlus_StartUp()
Local $hImage = _GDIPlus_ImageLoadFromFile(@TempDir & "/04106_wwww_1920x1080.jpg")
Local $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
Local $hResize = _WinAPI_AdjustBitmap($hBmp, 1280, 720, $iHalftone)
;~ _SendMessage(GUICtrlGetHandle($idPic), 0x0172, 0, $hResize)
GUICtrlSendMsg($idPic, 0x0172, 0, $hResize)
_WinAPI_DeleteObject($hResize)
_WinAPI_DeleteObject($hBmp)
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
EndFunc
Alles anzeigen
Wenn jemand eine vollkommen andere Variante für mein Vorhaben hat, würde ich auch die nehmen, allerdings nichts mit "WM_ERASEBKGND" bzw "WM_PAINT".
Mein Ziel ist ja, genau das zu umgehen, weil ich denke das meine Methode performanter ist.
Beste Grüße, Friesel!