Update comments.

Make it more clearly.

Signed-off-by: Yuhang Zhao <2546789017@qq.com>
This commit is contained in:
Yuhang Zhao 2020-04-20 21:30:01 +08:00
parent 11f04ca255
commit 21bceb088a
1 changed files with 28 additions and 25 deletions

View File

@ -424,33 +424,36 @@ bool WinNativeEventFilter::nativeEventFilter(const QByteArray &eventType,
switch (msg->message) {
case WM_NCCALCSIZE: {
// Windows是根据这个消息的返回值来设置窗口的客户区窗口中真正显示的内容
// 和非客户区标题栏、窗口边框、菜单栏和状态栏等Windows提供的部分不过对
// 于Qt来说除了标题栏和窗口边框非客户区基本也都是自绘的的范围的
// lParam里存放的就是新客户区的几何区域默认是整个窗口的大小因此如果我
// 们在这个消息中不修改lParam就可以使客户区充满整个窗口从而去掉标题
// 栏和窗口边框(因为这些东西都被客户区盖住了。但边框阴影也会因此而丢失,不
// 过我们会使用其他方式将其带回)。但有个情况要特别注意,那就是窗口最大化/
// 全屏后,窗口的实际尺寸会比屏幕的尺寸大一点,从而使用户看不到窗口的边界,
// 这样用户就不能在窗口最大化后调整窗口的大小了(虽然这个做法听起来特别奇怪,
// 但Windows确实就是这样做的因此如果我们要自行处理窗口的非客户区就要
// 在窗口最大化后,将窗口边框的宽度和高度(一般是相等的)裁剪掉,否则我们窗
// 口所显示的内容就会超出屏幕边界,显示不全。
// 如果用户开启了任务栏自动隐藏,在窗口最大化后,还要考虑任务栏的位置。如果
// 窗口最大化后其尺寸和屏幕的可用尺寸裁去任务栏后的尺寸相等Windows
// 会认为窗口已经进入全屏的状态,从而导致自动隐藏的任务栏无法弹出。要避免这
// 个状况,就要使窗口的尺寸小于屏幕的可用尺寸。我下面的做法,参考了火狐和
// Chromium自己测了几次没发现什么问题。如果没有开启任务栏自动隐藏
// 没有这个问题的。
// 和非客户区标题栏、窗口边框、菜单栏和状态栏等Windows系统自行提供的部分
// 不过对于Qt来说除了标题栏和窗口边框非客户区基本也都是自绘的的范
// 围的lParam里存放的就是新客户区的几何区域默认是整个窗口的大小正常
// 的程序需要修改这个参数,告知系统窗口的客户区和非客户区的范围(一般来说可
// 以完全交给Windows让其自行处理使用默认的客户区和非客户区因此如果
// 我们不修改lParam就可以使客户区充满整个窗口从而去掉标题栏和窗口边框
// (因为这些东西都被客户区给盖住了。但边框阴影也会因此而丢失,不过我们会使
// 用其他方式将其带回,请参考其他消息的处理,此处不过多提及)。但有个情况要
// 特别注意,那就是窗口最大化后,窗口的实际尺寸会比屏幕的尺寸大一点,从而使
// 用户看不到窗口的边界,这样用户就不能在窗口最大化后调整窗口的大小了(虽然
// 这个做法听起来特别奇怪但Windows确实就是这样做的因此如果我们要自行
// 处理窗口的非客户区,就要在窗口最大化后,将窗口边框的宽度和高度(一般是相
// 等的)从客户区裁剪掉,否则我们窗口所显示的内容就会超出屏幕边界,显示不全。
// 如果用户开启了任务栏自动隐藏,在窗口最大化后,还要考虑任务栏的位置。因为
// 如果窗口最大化后,其尺寸和屏幕尺寸相等(因为任务栏隐藏了,所以窗口最大化
// 后其实是充满了整个屏幕变相的全屏了Windows会认为窗口已经进入全屏的
// 状态,从而导致自动隐藏的任务栏无法弹出。要避免这个状况,就要使窗口的尺寸
// 小于屏幕尺寸。我下面的做法参考了火狐和Chromium。但是如果没有开启任务
// 栏自动隐藏,是不存在这个问题的,所以要先进行判断。
// 一般情况下,*result设置为0相当于DefWindowProc的返回值为0就可以了
// 根据MSDN的说法返回0意为此消息已经被程序自行处理了让Windows跳过此消
// 息否则Windows会添加对此消息的默认处理标题栏和窗口边框又会回来这当
// 然不是我们想要的结果。根据MSDN当wParam为FALSE时只能返回0但当其为
// TRUE时可以返回0也可以返回一个WVR_XXX常量。根据Chromium的注释
// 存在非客户区时如果返回WVR_REDRAW会导致子窗口/子控件出现奇怪的bug
// 自绘控件错位或停止刷新并且Lucas在Windows 10上成功复现说明这个
// bug至今都没有解决。因为这个是Windows自身的bug且已经存在很久这种情
// 况下只有返回0才能规避这个问题。但如果不存在非客户区且wParam为TRUE
// 最好返回WVR_REDRAW否则窗口在调整大小可能会产生严重的闪烁现象。
// 息否则Windows会添加对此消息的默认处理对于当前这个消息而言就意味着
// 标题栏和窗口边框又会回来这当然不是我们想要的结果。根据MSDN当wParam
// 为FALSE时只能返回0但当其为TRUE时可以返回0也可以返回一个WVR_常
// 量。根据Chromium的注释当存在非客户区时如果返回WVR_REDRAW会导致子
// 窗口/子控件出现奇怪的bug自绘控件错位并且Lucas在Windows 10上成
// 功复现说明这个bug至今都没有解决。因为这个是Windows自身的bug且已经
// 存在很久这种情况下只有返回0才能规避这个问题。但如果不存在非客户区
// wParam为TRUE最好返回WVR_REDRAW否则窗口在调整大小可能会产生严重的
// 闪烁现象。
// 虽然对大多数消息来说返回0都代表让Windows忽略此消息但实际上不同消息
// 能接受的返回值是不一样的请注意自行查阅MSDN。