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