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

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

  1. 编写Java程序,在硬盘中选取一个 txt 文件,读取该文档的内容后,追加一段文字“[ 来自新华社 ]”,保存到一个新的 txt 文件内

    查看本章节 查看作业目录 需求说明: 在硬盘中选取一个 txt 文件,读取该文档的内容后,追加一段文字"[ 来自新华社 ]",保存到一个新的 txt 文件内 实现思路: 创建 Sa ...

  2. 窗体的Alpha通道透明色支持(一旦 Form 被定义为利用 LayeredWindow ,窗口的绘图不再响应沿用多年的 WM_Paint 消息)

    参考: http://www.delphibbs.com/delphibbs/dispq.asp?lid=2190768 Windows 2000后,为了支持类似MAC界面的Alpha通道混合效果,提 ...

  3. 产生WM_PAINT 消息

    UpdateWindow会检查窗口的Update Region,当其不为空时才发送WM_PAINT消息:RedrawWindow则给我们更多的控制:是否重画非客户区和背景,是否总是发送WM_PAINT ...

  4. Invalidate(TRUE)与Invalidate(FALSE)区别(前者会发送WM_ERASEBKGND消息全部刷新,然后使用WM_PAINT消息绘制,而后者只发送WM_PAINT消息)

    使用Invalidate(TRUE)函数时,它会向消息队列中添加了WM_ERASEBKGND和WM_PAINT两个消息. 使用Invalidate(FALSE)函数时,它只会向消息队列中添加了WM_P ...

  5. WM_PAINT消息小结

    WM_PAINT是Windows窗口系统中一条重要的消息,应用程序通过处理该消息实现在窗口上的绘制工作. 1. 系统何时发送WM_PAINT消息? 系统会在多个不同的时机发送WM_PAINT消息:当第 ...

  6. WM_PAINT消息在窗口重绘的时候产生,那什么时候窗口会重绘(异步工作方式效率高、灵活性强,还有UpdateWindow和RedrawWindow帮忙)

    Q:wm_paint消息在窗口重绘的时候产生,那什么时候窗口会重绘?? A: 严格地说,只有当收到WM_PAINT消息后窗口会重绘 但是引起这个消息的事件有很多, 比如:1.首次创建 2.移动 3.改 ...

  7. 终于懂了:TWinControl.DefaultHandler里的CallWindowProc(FDefWndProc)还挺有深意的,TButton对WM_PAINT消息的处理就是靠它来处理的(以前不明白为什么总是要调用inherited,其实就是没有明白TWinControl.DefaultHandler的真正用处)

    我忽然发现:TButton既没有处理WM_PAINT,又没有Paint()或者PaintWindow(),那么它是什么时候被绘制的? Form1上放2个TButton,然后设置代码: procedur ...

  8. atlwin中不停发WM_PAINT消息原因分析

    这里我们基于atlwin定义的窗口类SampleWindow继承自CWindowImpl(定义见atlwin.h),并注册了WM_PAINT消息处理函数OnPaint,注意,我们在OnPaint函数中 ...

  9. 06 Windows编程——设备句柄 和 WM_PAINT消息

    windows程序在现实方式上属于图形方式,和文字方式的显示,有显著的不同. 什么是设备句柄,如何获取 使用统一的数据结构表示某一设备,这个结构就是设备句柄. 源码 #include<Windo ...

随机推荐

  1. php redis操作具体解释

    phpredis是redis的php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系 非常实用;下面是redis官方提供的命令使用技巧: 下载地址例如以下: https://gith ...

  2. MySQL分区表使用方法

    原文:MySQL分区表使用方法 1. 确认MySQL服务器是否支持分区表 命令: show plugins; 2. MySQL分区表的特点 在逻辑上为一个表,在物理上存储在多个文件中 HASH分区(H ...

  3. Android之消息推送实现

    在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是Android平台上实现起来却相 ...

  4. session_start()的逻辑

    //session_start -Start new or resume existing session session_start(); print_r($_SESSION); //看有没有ses ...

  5. 在.net core项目中想使用类似iis上面虚拟目录的功能

    事实上iis是不支持.net core mvc项目虚拟目录的.你在iis上发布网站 然后在wwwroot目录上创建虚拟目录,指向硬盘其他位置上的文件夹,是不会有效果的. 正确的处理方式应该是修改静态文 ...

  6. RHEL 6和RHEL 7(CentOS 6和CentOS 7)恢复ROOT密码

    RedHat 6恢复Root密码: 1.启动RedHat 6的时候在这个界面按任意键 2.出现如下界面,按 e 3.出现如下界面,选择第二个--kernel,然后再按 e 4.出现如下界面,输入 空格 ...

  7. 注册.NET Framework 到IIS服务器

    一.注册.NET 4.0 32位的Windows:--------------------------------------------------------------------------- ...

  8. jquery li练习2-恢复链条

    <!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  9. 插入2D点,在WPF中使用Bezier曲线

    原文Interpolate 2D points, usign Bezier curves in WPF Interpolate 2D points, usign Bezier curves in WP ...

  10. Mvvm Light Toolkit 入门

    原文:Mvvm Light Toolkit 入门 前言 之前学习UWP的时候就一直看到有关MVVM的资料但是一直没有系统的去学,最近正好有时间,特地来攻破这个点,顺便学习一下VS与GitHub的链接和 ...