找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 5827|回复: 1

Windows分层窗体的C\C++实现

[复制链接]
发表于 2014-1-27 21:51:02 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
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;
你的颜色必须预乘透明度才能正确显示。

本帖被以下淘专辑推荐:

回复

使用道具 举报

沧海浮萍 该用户已被删除
发表于 2014-5-9 17:50:55 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-12-22 01:00 , Processed in 0.049229 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表