使用Layered Window遇到的一些问题及解决方法

1. 使用Layered Window需要设置 WS_EX_LAYERED 属性

2.  Layered Window不能作为Child Window

3. 它也不能包含子窗口,为什么呢,因为它收不到WM_PAINT消息,它上边的子窗口显示不了

4. 使用DrawText或者Graphics::DrawString,他们画出的字是透明的,

    这个问题我不知道原因,但是解决方法很简单:

    先将文字画到一个内存位图上,然后使用Bitblt的方式将此内存位图拷贝到目标dc即可

5.  SetWindowRgn 方法失效了!!!

     这个问题同样想不明白,但是解决方法也很简单:

     LayeredWindow有一个性质,透明的部分,鼠标可以穿透,即接收不到鼠标消息

     利用这个特性我们可以很容易制作异形窗口:

      1 // 先保存旧的Clip区域

 2  RECT rcClip = {  0 };
 3 ::GetClipBox(hDC, &rcClip);
 4 HRGN hOldRgn = ::CreateRectRgnIndirect(&rcClip);
 5 
 6  //  先获取需要显示的区域
 7  HRGN rgn = getShowRgn();
 8 
 9  //  选择绘图的区域
10  ::ExtSelectClipRgn(hDC, rgn, RGN_AND);
11 
12  //  好了,开始画图吧,这里只绘制rgn表示的区域,其他没有绘制的区域保持透明,因此可以利用这个特性来制作圆角、箭头等效果
13  doPaint();
14 
15  //  画完之后,恢复Clip区域
16  ::SelectClipRgn(hDC, hOldRgn);
17 
18  //  最后释放rgn
19  ::DeleteRgn(rgn);

 

转载于:https://www.cnblogs.com/hdtianfu/p/3816378.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值