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

技术标签: 无边框窗口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

智能推荐

Redis 命令-程序员宅基地

文章浏览阅读166次。Redis 命令Redis 命令用于在 redis 服务上执行操作。要在 redis 服务上执行命令需要一个 redis 客户端。Redis 客户端在我们之前下载的的 redis 的安装包中。语法Redis 客户端的基本语法为:$ redis-cli实例以下实例讲解了如何启动 redis 客户端:启动 redis 客户端,打开终端并输入命令 redis-cli。该命

个人笔记5-程序员宅基地

文章浏览阅读372次。个人笔记

POJ 2965 The Pilots Brothers' refrigerator (枚举)-程序员宅基地

文章浏览阅读955次。POJ 2965 The Pilots Brothers' refrigerator (枚举)

信驰达BLE 5.0低功耗蓝牙模块使用 (AT指令串口透传) RSBRS02ABR_蓝牙5.0能被串口助手检测到吗-程序员宅基地

文章浏览阅读1.5k次。信驰达蓝牙模组信驰达透传固件功能特点:使用简单,无需任何蓝牙协议栈应用经验;支持蓝牙 5.0 协议栈。价格便宜,价格便宜,价格便宜 (重要的事情只说三遍)1. 环境准备1.1 硬件环境USB转TTL 1个 + 杜邦线 6 根RSBRS02ABR 模块 1个 1.2软件准备准备驱动安装包CP210x_Universal_Windows_Driver:准备串口调试助手工具UartAssist : 下载链接准备手机APP:nRf-Connect _蓝牙5.0能被串口助手检测到吗

程序员练级攻略(转自coolshell 陈皓)-程序员宅基地

文章浏览阅读1.1k次,点赞2次,收藏8次。前言你是否觉得自己从学校毕业的时候只做过小玩具一样的程序?走入职场后哪怕没有什么经验也可以把以下这些课外练习走一遍(朋友的抱怨:学校课程总是从理论出发,作业项目都看不出有什么实际作用,不如从工作中的需求出发)建议:不要乱买书,不要乱追新技术新名词,基础的东西经过很长时间积累而且还会在未来至少10年通用。回顾一下历史,看看历史上时间线上技术的发展,你才能明白明天会是什么样。一

什么是机器学习,一文让你了解机器学习的历史和真谛-程序员宅基地

文章浏览阅读2.1w次,点赞19次,收藏58次。作者:计算机的潜意识在本篇文章中,我将对机器学习做个概要的介绍。本文的目的是能让即便完全不了解机器学习的人也能了解机器学习,并且上手相关的实践。这篇文档也算是 EasyPR开发的番外篇,从这里开始,必须对机器学习了解才能进一步介绍EasyPR的内核。当然,本文也面对一般读者,不会对阅读有相关的前提要求。在进入正题前,我想读者心中可能会有一个疑惑:机器学习有什么重要性,以至于要阅读完

随便推点

IDEA异常 cannot resolve symbol 'HttpServletRequest'-程序员宅基地

文章浏览阅读1.2w次,点赞15次,收藏14次。IDEA异常 cannot resolve symbol ‘HttpServletRequest’如图一在IDEA出现的问题,java编辑器找不到HttpServletRequest包,只需将tomcat中的库倒进来即可如图二。步骤file->project structure->modules->选择对应的项目->dependencies->右侧加号libraries->添加tomcat的libr

拦截器interceptors基本介绍-程序员宅基地

文章浏览阅读3k次。拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行.同时也是提供了一种可以提取action中可重用的部分的方式.拦截器必须是无状态的,不能保证为每一个请求或者action创建一个实例.拦截器可以选择短路一个action调用,然后返回一个结果码(如com.opensymphony.xwork_interceptors

视觉SLAM中动态场景剔除总结_视觉slam怎么去除动态特征点-程序员宅基地

文章浏览阅读5k次,点赞2次,收藏26次。目前看了两篇论文总结一下:DS-SLAM A Semantic Visual SLAM towards dynamic environments (2018):这篇文章基于ORB_SLAM2, 利用帧间图像的光流跟踪,进行一致性检验(利用了基础矩阵,判断点极线距离的大小),找到运动的像素点。同时另开辟一个线程做Segmet 场景语义分割(只能分割20种物体),认为人是可能运动的物体,如果运动的..._视觉slam怎么去除动态特征点

单源最短路径SSSP之Bellman-Ford算法-程序员宅基地

文章浏览阅读722次。Bellman-Ford算法和Dijkstra算法都是求解图的最短路径的算法。Bellman是求单源点到各个顶点的最短路径,适用条件为有向或无向图,权重可为负值。当存在负权环路时,算法返回一个false值。该算法效率比较低,需要对边进行 |V|- 1 次松弛操作Bellman-Ford算法寻找单源最短路径的时间复杂度为O(V*E)。(V为给定图的顶点集合,E为给定图的边集合)两者区别在于:..._sssp

Upgrade Oracle Database 11.1.0 to 12.1.0 for EBS R12.1.3_ins-32016-程序员宅基地

文章浏览阅读1.7k次。vm oracle linux7 安装 Oracle E-Business 12.1说明:在执行下面步骤之前,需要提前申请oracle账号,下载12.1介质。注册oracle账号链接:http://metalink.oracle.com/oracle linux7 和Oracle E-Business 12.1下载链接:https://edelivery.oracle.com文章目录vm oracle linux7 安装 Oracle E-Business 12.1一、操作系统要求1.1、在 v_ins-32016

第二章思维导图_今天的作业,自己绘制第二章有理数的思维导图,发到老师的作业小程序-程序员宅基地

文章浏览阅读572次。_今天的作业,自己绘制第二章有理数的思维导图,发到老师的作业小程序

推荐文章

热门文章

相关标签