在上一节中我们学习了不规则窗体的实现, 本节我们通过另一个方式来实现用SetWindowRgn函数实现不了的功能,使用的方法我们在前期学过的SetLayeredWindowAtrribute函数通过
ColorKey参数的灵活使用. colorkey就是窗体中有颜色为color的值将其完成透明掉, 使用这个特性可以将我们不形状之外的部分填充成要ColorKey的颜色, 最后调用这个这个函数即可实现.
一、关键代码
1. 以BMP做为窗体的背影,而BMP上有我们需要的窗体的样式图形
case
WM_PAINT
:
{
PAINTSTRUCT ps ;
HDC hDC = BeginPaint ( hWnd , & ps );
HBITMAP hBitmap = CreateCompatibleBitmap ( hDC , 800, 480);
SelectObject ( hDC , hBitmap );
HDC hMemDC = CreateCompatibleDC ( hDC );
SelectObject ( hMemDC , hBmpBK );
BITMAP bmp ;
GetObject ( hBmpBK , sizeof ( BITMAP ), & bmp );
StretchBlt ( hDC , 0, 0, 800, 480, hMemDC , 0, 0, bmp . bmWidth , bmp . bmHeight , SRCCOPY );
DeleteObject ( hMemDC );
DeleteObject ( hBitmap );
EndPaint ( hWnd , & ps );
return 0;
}
{
PAINTSTRUCT ps ;
HDC hDC = BeginPaint ( hWnd , & ps );
HBITMAP hBitmap = CreateCompatibleBitmap ( hDC , 800, 480);
SelectObject ( hDC , hBitmap );
HDC hMemDC = CreateCompatibleDC ( hDC );
SelectObject ( hMemDC , hBmpBK );
BITMAP bmp ;
GetObject ( hBmpBK , sizeof ( BITMAP ), & bmp );
StretchBlt ( hDC , 0, 0, 800, 480, hMemDC , 0, 0, bmp . bmWidth , bmp . bmHeight , SRCCOPY );
DeleteObject ( hMemDC );
DeleteObject ( hBitmap );
EndPaint ( hWnd , & ps );
return 0;
}
2. 设置窗体的层风格并调用SetLayeredWindowAttributes函数
SetWindowLongPtr
(
hWnd
,
GWL_EXSTYLE
,
GetWindowLongPtr
(
hWnd
,
GWL_EXSTYLE
) |
WS_EX_LAYERED
);
SetWindowLongPtr ( hWnd , GWL_STYLE , GetWindowLongPtr ( hWnd , GWL_STYLE ) & ~( WS_CAPTION | WS_DLGFRAME ));
SetLayeredWindowAttributes ( hWnd , RGB (0, 0, 0), 250, LWA_ALPHA | LWA_COLORKEY );
SetWindowLongPtr ( hWnd , GWL_STYLE , GetWindowLongPtr ( hWnd , GWL_STYLE ) & ~( WS_CAPTION | WS_DLGFRAME ));
SetLayeredWindowAttributes ( hWnd , RGB (0, 0, 0), 250, LWA_ALPHA | LWA_COLORKEY );
二、程序效果
处理前 (黑色为我们要去除的颜色) 处理后(过滤黑色后)