用了WS_EX_LAYERED 后所有Twincontrl的wm_paint消息会停止(官方Layered Windows文档很多内容)good

fmx 和 vcl 不一样, fmx 的阴影可以通过2D显示出来。 VCL 无标题栏窗口的阴影很麻烦

280425268

我也是用两个窗口做阴影,并重绘了非客户区,不过阴影是基础自TwinControl,没继承TFrom。用spy探测office 2013,发现他也是用了2个句柄window,office 2013阴影也是一个有句柄的window做的,而QQ只用了一个窗口,使用WS_EX_LAYERED风格,阴影和界面全在一个窗口画出来

两个窗口怎么叠加??自己窗口不用的原因是因为,不能影响当前窗口的子控件的绘制??
不是两个窗口叠加,是WS_EX_LAYERED 阴影窗口跟随目标窗口,跟随移动、改变尺寸

在Form的后面再放一个TWinControl?这个TWinControl是怎么显示的?有没有可能会被单独关掉?
用api SetWindowPos显示

fmx不用这么干,fmx和qq的类型一样,可以直接画,因为fmx的控件都是画出来的,用WS_EX_LAYERED不受影响,而vcl用了WS_EX_LAYERED 后所有Twincontrl的wm_paint消息会停止,Twincontrl控件不会再画出来了
Twincontrl 收不到wm_paint,摆在上面的非win控件也不会绘制,所以vcl窗口改成WS_EX_LAYERED风格后,窗口会一片空白,什么控件都不显示
正是因为windows窗口 WS_EX_LAYERED半透明的机制才导致了两种阴影方案,一种是以句柄为基础的的ui框架像vcl,office 需要用用另外一个WS_EX_LAYERED窗口绘制阴影,只用一个WS_EX_LAYERED窗口的话上边的句柄控件显示不出来。 另一种就是fmx,qq这种所有控件都是自己画出来的ui框架,没有WS_EX_LAYERED显示不出句柄控件的烦恼,只用一个WS_EX_LAYERED窗口在这上面做阴影就行

setWindowOpacity()设置透明度的
setAttribute(Qt::WA_TranslucentBackground,true); 设置透明的

官方文档:
https://msdn.microsoft.com/en-us/library/ms997507.aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/ff700543(v=vs.85).aspx


搜索“WS_EX_LAYERED”一大堆资料
http://stackoverflow.com/questions/10513716/creating-a-transparent-child-window-on-top-of-non-transparent-parent-window-wi
https://github.com/DmitrySikorsky/StarryNight
http://www.programering.com/a/MzNxkTNwATY.html
https://forum.powerbasic.com/forum/user-to-user-discussions/powerbasic-for-windows/40049-making-a-childwindow-transparent-or-combining-ws_ex_layered-with-ws_child
https://weseetips.wordpress.com/tag/ws_ex_layered/
http://stackoverflow.com/questions/19951379/ws-ex-layered-invisible-window-and-a-fresh-install-of-windows

posted @ 2017-01-19 16:40  findumars  Views(1205)  Comments(0Edit  收藏  举报