有时为了需要,要把窗口客户区透明或者半透明处理,这要用到一个微软的未公开的接口:
SetLayerWindowAttributes(HWND, COLORREF, BYTE, DWORD)
HWND:要透明的窗口句柄;
COLORREF: 透明的rgb值;
BYTE: 透明度的数值,0~255,0为完全透明,255为完全不透明;
DWORD: 1为窗口透明,2为颜色值透明。
在窗口初始化时,加入如下代码:
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
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(), RGB(255, 255, 255), 0, 1);
FreeLibrary(hInst);
}
这样可以设置窗口客户区半透明,其中透明色为白色,但是如果读者直接在对话框初始化的代码中加入,运行程序时,发现客户区并没有透明,这是为什么呢?
仔细看一下,对话框的背景并不是白色而是近似白色的灰色,所以我们需要把背景设置成透明色才能使窗口透明,重载背景图绘制函数,并绘制白色矩形,这是可以看到窗口客户区透明。
上述代码在xp下运行是没问题的,但是如果是在vista系列计算机上运行会发现虽然窗口区域透明了,但是不能移动,一点击窗口区域就点中下面的窗口了,所以需要一个copy窗口,把这个窗口设置为窗口透明,把透明值设为1,不能设置0。
然后把对copy窗口的动作,都传递给本窗口。
示例工程:http://download.youkuaiyun.com/detail/haihui1985/3605871