非客户区 窗口自绘

2024-04-14 18:48
文章标签 窗口 客户 自绘

本文主要是介绍非客户区 窗口自绘,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在进行界面自绘时,一般都需要处理系统的边框,也就是所谓的非客户区,以前做界面时经常为这个问题发愁,那会摸索出了一种简单的方法:

让窗口根本就不存在非客户区,所有的绘制都在客户区里面,但是只会引入另外一个问题,如何实现窗口需要通过鼠标拉伸变化大小?CodeProject上面有个例子可供参考http://www.codeproject.com/KB/MFC/CustomWindow.aspx,里面的处理稍显麻烦,可以自己适当优化下。


另外一种方法是在研究QQ2009之后的界面时发现的,通过SPY可以看出其可拉伸的窗口属性为:

WS_EX_LEFT|WS_EX_LTRREADING|WS_EX_RIGHTSCROLLBAR|WS_EX_OVERLAPPEDWINDOW

WS_POPUP|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_SYSMENU|WS_THICKFRAME|WS_MAXIMIZEBOX|WS_MINIMIZEBOX

这里主要是有一个|WS_THICKFRAME,一般情况下有这个属性的窗口肯定会带有系统边框,即带有非客户区,通过SPY++也可以看出其客户矩形的左边不是从0开始的,且是可以通过鼠标拉伸大小的,但是QQ的窗口通过SPY查看会发现其客户区和窗口一样大小,这是为什么呢,显然其通过某种手段将非客户区干掉了,这时我们肯定会想到WM_NCCALCSIZE消息,没错就是这个消息,我们直接在接收到这个消息的地方返回0即可,在MSDN2008里面对这个消息没有说明可以直接返回0,但是在在线版MSDN文档里面有下面这段:

 

Starting with Windows Vista, removing the standard frame by simply returning 0 when the wParam is TRUE does not affect frames that are extended into the client area using the DwmExtendFrameIntoClientArea function. Only the standard frame will be removed.

 

 

剩下的只需在WM_NCHITTEST消息里面处理即可了。

具体实现可以参见下面这个例子:http://download.csdn.net/source/3130708

 

PS:写此文主要是最近看到网上很多开源的DirectUI库,想起当初刚工作那会的界面开发工作,确实学到了不少东西,在研究某个库时发现了WM_NCCALCSIZE直接返回0即可去掉系统非客户区,有趣的是在线版MSDN对这个有说明,而我的本地版没有,让我走了不少弯路啊

这篇关于非客户区 窗口自绘的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/903726

相关文章

高度内卷下,企业如何通过VOC(客户之声)做好竞争分析?

VOC,即客户之声,是一种通过收集和分析客户反馈、需求和期望,来洞察市场趋势和竞争对手动态的方法。在高度内卷的市场环境下,VOC不仅能够帮助企业了解客户的真实需求,还能为企业提供宝贵的竞争情报,助力企业在竞争中占据有利地位。 那么,企业该如何通过VOC(客户之声)做好竞争分析呢?深圳天行健企业管理咨询公司解析如下: 首先,要建立完善的VOC收集机制。这包括通过线上渠道(如社交媒体、官网留言

【Java算法】滑动窗口 下

​ ​    🔥个人主页: 中草药 🔥专栏:【算法工作坊】算法实战揭秘 🦌一.水果成篮 题目链接:904.水果成篮 ​ 算法原理 算法原理是使用“滑动窗口”(Sliding Window)策略,结合哈希表(Map)来高效地统计窗口内不同水果的种类数量。以下是详细分析: 初始化:创建一个空的哈希表 map 用来存储每种水果的数量,初始化左右指针 left

Vue3的Teleport:Teleport是Vue3的一个新功能,它允许我们将子组件渲染到父组件以外的地方,这在处理模态框、弹出窗口等情况时非常有用

I. Teleport 的概述 Teleport 的定义:   在 Vue 3.0 中,Teleport 是一个新的内置组件,它允许我们将任何部分的渲染内容 Teleport(传送)到 Vue 应用范围之外的地方。 换句话说,你可以控制片段,让它们在 DOM 中的任何位置渲染,而不仅仅是在当前组件内部。   Teleport 的效用和应用场景:   Teleport 的主要用途是处理在 UI

leetcode刷题(43)——239. 滑动窗口最大值

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值------------

CEM客户体验管理

客户体验管理(Customer Experience Management, CEM)智能系统是一种集成 的解决方案,可帮助企业跟踪、分析和管理客户与公司的所有交互,从而提高客户体验和满意度。 系统功能应用 该系统的主要功能有会话质检、客户培训、商品体验,售后体验,评价分析。 会话质检功能模块对机器人质检标签进行人工复检并编辑质检标签,添加人工标签也可以进行质检任务分派。 客服培训功能模块

【Qt笔记①】帮助文档、窗口、按钮、信号和槽、lambda表达式

学习第一天:2024-3-9 文章目录 Qt creator 快捷键帮助文档默认生成的main.cpp逐行解释核心类帮助文档的查阅方法-①代码创建按钮第一个第二个对窗口的其他设置 对象树窗口坐标系信号和槽(优点:松散耦合)帮助文档的查阅方法-②找信号函数的方法找槽函数的方法 自定义信号和槽 lambda表达式练习MenuTool Qt creator 快捷键 运行:ctrl

QT事件处理系统之二:窗口部件的事件拦截,以及事件的传递顺序

1、案例说明 在父窗口中为selfLineEdit窗口安装事件过滤器,这样我们可以在父窗口中首先拦截来自于selfLineEdit本身产生的事件,并且决定该事件最终是否继续传递到selfLineEdit窗口本身。 2、关键代码 selfLineEdit.cpp #include "selfLineEdit.h"#include <QDebug>selfLineEdit::selfLin

Python使用tkinter制作无边框透明时钟源码讲解(tkinter如何实现窗口无边框透明)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 导入必要的库📝 创建主窗口🎯 去掉窗口边框🎯 设置窗口透明度🎯 允许窗口背景透明🎯 设置窗口背景颜色为透明🎯 设置窗口位置🎯 创建用于显示时间的标签 📝 更新时间函数📝 使窗口可移动📝 设置窗口置顶📝 完整代码 ⚓️ 相关链接 ⚓️ 📖 介绍 📖 在项目开发中,有时我们需要创建无边

关于VC6 MFC使用Gdiplus实现自绘按钮的总结

步骤1:简易教程(更换对话框的背景)及Gdiplus下载地址可查看这个博客https://blog.csdn.net/misads/article/details/78619735。 步骤2:使用Gdiplus实现自绘按钮可参考这个博客https://blog.csdn.net/wyansai/article/details/50971959。 首先感谢上面两位博主的分享,那么我写这个博客是干

独立看门狗窗口开门狗

独立看门狗 接线图:按键用于阻塞喂狗。独立看门狗&窗口开门狗接线一样。 第一步,是开启时钟了,只有这个LSI时钟开启了独立看门狗才能运行,所以初始化独立看门狗之前,LSI必须得开启,但是这个开启LSI的代码并不需要我们来写,我们看一下手册6.2.9。 下一步我们就是写入预分频器和重装寄存器了,当然在写入这两个寄存器之前,不要忘了这里的写保护,首先写入这个键值0X5555解除写保护,然