UpdateLayeredWindow与SetLayeredWindowAttributes
CodeProject 案例
具有Windows 2000及更高版本的标准控件的酷,半透明和异形对话框
完美的半透明和形状的对话框与标准的ActiveX和半透明控件为Windows 2000+
一、不规则窗口实现三大函数
1.UpdateLayeredWindow
https://msdn.microsoft.com/en-us/library/windows/desktop/ms633556(v=vs.85).aspx
更新的位置、大小、形状、内容和半透明的分层窗口。
BOOL WINAPI UpdateLayeredWindow(
_In_ HWND hwnd,//窗口句柄
_In_opt_ HDC hdcDst,//屏幕上下文DC
_In_opt_ POINT *pptDst,//窗口相对于屏幕的位置的POINT结构的指针
_In_opt_ SIZE *psize,//显示窗口大小
_In_opt_ HDC hdcSrc,//窗口上下文DC
_In_opt_ POINT *pptSrc,//窗口绘图表面在设备上下文位置的POINT结构的指针
_In_ COLORREF crKey,
_In_opt_ BLENDFUNCTION *pblend,//透明混合参数
_In_ DWORD dwFlags
);
参数
hwnd [in]
类型:HWND
分层窗口的句柄。通过使用CreateWindowEx函数创建窗口时,通过指定WS_EX_LAYERED创建分层窗口。
Windows 8的: 该WS_EX_LAYERED样式支持顶级窗口和子窗口。以前的Windows版本仅支持顶级窗口WS_EX_LAYERED。
hdcDst [in,可选]
类型:HDC
屏幕的DC的句柄。调用该函数时,通过指定NULL获得该句柄。当窗口内容更新时,它用于调色板颜色匹配。如果hdcDst为NULL,将使用默认调色板。
如果hdcSrc为NULL,则hdcDst必须为NULL。
pptDst [in,optional]
类型:POINT *
指向分层窗口的新屏幕位置的结构的指针。如果当前位置不变,pptDst可以为NULL。
psize [in,可选]
类型:SIZE *
指向结构的指针,指定分层窗口的新大小。如果窗口的大小没有改变,psize可以为NULL。如果hdcSrc为NULL,则psize必须为NULL。
hdcSrc [in,可选]
类型:HDC
用于定义分层窗口的表面的DC的手柄。可以通过调用CreateCompatibleDC函数获得该句柄。如果窗口的形状和视觉上下文不变,hdcSrc可以为NULL。
pptSrc [in,optional]
类型:POINT *
指向指定设备上下文中图层位置的结构的指针。如果hdcSrc为NULL,则pptSrc应为NULL。
crKey [in]
类型:COLORREF
指定在组合分层窗口时使用的颜色键的结构。要生成COLORREF,请使用RGB宏。
pblend [in,可选]
类型:BLENDFUNCTION *
指向结构的指针,该结构指定在组合分层窗口时要使用的透明度值。
dwFlags [in]
类型:DWORD
此参数可以是以下值之一。
值 含义
ULW_ALPHA 0x00000002 使用pblend作为混合功能。如果显示模式为256色以下,则该值的效果与ULW_OPAQUE的效果相同。
ULW_COLORKEY 00000001 使用crKey作为透明度颜色。
ULW_OPAQUE 0x00000004 画一个不透明的分层窗口。
如果hdcSrc为NULL,则dwFlags应为零。
2.BLENDFUNCTION structure
https://msdn.microsoft.com/en-us/library/windows/desktop/dd183393(v=vs.85).aspx
BLENDFUNCTION结构混合控制混合通过指定源和目标位图的功能。
typedef struct _BLENDFUNCTION {
BYTE BlendOp;//AC_SRC_OVER
BYTE BlendFlags;//0
BYTE SourceConstantAlpha;//
BYTE AlphaFormat;//AC_SRC_ALPHA
} BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;
BlendOp:指定AC_SRC_OVER
BlendFlags:必须为0
SourceConstantAlpha:指定一个alpha透明度值被用于整个源位图。SourceConstantAlpha值加上任何在源位图的alpha值。假设你的图像是透明的,SourceConstantAlpha设置为0。SourceConstantAlpha值设置为255(不透明的)。
AlphaFormat:这个参数控制源和目标的解析方式,使用AC_SRC_ALPHA
AC_SRC_ALPHA这个值在源有Alpha通道时(也就是操作的图本身带有透明通道信息时),提醒系统API调用函数前必须预先乘以alpha值,也就是说位图上某个像素位置的red、green、blue通道值必须先与alpha相乘。例如,如果alpha透明值是x,那么red、green、blue三个通道的值必须乘以x并且再除以255(因为alpha的值的范围是0~255),之后才能被调用。
3.SetLayeredWindowAttributes
https://msdn.microsoft.com/en-us/library/windows/desktop/ms633540(v=vs.85).aspx
设置分层窗口的不透明度和透明度颜色键。
BOOL WINAPI SetLayeredWindowAttributes(
_In_ HWND hwnd,
_In_ COLORREF crKey,
_In_ BYTE bAlpha,
_In_ DWORD dwFlags
);
参数
hwnd [in]
类型:HWND
分层窗口的句柄。通过在CreateWindowEx函数创建窗口时指定WS_EX_LAYERED或通过在创建窗口后通过SetWindowLong设置WS_EX_LAYERED来创建分层窗口。
Windows 8的: 该WS_EX_LAYERED样式支持顶级窗口和子窗口。以前的Windows版本仅支持顶级窗口WS_EX_LAYERED。
crKey [in]
类型:COLORREF
甲COLORREF构成分层窗口时要使用用于说明透明度颜色键结构。这个颜色的窗口所画的所有像素将是透明的。要生成COLORREF,请使用RGB宏。
bAlpha [in]
类型:BYTE
Alpha值用于描述分层窗口的不透明度。类似于BLENDFUNCTION结构的SourceConstantAlpha成员。当bAlpha为0时,窗口完全透明。当bAlpha是255时,窗口是不透明的。
dwFlags [in]
类型:DWORD
要采取的行动。此参数可以是以下值中的一个或多个。
值 含义
LWA_ALPHA 0x00000002 使用bAlpha来确定分层窗口的不透明度。
LWA_COLORKEY 00000001 使用crKey作为透明度颜色。
二、仿七彩虹光盘界面程序
使用GDI+贴图,利用UpdateLayeredWindow函数,但是UpdateLayeredWindow不支持OnPaint重绘,所以又用到SetLayeredWindowAttributes,该函数支持OnPaint,那么就可以准备两个窗口,一个放背景,一个放控件。
可以看到在按钮边框还有一些颜色有瑕疵,用了两种方法实现,具体请下载