Gui Hintergrundbild skalierbar

  • Guten Abend,
    für ein Projekt mit einem Kumpel müssen wir das Hintergrundbild an das GUI anpassen.
    Also das Bild soll ein png mit transparenten Elementen sein, ca. 100x100 pixel groß und sich automatisch an das GUI anpassen.
    Das mit dem png und den transparenten Elementen haben wir bereits mit hilfe des englischen Forums geschafft.
    Das letzte Problem ist das mit der anpassung an das GUI wenn dieses vergrößert oder verkleinert wird.
    Ich hoffe jemand stand schonmal vor einem ähnlichen Problem und kann uns helfen.

    Vielen Dank im Vorraus.
    Mfg Devils

    • Offizieller Beitrag

    Eventuell könnte das für dich nützlich sein http://www.autoitscript.com/forum/index.php?showtopic=83661.

  • Raupi Danke Danke Danke du hasst uns sehr geholfen

    so unser nächstes Problem liegt am Ergebniss des skalierens vom Bild. Da passiert etwas, was sehr unschön aussieht
    (Bild "Fehler.jpg" im Anhang)
    Woran könnte das liegen??

    Hier mal der Code aus dem Link von Raupi

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>; this is where the magic happens, people
    #include <WindowsConstants.au3>
    #include <GuiConstantsEx.au3>

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

    Opt("MustDeclareVars", 0)

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

    Global Const $AC_SRC_ALPHA = 1
    ;~ Global Const $ULW_ALPHA = 2

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

    ; Load PNG file as GDI bitmap
    _GDIPlus_Startup()
    $pngSrc = @ScriptDir & "\back.png"
    $hImage = _GDIPlus_ImageLoadFromFile($pngSrc)

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

    ; Extract image width and height from PNG
    $width = _GDIPlus_ImageGetHeight($hImage)
    $height = _GDIPlus_ImageGetHeight($hImage)

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

    If $width < 500 Then
    _ImageResize(@ScriptDir & "\back.png",@ScriptDir & "\resize_back.png",52, 600)
    $hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\resize_back.png")
    $width = _GDIPlus_ImageGetHeight($hImage)
    $height = _GDIPlus_ImageGetHeight($hImage)
    EndIf

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

    ; Create layered window
    $GUI = GUICreate("Test GUI", $width, $height, -1, -1, $WS_POPUP, $WS_EX_LAYERED)
    ;~ SetBitmap($GUI, $hImage, 255)
    ; Register notification messages
    GUIRegisterMsg($WM_NCHITTEST, "WM_NCHITTEST")
    GUISetState()
    WinSetOnTop($GUI, "", 1)

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

    For $i = 0 To 255 Step 10
    Sleep(30)
    SetBitmap($GUI, $hImage, $i)
    Next
    ; create child MDI gui window to hold controls
    ; this part could use some work - there is some flicker sometimes...
    $controlGui = GUICreate("ControlGUI", $width, $height, 0, 0, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_MDICHILD), $GUI)

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

    ; child window transparency is required to accomplish the full effect, so $WS_EX_LAYERED above, and
    ; I think the way this works is the transparent window color is based on the image you set here:
    GUICtrlCreatePic(@ScriptDir & "\grey.gif", 0, 0, $width, $height)
    GUICtrlSetState(-1, $GUI_DISABLE)

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

    GUISetState()

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $msg = $GUI_EVENT_CLOSE
    ExitLoop
    EndSelect
    WEnd

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

    GUIDelete($controlGui)

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

    ; Release resources
    _WinAPI_DeleteObject($hImage)
    _GDIPlus_Shutdown()

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

    ; ====================================================================================================

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

    ; Handle the WM_NCHITTEST for the layered window so it can be dragged by clicking anywhere on the image.
    ; ====================================================================================================

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

    Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
    If ($hWnd = $GUI) And ($iMsg = $WM_NCHITTEST) Then Return $HTCAPTION
    EndFunc;==>WM_NCHITTEST

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

    ; ====================================================================================================

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

    ; SetBitMap
    ; ====================================================================================================

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

    Func SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend

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

    $hScrDC = _WinAPI_GetDC(0)
    $hMemDC = _WinAPI_CreateCompatibleDC($hScrDC)
    $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
    $hOld = _WinAPI_SelectObject($hMemDC, $hBitmap)
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", _GDIPlus_ImageGetWidth($hImage))
    DllStructSetData($tSize, "Y", _GDIPlus_ImageGetHeight($hImage))
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", $iOpacity)
    DllStructSetData($tBlend, "Format", $AC_SRC_ALPHA)
    _WinAPI_UpdateLayeredWindow($hGUI, $hScrDC, 0, $pSize, $hMemDC, $pSource, 0, $pBlend, $ULW_ALPHA)
    _WinAPI_ReleaseDC(0, $hScrDC)
    _WinAPI_SelectObject($hMemDC, $hOld)
    _WinAPI_DeleteObject($hBitmap)
    _WinAPI_DeleteDC($hMemDC)
    EndFunc;==>SetBitmap

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

    Func _ImageResize($sInImage, $sOutImage, $newW, $newH)
    Local $oldImage, $GC, $newBmp, $newGC
    _GDIPlus_Startup()
    ; Load Image
    $oldImage = _GDIPlus_ImageLoadFromFile($sInImage)
    ;Create New image
    $GC = _GDIPlus_ImageGetGraphicsContext($oldImage)
    $newBmp = _GDIPlus_BitmapCreateFromGraphics($newW, $newH, $GC)
    $newGC = _GDIPlus_ImageGetGraphicsContext($newBmp)
    ;Draw
    _GDIPlus_GraphicsDrawImageRect($newGC, $oldImage, 0, 0, $newW, $newH)
    _GDIPlus_ImageSaveToFile($newBmp, $sOutImage)
    ;Clenaup
    _GDIPlus_GraphicsDispose($GC)
    _GDIPlus_GraphicsDispose($newGC)
    _GDIPlus_BitmapDispose($newBmp)
    _GDIPlus_ImageDispose($oldImage)
    _GDIPlus_Shutdown()
    EndFunc ;==>_ImageResize

    [/autoit]

    Mfg Keyle

  • Moin,

    der Fehler ist auf jeden Fall schon mal in der ImageResize Funktion.
    resize_back.png hat schon Transparenz im unteren Bereich.

    Außerdem solltest Du niemals _GDIPlus_Startup mehrmals aufrufen.
    Nur einmal am Anfang deines Programms und am Ende dann _GDIPlus_Shutdown !

    Mit GDI+ kenne ich mich leider nicht so gut aus, daher kann ich nur raten, welche der Methoden diesen Makel erzeugt.


    Gruß
    Greenhorn


  • Hi,

    meine Bemerkung zu _GDIPlus_Startup/Shutdown bezog sich nicht auf den Fehler, ich dachte da schon eher an die anderen Funktionen. ;)

    Bei mir sieht resize_back.png so aus ...
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.
    Wie Du siehst, ist die Transparenz beim Vergrößern des Bildes entstanden, also liegt der Fehler in der ImageResize Funktion.

    Suche mal nach StrechBlt, das wäre eine bessere Lösung, denke ich ...


    Gruß
    Greenhorn