做一个项目,需要用到窗口透明,把我学习到的几种方法罗列一下:
1,响应WM_CTLCOLOR消息,在消息函数内,如果需要获取窗口的Brush句柄,返回一个空句柄。
这个方法能够实现窗口的背景透明,但是不能设置alpha值,也就是说,没办法做到半透的效果。
2,调用SetWindowRgn函数,可以得到一个不规则形状窗口,把需要透明的窗口部分去掉。
这个方法说起来不算是真正的窗口透明,但是可以用来创建一个非规则的窗口应用程序。
3,重载窗口的OnCreate函数,设置扩展属性:
int CWhiteBoardDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
DWORD exStyle = ::GetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE);
exStyle |= WS_EX_LAYERED;
::SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, exStyle);
::SetLayeredWindowAttributes(this->GetSafeHwnd(), RGB(0, 0, 0), 50, LWA_COLORKEY);
exStyle |= WS_EX_LAYERED;
::SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE, exStyle);
::SetLayeredWindowAttributes(this->GetSafeHwnd(), RGB(0, 0, 0), 50, LWA_COLORKEY);
// TODO: 在此添加您专用的创建代码
return 0;
}
}
SetLayeredWindowAttributes函数的最后一个参数,可以指明为Alpha透明。这样可以设置半透的效果。
第三个方法的问题是,整个窗口包括背景和前景都会有alpha效果,有时候只需要背景透明,而前景色保持不变,需要结合第1,3种方法才行。
转载于:https://blog.51cto.com/johns/165953