异形窗口-仿七彩虹光盘界面程序

来源:互联网 发布:流量劫持软件 编辑:程序博客网 时间:2024/05/07 08:38

 PNG透明窗体全攻略(控件不透明)

MFC界面编程1:GDI+实现不规则窗体

 VC++玩转炫酷悬浮窗3---GDI+完美实现不规则窗体

GDI+编程小结

UpdateLayeredWindow与SetLayeredWindowAttributes

Layered Window透明窗体的实现总结

用UpdateLayeredWindow实现任意异形窗口


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,那么就可以准备两个窗口,一个放背景,一个放控件。

 可以看到在按钮边框还有一些颜色有瑕疵,用了两种方法实现,具体请下载

异形窗口-仿七彩虹光盘界面程序


 

原创粉丝点击