嘿嘿~近日突然发现了一个好玩的函数,现在就给大家介绍介绍(砖头飞过..)这个函数的名字叫:SetLayeredWindowAttributes 从字面上意思来理解应该是”设置窗口属性”的吧!可是查了下俺老版本的MSDN,居然找不到这个函数..这个汗啊,从网上查知是Win2000/xp以后才有的功能.所以可以先查查自己的Msdn是否可以找到,如果找到,哈哈,那就恭喜你啦,不用这么麻烦的使用,直接调用函数就行了!
函数原型:
BOOL SetLayeredWindowAttributes
(
HWND hwnd, // handle to the layered window
COLORREF crKey, // specifies the color key
BYTE bAlpha, // value for the blend function
DWORD dwFlags // action
);
WS_EX_LAYERED = 0x80000; //扩展风格
LWA_ALPHA = 0x2; //dwFlags里的标志 设置透明如果此参数设置,则crKey不起作用
LWA_COLORKEY=0x1 //dwFlags里的标志 设置色彩如果此参数设置,则bAlpha不起作用
首先自己先建个基于对话框的程序, 把以下代码放入OnInitDialog()中:
SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE) | 0x80000);
//添加扩展风格WS_EX_LAYERED=0x80000
HINSTANCE hIns;
hIns=LoadLibrary("User32.dll"); //这个函数在这个库里
if(hIns)
{
typedef BOOL (WINAPI*SetAlpha)(HWND,COLORREF,BYTE,DWORD);
//这是一个函数指针,是为了获得咱们需要的函数的地址。
SetAlpha Myfun;
Myfun=NULL;
Myfun=(SetAlpha)GetProcAddress(hIns,"SetLayeredWindowAttributes");
//获取这个函数的地址
if(Myfun)
Myfun(GetSafeHwnd(),RGB(0,0,0),150,2);//150为透明的值,上限为255
//可以(255*60/100)这样设置,不透明度就为60%
FreeLibrary(hIns);
}
好了,试一下是不是变的透明了,呵呵~我们来为他多加点功能吧,比如设置别的应用程序也成透明的,这应该嘛好玩的,我们就以QQ登录窗口来试验一把吧!
这里我们需要用到一个函数:FindWindow();
原型声明:
HWND FindWindow
(
LPCTSTR lpClassName
LPCTSTR lpWindowName
)
这里简单介绍一下,这个函数就是查找某个程序窗口的句柄。当第一个参数为某个指定的值时,第二个参数为NULL就可以,反之也是。
OK,开始我们的工作吧!
在CXXXDlg类中加个WM_CREATE,WM_TIMER消息,在OnCreate()中加入如下代码:
SetTimer(1,10,NULL);
在OnTimer()函数中加入如下代码:
//查找QQ登录窗口的句柄
//如果机器上没有QQ,则更改对象咱们改为寻找系统自带的计算器。
// HWND hwnd=::FindWindow(“SciCalc”,NULL);
HWND hwnd=::FindWindow(NULL,"QQ用户登录");//注意这里需要使用全局函数::
if(hwnd)
{
SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE) | 0x80000);
HINSTANCE hIns;
hIns=LoadLibrary("User32.dll");
if(hIns)
{
typedef BOOL (WINAPI*SetAlpha)(HWND,COLORREF,BYTE,DWORD);
SetAlpha Myfun;
Myfun=NULL;
Myfun=(SetAlpha)GetProcAddress(hIns,"SetLayeredWindowAttributes");
if(Myfun)
SetWindowLong(hwnd,GWL_EXSTYLE,
GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE) | 0x80000);
//设置让QQ登录窗口也有这种风格,此时句柄为QQ窗口句柄 hwnd
Myfun(hwnd,RGB(0,0,0),150,2);
FreeLibrary(hIns);
}
KillTimer(1);// 如果找到,让定时器停止工作!(杀死时间,呵呵!)
//MessageBox("时间已被停止");
}
大功告成!现在我们就来测试一下吧,打开你的QQ,看看是不是也变透明啦~怎么样学会了吧!!!
透明前;
透明后
看不到图片..呵呵~~往我相册里找找看~!!
接下来给你个任务,就是自己用这个函数做个窗口渐变的程序吧,哈哈,看你的啦!
给你个提示:
设置不透明度的百分比!
http://hi.baidu.com/juebufangqini/blog/item/da35d0cd2b87e7540fb34587.html