Funktionreferenz


_WinAPI_AlphaBlend

Beschreibung anzeigen in

Zeigt Bitmaps an welche transparente oder semitransparente Pixel haben

#include <WinAPIGdi.au3>
_WinAPI_AlphaBlend ( $hDestDC, $iXDest, $iYDest, $iWidthDest, $iHeightDest, $hSrcDC, $iXSrc, $iYSrc, $iWidthSrc, $iHeightSrc, $iAlpha [, $bAlpha = False] )

Parameter

$hDestDC Das Handle zum Zielgerätekontext.
$iXDest Die X-Koordinate, in logischen Einheiten, der oberen-inken Ecke des Zielrechtecks.
$iYDest Die Y-Koordinate, in logischen Einheiten, der oberen-inken Ecke des Zielrechtecks.
$iWidthDest Die Breite, in logischen Einheiten, des Zielrechtecks.
$iHeightDest Die Höhe, in logischen Einheiten, des Zielrechtecks.
$hSrcDC Das Handle zum Quellgerätekontext.
$iXSrc Die X-Koordinate, in logischen Einheiten, der oberen-inken Ecke des Quellrechtecks.
$iYSrc Die Y-Koordinate, in logischen Einheiten, der oberen-inken Ecke des Quellrechtecks.
$iWidthSrc Die Breite, in logischen Einheiten, des Quellrechtecks.
$iHeightSrc Die Höhe, in logischen Einheiten, des Quellrechtecks.
$iAlpha Der Alphatransparenzwert welcher für die gesamte Quellbitmap verwendet werden soll.
Dieser Wert wird mit dem any per-pixel Alphawert des Quellbitmaps kombiniert.
Wenn $iAlpha 0 ist, so wird angenommen, dass das Bild transparent ist.
Wenn $iAlpha 255 ist (deckend), so werden nur die per-pixel Alphawerte verwendet.
$bAlpha [optional] Gibt an ob ein Alphakanal des Quellbitmaps verwendet werden soll, gültige Werte sind:
    True - Verwendet den Alphakanal (per-pixel Alpha).
        Man sollte beachten, dass APIs vormultiplizierte Alphawerte verwenden. Das bedeutet, dass die rot, grün und blau Kanalwerte der Bitmap vormultipliziert mit dem Alphakanalwert werden müssen.
        Zum Beispiel: Wenn der Alphakanal x ist, so müssen die rot, grün und blau Kanalwerte mit x multipliziert und durch 255, vor dem Aufruf dieser Funktion, geteilt werden.
    False - Verwendet nicht den Alphakanal (Standard).

Rückgabewert

Erfolg: True.
Fehler: False.

Bemerkungen

Wenn das Quell- und Zielrechteck nicht die selbe Größe besitzen, so wird das Quellbitmap auf die Größe des Zielbitmaps gestreckt.
Wenn die _WinAPI_SetStretchBltMode() Funktion verwendet wird, so wird der Streckungsmoduswert automatisch zu $COLORONCOLOR, für diese Funktion, umgewandelt.
Somit werde $BLACKONWHITE, $WHITEONBLACK und $HALFTONE zu $COLORONCOLOR umgewandelt.

Wenn das Ziel- und Quellbitmap nicht das selbe Farbformat haben, so wandelt _WinAPI_AlphaBlend() die Quellbitmap so um, dass sie mit der Zielbitmap übereinstimmt.

Siehe auch

Suche nach GdiAlphaBlend in der MSDN Bibliothek.

Beispiel

#include <GUIConstantsEx.au3>
#include <SendMessage.au3>
#include <SliderConstants.au3>
#include <StaticConstants.au3>
#include <WinAPIGdi.au3>
#include <WinAPIGdiDC.au3>
#include <WinAPIHObj.au3>
#include <WinAPIRes.au3>
#include <WinAPISysWin.au3>
#include <WindowsConstants.au3>

Opt('TrayAutoPause', 0)

; Load image
Global $g_hBitmap = _WinAPI_LoadImage(0, @ScriptDir & '\Extras\AutoIt.bmp', $IMAGE_BITMAP, 0, 0, $LR_LOADFROMFILE)
Local $tSIZE = _WinAPI_GetBitmapDimension($g_hBitmap)
Local $W = DllStructGetData($tSIZE, 'X')
Local $H = DllStructGetData($tSIZE, 'Y')

; Create GUI
Global $g_hForm = GUICreate('Test ' & StringReplace(@ScriptName, '.au3', '()'), $W, $H + 26)
Global $g_idPic = GUICtrlCreatePic('', 0, 0, $W, $H)
GUICtrlCreateGraphic(0, $H, $W, 1)
GUICtrlSetBkColor(-1, 0xDFDFDF)
Global $g_idSlider = GUICtrlCreateSlider(0, $H + 1, $W, 25, BitOR($TBS_BOTH, $TBS_NOTICKS))
Global $g_hSlider = GUICtrlGetHandle(-1)
GUICtrlSetLimit(-1, 255, 0)
GUICtrlSetData(-1, 255)

; Set bitmap to control with alpha
_SetBitmapAlpha($g_idPic, $g_hBitmap, 255)

; Register WM_HSCROLL message for live scrolling and show GUI
GUIRegisterMsg($WM_HSCROLL, 'WM_HSCROLL')
GUISetState(@SW_SHOW)

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _SetBitmapAlpha($hWnd, $hBitmap, $iAlpha)
    If Not IsHWnd($hWnd) Then
        $hWnd = GUICtrlGetHandle($hWnd)
        If Not $hWnd Then
            Return 0
        EndIf
    EndIf

    Local $aW[2], $aH[2]
    Local $tRECT = _WinAPI_GetClientRect($hWnd)
    $aW[0] = DllStructGetData($tRECT, 3) - DllStructGetData($tRECT, 1)
    $aH[0] = DllStructGetData($tRECT, 4) - DllStructGetData($tRECT, 2)
    Local $tSIZE = _WinAPI_GetBitmapDimension($hBitmap)
    $aW[1] = DllStructGetData($tSIZE, 1)
    $aH[1] = DllStructGetData($tSIZE, 2)
    Local $hDC = _WinAPI_GetDC($hWnd)
    Local $hDestDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hBmp = _WinAPI_CreateCompatibleBitmapEx($hDC, $aW[0], $aH[0], 0xFFFFFF)
    Local $hDestSv = _WinAPI_SelectObject($hDestDC, $hBmp)
    Local $hSrcDC = _WinAPI_CreateCompatibleDC($hDC)
    Local $hSrcSv = _WinAPI_SelectObject($hSrcDC, $hBitmap)
    _WinAPI_AlphaBlend($hDestDC, 0, 0, $aW[0], $aH[0], $hSrcDC, 0, 0, $aW[1], $aH[1], $iAlpha, 0)
    _WinAPI_SelectObject($hDestDC, $hDestSv)
    _WinAPI_DeleteDC($hDestDC)
    _WinAPI_SelectObject($hSrcDC, $hSrcSv)
    _WinAPI_DeleteDC($hSrcDC)
    _WinAPI_ReleaseDC($hWnd, $hDC)
    Local $hObj = _SendMessage($hWnd, $STM_SETIMAGE, $IMAGE_BITMAP, $hBmp)
    If $hObj Then
        _WinAPI_DeleteObject($hObj)
    EndIf
    $hObj = _SendMessage($hWnd, $STM_GETIMAGE)
    If $hObj <> $hBmp Then
        _WinAPI_DeleteObject($hBmp)
    EndIf
    Return 1
EndFunc   ;==>_SetBitmapAlpha

Func WM_HSCROLL($hWnd, $iMsg, $wParam, $lParam)
    #forceref $iMsg,$wParam

    Switch $hWnd
        Case $g_hForm
            Switch $lParam
                Case $g_hSlider
                    _SetBitmapAlpha($g_idPic, $g_hBitmap, GUICtrlRead($g_idSlider))
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_HSCROLL