【无标题】VC++ SetLayeredWindowAttributes 部分窗口透明鼠标穿透

在初始化中使用下面两行代码

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);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值