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] )
$hDestDC | Das Handle zum Zielgerätekontext. |
$iXDest | Die X-Koordinate, in logischen Einheiten, der oberen-linken Ecke des Zielrechtecks. |
$iYDest | Die Y-Koordinate, in logischen Einheiten, der oberen-linken 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-linken Ecke des Quellrechtecks. |
$iYSrc | Die Y-Koordinate, in logischen Einheiten, der oberen-linken 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). |
Erfolg: | True. |
Fehler: | False. |
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.
Suche nach GdiAlphaBlend in der MSDN Bibliothek.
#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