在初始化中使用下面两行代码
ModifyStyleEx(0, WS_EX_LAYERED);
::SetLayeredWindowAttributes(m_hWnd, RGB(1, 255, 0), 100, LWA_COLORKEY); //set color transparent,指定透明的颜色
然后在OnEraseBkgnd或者OnPaint中
CRect rect;
this->GetClientRect(&rect);
dc.FillSolidRect(rect, RGB(1, 255, 0)); //填充指定透明的颜色
可以达到窗口透明,当然你可以填充指定矩形区达到局部透明。
那么问题来了,当这样透明后,鼠标无法穿透透明区域,怎么才能做到鼠标穿透呢? 很简单,将填充颜色改为RGB(0, 255, 0),也就是说设置纯色透明可以达到鼠标穿透,混合色不穿透。 很奇怪,我也没仔细研究是什么原因,就记录下吧。
//1、设置窗口背景颜色
SetBackgroundColor(RGB(255, 255, 254));
//2、设置窗口外观,无标题、无边框
//GetWindowLong(this->m_hWnd, GWL_EXSTYLE);
//SetWindowLong(this->m_hWnd, GWL_EXSTYLE, 0x80000);
SetWindowLong(this->m_hWnd, GWL_STYLE, 0);
//DWORD dwStyle = GetStyle(); //等价于GetWindowLong(m_hWnd, GWL_STYLE);
//DWORD dwNewStyle = WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
//dwNewStyle &= ~dwStyle;
//SetWindowLong(m_hWnd, GWL_STYLE, dwNewStyle);
//3、设置窗口为扩展模式
SetWindowLong(this->GetSafeHwnd(), GWL_EXSTYLE,
GetWindowLong(this->GetSafeHwnd(), GWL_STYLE)| WS_EX_LAYERED);
//4、在扩展模式下设置窗口背景透明
SetLayeredWindowAttributes(RGB(255, 255, 254), 120, LWA_COLORKEY);
//5、在顶层显示窗口
SetWindowPos(&wndTopMost, 0, 120, 1024, 768, SWP_SHOWWINDOW);