GDI+-Hilfe?

  • So, da ich mich noch nicht in GDI+ so genau auskenne, muss ich mir heute mal wieder helfen lassen:
    Nemen wir mal an ich habe 2 Bilder ("l" und "n" mit

    [autoit]

    _GDIPlus_ImageLoadFromFile(@ScriptDir & "\background_0.png")

    [/autoit]

    geladen, nun möchte ich diese beiden Bilder in ein weiteres Bild (nennen wir es mal "x") einfügen. Jedoch ist von "x" keine Bilddatei vorhanden, also müsste ich sie ihrgentwie erzeugen. Das Bild sollte dazu auch transparent sein. Siehe Bild im Anhang:
    grau = "x" (transparent)
    rot = "l"
    grün = "n"

  • So, um das für alle verständlich zu machen:
    Das Ergebnis des oben beschriebenen Vorgangs möchte ich dann mit:

    [autoit]

    SetBitmap($background, $hImage1, 255)

    [/autoit]

    auf das GUi bringen.
    Der ganze Code mal:

    [autoit]

    #include
    #include
    #include
    #include
    #include
    #include

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

    _GDIPlus_Startup()
    Global Const $AC_SRC_ALPHA = 1

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

    ;Systeminformationen sammeln:
    $x = 0
    $y = 0
    $w = @DesktopWidth
    $h = @DesktopHeight

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

    ;Background
    $background = GUICreate("Notizzettel", $w, $h, $x, $y, $WS_POPUP, BitOr( $WS_EX_LAYERED, $WS_EX_TOOLWINDOW))
    GUISetState(@SW_SHOW)
    WinSetOnTop($background, "", 1)

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

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

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

    ;Bild 1 laden:
    $hImage1 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\background_0.png")
    ;Bild 2 laden:
    $hImage2 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\background_1.png")

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

    ;nun beide Objekte nebeneinander zusammenfügen und hiermit anzeigen:

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

    ;???

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

    SetBitmap($background, $gesamtbild, 255)
    ;===================================================================================================================================

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

    do
    until GUIGetMsg() =$GUI_EVENT_CLOSE

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

    ; Release resources
    _GDIPlus_ImageDispose($hImage1)
    _GDIPlus_Shutdown()

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

    Func SetBitmap($hGUI, $hImage, $iOpacity)
    Local $hScrDC, $hMemDC, $hBitmap, $hOld, $pSize, $tSize, $pSource, $tSource, $pBlend, $tBlend
    $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

    [/autoit]
  • Bitte sehr:

    Spoiler anzeigen
    [autoit]


    ;Coded by UEZ 2009.12.12
    #include <GDIplus.au3>
    #include <WindowsConstants.au3>
    Opt("GUIOnEventMode", 1)

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

    Global $width = @DesktopWidth
    Global $height = @DesktopHeight
    _GDIPlus_Startup()
    Global $load_img1 = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\background_0.png")
    Global $img1_x = _GDIPlus_ImageGetWidth($load_img1)
    Global $img1_y = _GDIPlus_ImageGetHeight($load_img1)
    Global $load_img2 = _GDIPlus_BitmapCreateFromFile(@ScriptDir & "\background_1.png")
    Global $img2_x = _GDIPlus_ImageGetWidth($load_img2)
    Global $img2_y = _GDIPlus_ImageGetHeight($load_img2)

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

    Global $hwnd = GUICreate("Notizzettel", $width, $height, -1, -1, 0, BitOR($WS_EX_LAYERED, $WS_EX_TOPMOST))

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

    $graphics = _GDIPlus_GraphicsCreateFromHWND($hwnd)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics($width, $height, $graphics)
    $backbuffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
    ;~ _GDIPlus_GraphicsSetSmoothingMode($backbuffer, 4)

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

    $ScreenDc = _WinAPI_GetDC($hWnd)
    $dc = _WinAPI_CreateCompatibleDC($ScreenDc)

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

    ; _WinAPI_UpdateLayeredWindow parameters
    $tSize = DllStructCreate($tagSIZE)
    $pSize = DllStructGetPtr($tSize)
    DllStructSetData($tSize, "X", $width)
    DllStructSetData($tSize, "Y", $height)
    $tSource = DllStructCreate($tagPOINT)
    $pSource = DllStructGetPtr($tSource)
    $tBlend = DllStructCreate($tagBLENDFUNCTION)
    $pBlend = DllStructGetPtr($tBlend)
    DllStructSetData($tBlend, "Alpha", 255)
    DllStructSetData($tBlend, "Format", 1)
    $tPoint = DllStructCreate($tagPOINT)
    $pPoint = DllStructGetPtr($tPoint)
    DllStructSetData($tPoint, "X", 0)
    DllStructSetData($tPoint, "Y", 0)

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

    GUISetOnEvent(-3, "_Exit")
    GUISetState()

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

    While Sleep(30)
    _GDIPlus_GraphicsDrawImage($backbuffer, $load_img1, 0, 0) ;draw background
    _GDIPlus_GraphicsDrawImage($backbuffer, $load_img2, $img2_x, 0) ;draw foreground
    $gdibitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($bitmap)
    _WinAPI_SelectObject($dc, $gdibitmap)
    _WinAPI_UpdateLayeredWindow($hWnd, $ScreenDc, 0, $pSize, $dc, $pSource, 0, $pBlend, 2)
    WEnd

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

    Func _Exit()
    _WinAPI_DeleteDC($dc)
    _WinAPI_ReleaseDC($hWnd, $ScreenDc)
    _GDIPlus_GraphicsDispose($backbuffer)
    _GDIPlus_BitmapDispose($bitmap)
    _GDIPlus_GraphicsDispose($graphics)
    _GDIPlus_Shutdown()
    WinClose($hwnd)
    Exit
    EndFunc

    [/autoit]

    Gute Nacht,
    UEZ