[MFC] 无边框窗口的Resize拖动效果的实现(下):子窗口覆盖,导致主窗口热点区无法响应WM_NCHITTEST_felicityWSH的博客-程序员秘密

技术标签: 无边框窗口Resize  MFC  不响应WM_NCHITTEST  

这篇博文讲解了如何实现 无边框窗口的Resize拖动效果,文中提到,需要响应主窗口的WM_NCHITTEST消息,检测鼠标是否在resize热点区并返回HTTOPLEFT、HTBOTTOM等相应的结果。

但是,如果子窗口覆盖了主窗口的热点区,当鼠标在热点区移动时,主窗口是无法收到WM_NCHITTEST消息的。比如图中所示的窗口,主窗口只有蓝色的resize区域能响应WM_NCHITTEST,其他几个resize区域的鼠标消息均会被分发到子窗口中:

有什么解决办法?

1、子窗口消息分发
这种方法比较容易想到,在子窗口中响应到WM_NCHITTEST后,判断自己是否处于主窗口的resize热点区,是的话就把消息通知给主窗口。
但是这种方法很麻烦,会覆盖resize区的窗口类型太多了:CDialog,CWnd。既有窗口、也有控件。虽然都可以在基类中处理WM_NCHITTEST,但还是麻烦。

2、悬停Popup类型的半透明窗口
创建四个Popup类型的透明窗口,将四个窗口始终悬停在主窗口的四个边上,并使其窗口Z序高于主窗口。在这四个窗口中处理光标的检测(HTTOPLEFT、HTBOTTOM等对应的光标状态)、鼠标左键按下和resize的逻辑,如果用户在半透明窗口中按下左键并移动,则在计算移动的尺寸后,更新主窗口的桌面位置、宽高,即可实现主窗口的resize效果。四个窗口之所以使用半透明,是为了不让用户感受到其存在。但是注意,四个窗口不能完全透明,否则无法响应鼠标事件(可以将其alpha设为1)。

如何创建四个半透明的Popup窗口?关键词:WS_EX_LAYERED + SetLayeredWindowAttributes。如果还不懂WS_EX_LAYERED属性,可以参考 这篇博文

如上所述,方法2中,实际上提出了一种新的实现无边框窗口的Resize方法。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/felicityWSH/article/details/71514562

智能推荐

最详细的ECLIPSE Android SDK下载安装及配置教程_eclipse安装android sdk_ba_wang_mao的博客-程序员秘密

最近Neo突发神经,想要将学过的一些计算机视觉、机器学习中的算法都放到移动设备上去跑跑,因为移动开发是大势所趋嘛,希望能够通过这样一个实践的过程,找到一些新的灵感(该不会是为了赚钱吧…),我自己目前也有一些idea,然后也希望以后能够进行计算机视觉、机器学习方面的创业,如果有志同道合的朋友可以一起交流交流(可通过邮箱:[email protected])。既然要做计算机视觉的移动开发,那么就要考虑是做ios还是Android了。。当然还有winphone的。一直想做ios的开发,无奈啊,手头有iP

HDU 1541 Stars 树状数组简单应用_ACBOY、的博客-程序员秘密

点击打开链接StarsTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5140    Accepted Submission(s): 2020Problem DescriptionAstr

redis设置过期时间1_redis设置随机过期时间_达文西不辅助的博客-程序员秘密

​​​​​​​java操作Redis缓存设置z过期时间转载:java操作Redis缓存设置过期时间 - liuminchao - 博客园关于Redis的概念和应用本文就不再详解了,说一下怎么在java应用中设置过期时间。在应用中我们会需要使用redis设置过期时间,比如单点登录中我们需要随机生成一个token作为key,将用户的信息转为json串作为value保存在redis中,通常做法是://生成tokenString token = UUID.randomUUID().t..

Delmia Com二次开发_沐雨潇竹的博客-程序员秘密

通过Com 通讯方法对Delmia进行操作完成以下工作1、初始化Delmia放在环境,保证环境标准化。2、完成对仿真中的机器人进行操作,自动创建机器人Object TCP 等所有默认配置病完成设定的Taglist 和文件路径的个方面设置,大量节约时间操作界面如下图:程序头引用using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tas

java中方法引用_开始使用Java中的方法引用_cxu0262的博客-程序员秘密

java中方法引用 Java SE 8与lambda一起带来了对Java语言的方法引用。 本教程简要概述了Java中的方法引用,然后通过Java代码示例开始使用它们。 到本教程结束时,您将了解如何使用方法引用来引用类的静态方法,绑定和未绑定的非静态方法以及构造函数,以及如何使用它们来引用超类和当前类中的实例方法。类型。 您还将了解为什么许多Java开发人员采用lambda表达式和方法引用作为匿名...

随便推点

常用SQL语句实例 5_weixin_34342207的博客-程序员秘密

为什么80%的码农都做不了架构师?>>> ...

java指定目录创建文件,Java - 创建新文件,如何使用方法指定目录?_王永豪的博客-程序员秘密

I know how to write a file to a specified directory by doing this:public void writefile(){try{Writer output = null;File file = new File("C:\\results\\results.txt");output = new BufferedWriter(new File...

使用Jgit操作git过程中遇到的问题_skye-深蓝的博客-程序员秘密

一、JGit有效的链接JGit使用ssh及http(s)2中方式,链接git仓库:https://www.codeaffine.com/2014/12/09/jgit-authentication/二、切换分支遇到的问题1.org.eclipse.jgit.api.errors.NoHeadException: Cannot checkout from unborn bra...

jsonviewer_weixin_34192816的博客-程序员秘密

http://www.bejson.com/jsonviewernew/

核电工程能源行业案例 | 达索系统百世慧_达索系统百世慧的博客-程序员秘密

在设计阶段加强各专业(系统、土建和设备等)的协同和沟通,加强设计、采购、施工、调试各业务板块的协同,成为全球核电 EPC 工程公司的领导者。NIAEP 应用达索系统( DS )的 3D EXPERIENCE( 3 维体验平台) 实现了整合不同设计工具的跨专业协同设计,打造了统一的核电站 3D 设计成果(数字样机 DMU ),同时应用达索的应用程序 CATIA,ENOVIA 和 DELMIA 创新发明了 Multi-D (多维)施工技术,提高了设计质量,并将 3D 设计成果应用在施工阶段,基于 3D 模型进行

第十六讲:达索系统Delmia制造运营转型网络研讨会 | 达索系统百世慧_达索系统百世慧的博客-程序员秘密

DELMIA 由 3DEXPERIENCE 平台提供技术支持,可帮助各种行业的从业者和服务提供商将价值网络的虚拟世界与真实世界联系在一起,以开展协作、建模和优化,随后将成果付诸执行。卓越运营需要整个价值网络的协调一致。DELMIA 提供的解决方案可将建模和仿真的虚拟世界运用于真实的运营之中,为价值网络中的各方相关人员提供完整的解决方案,包括供应商、制造商、物流和运输提供商到服务运营商和工作团队。**如何有效结合工业设备企业现有流程,以较少的代价换取更高效的数字化应用,是当下许多制造企业所关注的焦点。**本次

推荐文章

热门文章

相关标签