4 BOOL WINAPI
GdiAlphaBlend(HDC hdcDst
, int xDst
, int yDst
, int widthDst
, int heightDst
,
5 HDC hdcSrc
, int xSrc
, int ySrc
, int widthSrc
, int heightSrc
,
6 BLENDFUNCTION blendFunction
);
9 #define AC_SRC_ALPHA (0x1)
13 const char* WndClassName
= "GMainWnd";
14 LRESULT CALLBACK
MainWndProc(HWND HWnd
, UINT Msg
, WPARAM WParam
,
17 int APIENTRY
WinMain(HINSTANCE HInstance
, HINSTANCE HPrevInstance
,
18 LPTSTR lpCmdLine
, int nCmdShow
)
25 memset(&wc
, 0, sizeof(WNDCLASS
));
27 wc
.style
= CS_VREDRAW
| CS_HREDRAW
| CS_DBLCLKS
;
28 wc
.lpfnWndProc
= MainWndProc
;
29 wc
.hInstance
= HInstance
;
30 wc
.hCursor
= LoadCursor(NULL
, (LPCTSTR
)IDC_ARROW
);
31 /* wc.hbrBackground = reinterpret_cast<HBRUSH>(COLOR_BTNFACE + 1); */
32 wc
.hbrBackground
= (HBRUSH
)(COLOR_BTNFACE
+ 1);
33 wc
.lpszClassName
= WndClassName
;
35 if (RegisterClass(&wc
))
39 WndClassName
, TEXT("AlphaBlend Rendering Demo"),
40 WS_OVERLAPPED
| WS_SYSMENU
| WS_CAPTION
|
41 WS_VISIBLE
| WS_CLIPSIBLINGS
,
43 NULL
, NULL
, HInst
, NULL
48 ShowWindow(HWnd
, nCmdShow
);
51 while (GetMessage(&msg
, NULL
, 0, 0))
53 TranslateMessage(&msg
);
54 DispatchMessage(&msg
);
63 LPCSTR filename
= TEXT("lena.bmp");
64 HDC HMemDC
= NULL
, HMemDC2
= NULL
;
65 HBITMAP HOldBmp
= NULL
;
66 PVOID pBmpBits
= NULL
;
67 HBITMAP H32BppBitmap
= NULL
;
70 BOOL
ConvertBitmapTo32Bpp(HDC hDC
, BITMAP
*bmp
)
72 ZeroMemory(&bmpi
, sizeof(BITMAPINFO
));
73 bmpi
.bmiHeader
.biSize
= sizeof(BITMAPINFO
);
74 bmpi
.bmiHeader
.biWidth
= bmp
->bmWidth
;
75 bmpi
.bmiHeader
.biHeight
= bmp
->bmHeight
;
76 bmpi
.bmiHeader
.biPlanes
= 1;
77 bmpi
.bmiHeader
.biBitCount
= 32;
78 bmpi
.bmiHeader
.biCompression
= BI_RGB
;
79 bmpi
.bmiHeader
.biSizeImage
= 4 * bmpi
.bmiHeader
.biWidth
* bmpi
.bmiHeader
.biHeight
;
80 H32BppBitmap
= CreateDIBSection(hDC
, &bmpi
, DIB_RGB_COLORS
, &pBmpBits
, 0, 0);
84 SelectObject(hDC
, H32BppBitmap
);
85 BitBlt(hDC
, 0, 0, bmp
->bmWidth
, bmp
->bmHeight
, HMemDC
, 0, 0, SRCCOPY
);
87 /* load and apply alpha channel */
88 bmpalpha
= LoadImage(HInst
, MAKEINTRESOURCE(2000), IMAGE_BITMAP
,
92 COLORREF
*col
= pBmpBits
;
94 HDC hdcTemp
= CreateCompatibleDC(NULL
);
97 DeleteObject(bmpalpha
);
100 SelectObject(hdcTemp
, bmpalpha
);
102 for(y
= 0; y
< bmp
->bmHeight
; y
++)
104 for(x
= 0; x
< bmp
->bmWidth
; x
++)
106 COLORREF Color
= (COLORREF
)GetRValue(GetPixel(hdcTemp
, x
, y
)) << 24;
111 DeleteObject(bmpalpha
);
120 LRESULT CALLBACK
MainWndProc(HWND HWnd
, UINT Msg
, WPARAM WParam
,
127 /* create a memory DC */
128 HMemDC
= CreateCompatibleDC(NULL
);
131 /* load a bitmap from file */
133 /* static_cast<HBITMAP> */(
134 LoadImage(HInst
, MAKEINTRESOURCE(1000), IMAGE_BITMAP
,
139 /* extract dimensions of the bitmap */
140 GetObject(HBmp
, sizeof(BITMAP
), &bmp
);
142 /* associate the bitmap with the memory DC */
143 /* HOldBmp = static_cast<HBITMAP> */
144 (SelectObject(HMemDC
, HBmp
)
146 HMemDC2
= CreateCompatibleDC(NULL
);
147 if(!ConvertBitmapTo32Bpp(HMemDC2
, &bmp
))
158 BLENDFUNCTION BlendFunc
;
159 HDC Hdc
= BeginPaint(HWnd
, &ps
);
165 BlendFunc
.BlendOp
= AC_SRC_OVER
;
166 BlendFunc
.BlendFlags
= 0;
167 BlendFunc
.SourceConstantAlpha
= 128;
168 BlendFunc
.AlphaFormat
= 0;
171 bmp
.bmWidth
, bmp
.bmHeight
,
174 GdiAlphaBlend(Hdc
, 0, 0, bmp
.bmWidth
, bmp
.bmHeight
,
175 HMemDC2
, 0, 0, bmp
.bmWidth
, bmp
.bmHeight
,
177 GdiAlphaBlend(Hdc
, bmp
.bmWidth
- 15, 10, bmp
.bmWidth
/ 2, bmp
.bmHeight
/ 2,
178 HMemDC2
, 0, 0, bmp
.bmWidth
, bmp
.bmHeight
,
181 BlendFunc
.SourceConstantAlpha
= 255;
182 BlendFunc
.AlphaFormat
= AC_SRC_ALPHA
;
184 GdiAlphaBlend(Hdc
, 140, 200, bmp
.bmWidth
, bmp
.bmHeight
,
185 HMemDC2
, 0, 0, bmp
.bmWidth
, bmp
.bmHeight
,
187 GdiAlphaBlend(Hdc
, 20, 210, (bmp
.bmWidth
/ 3) * 2, (bmp
.bmHeight
/ 3) * 2,
188 HMemDC2
, 0, 0, bmp
.bmWidth
, bmp
.bmHeight
,
203 DeleteObject(SelectObject(HMemDC
, HOldBmp
));
211 return DefWindowProc(HWnd
, Msg
, WParam
, LParam
);