在VC处理透明的时候,有的时候需要消除图片的某一部分,那就用到让图片来透明来实现;有的时候让窗口隐约显示后面的部分,这个时候就要用到透明窗体的技术。
//初始化函数
BOOL CScoreList::OnInitDialog()
{
__super::OnInitDialog();
//删除窗口标题和获取属性
ModifyStyle(WS_CAPTION,0,0);
SetClassLong(m_hWnd,GCL_HBRBACKGROUND,NULL);
//加载资源
CImageHandle ImageHandle(&m_ImageBack);
//创建区域
CRgn RgnControl;
m_ImageBack.CreateImageRegion(RgnControl,RGB(255,255,255));
//设置窗口
if (RgnControl.GetSafeHandle()!=NULL)
{
//移动窗口
SetWindowRgn(RgnControl,TRUE);
SetWindowPos(NULL,0,0,m_ImageBack.GetWidth(),m_ImageBack.GetHeight(),SWP_NOMOVE);
}
//设置透明
ModifyStyleEx(0,0x00080000);
HINSTANCE hInst = LoadLibrary("User32.DLL");
if(hInst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL;
//取得SetLayeredWindowAttributes()函数指针
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if(fun)fun(this->GetSafeHwnd(),0,250,1);
FreeLibrary(hInst);
}
return TRUE;
}
SetLayeredWindowAttributes:(详见msdn)
<Requirements>
Windows NT/2000/XP: Included in Windows 2000 and later.
Windows 95/98/Me: Unsupported.
Header: Declared in Winuser.h; include Windows.h.
Library: Use User32.lib.
一些常量:
WS_EX_LAYERED = 0x80000;
LWA_ALPHA = 0x2;
LWA_COLORKEY=0x1
其中dwFlags有LWA_ALPHA和LWA_COLORKEY
LWA_ALPHA被设置的话,通过bAlpha决定透明度.
LWA_COLORKEY被设置的话,则指定被透明掉的颜色为crKey,其他颜色则正常显示.
注:要使使窗体拥有透明效果,首先要有WS_EX_LAYERED扩展属性(旧sdk也没有的).
这个函数非常有价值,有了他一透明位图,二透明窗体就都可以实现了,非常爽!