- UID
- 1
- 精华
- 积分
- 76361
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
1、什么是分层窗体
分层窗体,就是像LOL登陆界面、星际②登陆界面一样的屌逼窗体。
2、实现方法
用UpdateLayeredWindow函数刷新窗体的位置和图像即可。
3、需要用到的API
UpdateLayeredWindow
CreateDIBSection
CreateCompatibleDC
SelectObject
DeleteDC
4、需要用到的常数
WS_EX_LAYERED=0x80000
AC_SRC_OVER=0
AC_SRC_ALPHA=1
ULW_ALPHA=0x2L
5、具体实现方法
(1)VC6有不起UpdateLayeredWindow、WS_EX_LAYERED、AC_SRC_ALPHA、ULW_ALPHA这4个东西(因为Windows98有不起透明分层窗体),你需要自己定义如下:
typedef BOOL(WINAPI* LPFN_UpdateLayeredWindow)(HWND,HDC,POINT*,SIZE*,HDC,POINT*,COLORREF,BLENDFUNCTION*,DWORD);
LPFN_UpdateLayeredWindow _UpdateLayeredWindow;
//这个API需要自己用LoadLibrary()、GetProcAddress()取得入口点,才能调用,详情请看“C\C++动态调用DLL”
//在这里,我们把它声明为_UpdateLayeredWindow;这样如果我们在一些编译器不会导致冲突。
//定义常数
#ifndef WS_EX_LAYERED
#define WS_EX_LAYERED 0x80000
#endif
#ifndef AC_SRC_OVER
#define AC_SRC_OVER 0
#endif
#ifndef AC_SRC_ALPHA
#define AC_SRC_ALPHA 1
#endif
#ifndef ULW_ALPHA
#define ULW_ALPHA 0x2L
#endif
(2)实现细节
首先,我们需要一个具有WS_EX_LAYERED样式的窗体,有两种方法可以得到一个这种样式的窗体
-1,CreateWindowEx函数,第一个参数设置成WS_EX_LAYERED
-2,用SetWindowLong把窗体的GWL_EXSTYLE设置为WS_EX_LAYERED
其次,我们需要不断地调用UpdateLayeredWindow更新窗体。我们需要在WndProc函数里调用这个API。
只需要在WM_ACTIVATE、WM_MOVING、WM_SIZE、WM_SIZING事件里更新即可。
×重要提示×
窗体样式很重要,最好不要弄WS_SIZEBOX,否则一旦你的窗体大小超过了你给的图片的大小,就会看到一个很难看的窗体。如果你没有弄WS_SIZEBOX,你也不需要在WM_SIZE、WM_SIZING里面更新窗体。
(3) UpdateLayeredWindow的实现细节
先建立一个32位位图,CreateCompatibleDC、CreateDIBSection、SelectObject三个API做一个自己的32位位图。
弄好BLENDFUNCTION
BlendOp填AC_SRC_OVER
BlendFlags填0
SourceConstantAlpha填“不透明度”,填255好控制
AlphaFormat填AC_SRC_ALPHA
然后参数的填写(推荐这么填写):
UpdateLayeredWindow(你的窗口句柄,NULL,&窗口左上角的屏幕位置,&窗口大小,你的位图HDC句柄,&你的图像的起始座标,透明色(给0吧),刚才填写的BLENDFUNCTION ,ULW_ALPHA);
提示,它绘制窗体的方式类似于D3D的这种:
SrcBlend=One;
DestBlend=InvSrcAlpha;
你的颜色必须预乘透明度才能正确显示。
|
|