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

使用Layered Window遇到的一些问题及解决方法,布布扣,bubuko.com

时间: 2024-10-01 07:45:18

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

js实现window.open不被拦截的解决方法汇总

一.问题: 今天在处理页面ajax请求过程中,想实现请求后打开新页面,就想到通过 js window.open 来实现,但是最终都被浏览器拦截了. 二.分析: 在谷歌搜索有没有解决方法,有些说可以通过新建a标签,模拟点击来实现,但是测试发现都实现不了,照样被浏览器拦截.最后找到了一个折中的办法,可以实现新页面打开,但是没有a标签的那种直接流量新页面的效果. 三.实现代码: $obj.click(function(){ var newTab=window.open('about:blank');

nuxtjs在vue组件中使用window对象编译报错的解决方法

我们知道nuxtjs是做服务端渲染的,他有很多声明周期是运行在服务端的,以及正常的vue声明周期mounted之前均是在服务端运行的,那么服务端是没有比如window对象的location.navagitor等,以及H5的FormData()方法,所以当你在created之前使用这些时,会报错,那么如何处理呢? 1.自己的写的函数里包含window等 因为nuxt为SSR框架,所以其编译打包时会区分服务端渲染还是客户端渲染(即浏览器),在vue文件中使用window对象报错的原因是,webpac

node.js中模块报错【window is not defined】的解决方法

(function(window) { /* Keep source code the same */ // })(typeof window == "undefined" ? global : window); // or })(this);

Window下Qt Creator启动错误解决方法

很多电脑现在都是用的是双显卡,高性能的独显和性能比较差但耗电少的集显,在Window10系统下右键点击软件,在"图形处理器"里面可以选择使用什么显卡操作此软件.下面是我在运行Qt Creator时碰到的问题,双击软件,软件没有任何反应,既没有打开软件的界面,也没有报错.在多次尝试后,右键软件,选择以"集成图形"的方式打开,就OK了.为了避免每次选择造成的麻烦,我们可以更改默认图形处理器,将该软件选择默认以"集成图形"的方式打开.记住为了不影响其他

Window下,Jenkins忘记密码解决方法

没有修改过密码的情况下找回初始密码(或者第一次部署的时候) 进入目录 D:\jenkins\secrets ,找到文件 initialAdminPassword 在jenkins页面,输入登录名admin,然后复制文件中的一串字符,就是密码,进行登录 admin密码修改过后忘记的情况 进入目录 D:\jenkins\ ,打开文件 config.xml ,找到关键词  useSecurity ,把后面的值 true 改为false 重启jenkins 管理员运行 cmd(C:\Windows\Sy

oracle Can't connect to X11 window server using ':0.0' 解决方法

Can't connect to X11 window server using ':0.0' 解决方法 1. 以oracle 用户登陆X window 或者 2. root 身份执行 # xhost + oracle Can't connect to X11 window server using ':0.0' 解决方法

Ubuntu访问window下的磁盘分区出现“Error mounting /dev/sda5 at/media”错误的解决方法

我装ubuntu之前,电脑上安装了windows 10,为了装ubuntu,在window 10下的磁盘工具分配了30G的磁盘空间.安装完Ubuntu之后,访问window 10的磁盘分区出现“Error mounting /dev/sda5 at/media”的错误,拒绝访问. 解决方法: 用ntfsfix命令解决,首先这个命令依赖于ntfs-3g这个包,如果没有安装,首先要按照以下命令安装: sudo apt-get install ntfs-3g 然后一一用ntfsfix修复对应的分区,比

ajax请求成功后新窗口window.open()被拦截的解决方法

ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是该操作并不是用户主动触发的,所以它认为这是不安全的就拦截了(不过如果是 _self 的话就不会有这个限制),即使 ajax 回调函数中模拟执行 click 或者 submit 等用户行为(trigger('click')),浏览器也会认为不是由用户主动触发的,因此不能被安全执行,所以被拦截. 解决方法: 1.异步改为同步,即:async:false 2.将新开窗口指向为一个对象,然后修改对象的 ur

requestWindowFeature(Window.FEATURE_NO_TITLE)无效解决方法

今天在<第一行代码>上学习做自定义标题栏,需要将系统自带的标题栏隐藏掉,使用自定义的标题栏,结果发现,requestWindowFeature(Window.FEATURE_NO_TITLE); 这句代码无效,标题栏无法隐藏,可我以前都可以隐藏啊,今天怎么不可以了,最终发现是Activity的继承问题,我的代码是这样的 public class TitlebarActivity extends AppCompatActivity 可以看出我的Activity是继承自AppCompatActiv