WTL中最简单的实现窗口拖动的方法(转)

目前,很多基于对话框的应用程序中对话框都是不带框架的,也就是说对话框没有标题栏。众所周知,窗口的移动都是通过鼠标拖动窗口的标题栏来实现的,那么现在应用程序中的对话框没有了标题栏,用户如何移动对话框呢?本实例针对这个问题提出解决的办法。

一、实现方法

解决无标题栏窗口的拖动问题有两种方案,一种方案是使用常规思路来处理鼠标拖拽事件,当窗口获得WM_LBUTTONDOWN(OnLButtonDown)时,通过设置标志并调用CWnd::SetCapture()函数来让当前窗口捕捉鼠标消息,应用程序进入移动模式,此时只要有WM_MOUSEMOVE消息过来,就可以据此移动框架窗口,最后当用户释放鼠标按钮,则WM_LBUTTONUP消息处理例程清除标志并调用CWnd::ReleaseCapture()函数将鼠标控制返还给Windows。这种方法比较繁琐,首先要决定窗口准备移到哪?然后要想好如何重绘窗口等等,而且根据屏幕显示属性对话框”效果”页中”视觉效果”项的”拖动时显示窗口中内容”复选框是不是选中,拖动效果是不同的。那么你怎么知道设置的信息呢?方法是调用SystemParametersInfo(SPI_GETDRAGFULLWINDOWS)。Windows要程序员来事无巨细地处理这些繁琐的事情真是太糟了。

由于Windows本身知道通过鼠标点住标题栏可以移动窗口,那么能不能将鼠标在窗口客户区任何地方的点击拖动行为都模仿成好像是在标题栏中一样呢?答案是肯定的,这样就产生了第二种拖动窗口移动的方法。实际上,用鼠标点住对话框背景进行拖动操作并不难,但是你必须了解在标题栏里拖动窗口的原理。Windows首先确定鼠标点中了哪个窗口,然后向那个窗口发送一个WM_NCHITTEST消息找出此窗口的哪个”非客户区”(如边界、最大化/最小化按钮、菜单、标题等等)拥有鼠标光标。接着默认的窗口过程响应消息并返回一个特定的代码。如果鼠标指针落在标题栏中,那么这个特定代码就是HTCAPTION,此时Windows便进入拖拽模式,以便用户能够对窗口进行移动操作。所以要想在客户区里用鼠标拖动对话框,那么只要在客户区里模仿标题栏里的鼠标拖动行为即可。下面的代码通过处理WM_NCHITTEST消息实现了对话框的拖动操作:

上面这个代码很容易理解,当鼠标落在客户区内,函数返回HTCAPTION。对于一个简单的对话框来说,仅仅用这个代码就完全可以实现在对话框背景内的拖动操作。因为Windows使用z-order坐标来确定鼠标下是哪个窗口,所以对话框中其它的所有对象照常工作。如果用户单击某个控制,只要这个控制不是静态位图图像或者文本,那么Windows都将鼠标事件发送到该控制上,而不是对话框。由于静态位图图像或者文本对于对话框是透明的,所以鼠标在上面的拖动同样实现移动,而对于对话框中的编辑框、按钮、组合框等其它非静态控制则按通常的行为方式运行。

Original: https://www.cnblogs.com/qq78292959/p/4722123.html
Author: 一个人的天空@
Title: WTL中最简单的实现窗口拖动的方法(转)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/546937/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • flutter创建项目

    一、终端方式 1、创建flutter项目: 出现: 2、先直接打开Xcode自带iOS模拟器,否则会运行在macOS (macos)或Chrome (chrome)上。 3、运行项…

    技术杂谈 2023年6月1日
    066
  • flowable 流程的表单设计器 动态表单 ExtJs GridPanel 动态生成表单

    Original: https://www.cnblogs.com/rgqancy/p/15943810.htmlAuthor: 任国强Title: flowable 流程的表单设…

    技术杂谈 2023年6月1日
    095
  • RPM -U 升级机制探索

    今天被RPM升级机制狠狠的阴了一把,差点没过来,趁着热乎赶紧记录下来,已被后用。 RPM包有升级机制(Upgrade), 使用-U 参数。这点我之前略有耳闻,知道的并不详细。 先说…

    技术杂谈 2023年6月1日
    087
  • Python基本语法学习

    CSN Python学习作业 Python的变量不需要声明,但每个变量在使用前都必须赋值。在Python中,变量就是变量,它没有所谓的”类型”一说 Pyth…

    技术杂谈 2023年7月11日
    067
  • 机器学习(4)特征值的处理之归一化,标准化

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/cgy1995/p/9982882.htmlAuthor…

    技术杂谈 2023年7月23日
    065
  • 蓝桥杯——校内模拟题目分析

    蓝桥杯——校 内模拟题目分析 (顺序有可能会有点乱,不要信上面填的答案,看解析,后面附有答案) 1 这道题就不用多说了吧,计算机的单位之间进制为2 的10 次方 所以答案为: 15…

    技术杂谈 2023年7月23日
    065
  • MAT(Memory Analyzer Tool)工具入门介绍(转)

    1、MAT是什么? MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内…

    技术杂谈 2023年5月30日
    098
  • 阿里云有奖体验:块存储快速入门

    实验简介 场景将提供一台配置了CentOS 7.7版本的ECS实例(云服务器)和两块高效云盘的数据盘。通过本教程的操作,您可以通过阿里云控制台和Linux操作系统,快速入门块存储。…

    技术杂谈 2023年7月11日
    059
  • 分布式理论—-CAP理论与Base理论

    CAP 理论 【1】CAP 理论指出对于一个分布式计算系统来说,不可能同时满足以下三点: 1)一致性:在分布式环境中,一致性是指数据在多个副本之间是否能够保持一致的特性,等同于所有…

    技术杂谈 2023年7月23日
    078
  • 假如,程序员面试的时候说真话

    做程序员这么长时间了,经常能够听到一句话:面试造火箭,入职拧螺丝。而且,随着就业环境越来越卷,现在只会造火箭恐怕都不行了,得能造个空间站才行。 回想自己刚毕业那会儿,哪有什么八股文…

    技术杂谈 2023年6月21日
    090
  • 51单片机——蓝牙远程点灯

    一、HC-05蓝牙模块 HC-05是主从一体的蓝牙串口模块,使用起来非常之方便,当HC-05与其他蓝牙设备连接成功后,使用方法与串口没什么差别,当然HC-05要跟你的单片机串口连接…

    技术杂谈 2023年5月31日
    068
  • DAX:表值函数 VALUES、DISTINCT和FILTERS

    表值函数 VALUES, DISTINCT 都用于返回一列的唯一值,唯一的区别是:VALUES()会额外添加一个BLANK。当使用VALUES函数从一个关联表中获取唯一值时,如果某…

    技术杂谈 2023年5月31日
    084
  • PHP获取cookie、Token、模拟登录、抓取数据、解析生成json

    本文介绍使用PHP获取cookie,获取Token、以及模拟登录、然后抓取数据、最后解析生成json的的过程。 设置Cookie路径 1、打开页面,获取COOKIEJAR,以及 t…

    技术杂谈 2023年5月31日
    083
  • 上周热点回顾(7.25-7.31)

    热点随笔: · 手把手带你实现基于 Vite+Vue3 的在线Excel表格系统 (葡萄城技术团队)· 使用Three.js实现炫酷的赛博朋克风格3D数字地球大屏 🌐 (Drago…

    技术杂谈 2023年5月31日
    074
  • 复杂度分析

    复杂度 复杂度分析是数据结构与算法的核心精髓,指在不依赖硬件、宿主环境、数据集的情况下,粗略推导,考究出算法的效率和资源消耗情况, 包括时间复杂度和空间复杂度 时间复杂度 首先从C…

    技术杂谈 2023年7月23日
    065
  • 如何将Excel中数据前的空格去除

    我们在工作中有时会碰到格式不统一的数据,这时会需要将数据前的空格去除,那么该如何操作呢? 下面小编就来具体介绍一下步骤吧~ Original: https://www.cnblog…

    技术杂谈 2023年5月31日
    0115
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球