Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 最大化状态下空气动力学捕捉过大的无边界窗口_C++_Qt_Aero_Borderless_Aero Snap - Fatal编程技术网

C++ 最大化状态下空气动力学捕捉过大的无边界窗口

C++ 最大化状态下空气动力学捕捉过大的无边界窗口,c++,qt,aero,borderless,aero-snap,C++,Qt,Aero,Borderless,Aero Snap,我正在尝试在Qt5.6.0中创建一个无边界窗口,带有aero snap功能。 一切都正常,除了当我最大化窗口时:它太大了 我的屏幕分辨率为2560x1440,因此窗口大小应为2560x1400(任务栏为40像素),但在WM_SIZE消息中,新大小为2576x1416。 因此,窗口在每个方向上正好有8个像素太大。 这也意味着窗口没有在左上角对齐,它在两个方向上离屏幕正好8像素 我找不到这个问题的解决方案,我尝试过的所有方法都不起作用,并且会导致bug 唯一可以解决这一问题的方法是删除WS_CAPT

我正在尝试在Qt5.6.0中创建一个无边界窗口,带有aero snap功能。 一切都正常,除了当我最大化窗口时:它太大了

我的屏幕分辨率为
2560x1440
,因此窗口大小应为
2560x1400
(任务栏为40像素),但在
WM_SIZE
消息中,新大小为
2576x1416
。 因此,窗口在每个方向上正好有8个像素太大。 这也意味着窗口没有在左上角对齐,它在两个方向上离屏幕正好8像素

我找不到这个问题的解决方案,我尝试过的所有方法都不起作用,并且会导致bug

唯一可以解决这一问题的方法是删除
WS_CAPTION
WS_THICKFRAME
样式,但这样我就失去了areo快照功能

我不得不告诉Qt或DWM将窗口缩小16个像素,并将其向右移动8个像素,然后向下移动。有人知道怎么做吗

我不得不告诉Qt或DWM将窗口缩小16像素 并将其向右移动8像素,然后向下移动。有人对这件事有想法吗 怎么做

DWM是桌面窗口管理器吗?那么平台就是Windows了

只要它是关于Qt 5.6的,并且您很可能正在谈论设置了Qt::CustomizeWindowint属性的小部件,那么Qt中就存在一个已知的bug,该bug尚未修复:


有几次我偶然发现了这个bug,上面链接中提出的解决方法对我很有效。

我的第一次尝试是将窗口几何设置为可用几何:

QRect rect = QApplication::desktop()->availableGeometry();
setGeometry(rect.left() , rect.top(), rect.right(), rect.bottom());
唯一的问题是窗口的右侧和底部的像素太小

setGeometry(rect.left() , rect.top(), rect.right() + 1, rect.bottom() + 1);
给我一个错误:

QWindowsWindow::setGeometry: Unable to set geometry 2560x1400+0+0 on QWidgetWindow/'MainWindowWindow'. Resulting geometry:  2576x1416+-8+-8 (frame: 0, 0, 0, 0, custom margin: 0, 0, 0, 0, minimum size: 45x13, maximum size: 16777215x16777215)
然后我查看了Visual Studio 2015的矩形坐标,它们的大小与我实现的无边界窗口的大小相同,每个方向都大8像素

我可以给窗口的内容设置8的边距,这样如果窗口最大化并设置窗口区域,它就不会从屏幕上消失:

setContentsMargins({ 8, 8, 8, 8 });

HRGN WinRgn;
RECT winrect;
GetClientRect(hwnd, &winrect);
WinRgn = CreateRectRgn(8, 8, winrect.right - 8, winrect.bottom - 8);
SetWindowRgn(hwnd, WinRgn, true);
当窗口恢复时,我们需要重置以前的更改。 结果是:

case WM_SIZE:
    WINDOWPLACEMENT wp;
    wp.length = sizeof(WINDOWPLACEMENT);
    GetWindowPlacement(hwnd, &wp);
    if (wp.showCmd == SW_MAXIMIZE) {
        setContentsMargins({ 8, 8, 8, 8 });

        HRGN WinRgn;
        RECT winrect;
        GetClientRect(hwnd, &winrect);
        WinRgn = CreateRectRgn(8, 8, winrect.right - 8, winrect.bottom - 8);
        SetWindowRgn(hwnd, WinRgn, true);
        UpdateWindow(hwnd);

        is_fullscreen = true;

    } else {
        if (is_fullscreen) {
            setContentsMargins({ 0, 0, 0, 0 });
            SetWindowRgn(hwnd, NULL, true);

            is_fullscreen = false;
        }
    }
    break;

其他帖子已经回答了这个问题,但我想补充一点,使用
GetSystemMetrics
而不是硬编码的
8
可能是个好主意

例子
#包括
void MyWindow::changeEvent(QEvent*ev){
如果(ev->type()==QEvent::WindowsStateChange){
const auto state=windowState();
if(state&Qt::WindowMaximized){
const int x=GetSystemMetrics(SM_CXFRAME)+GetSystemMetrics(SM_CXPADDEDBORDER);
const int y=GetSystemMetrics(SM_CYFRAME)+GetSystemMetrics(SM_CXPADDEDBORDER);
集合内容边缘({x,y,x,y});
}
否则{
setContentsMargins({0,0,0,0});
}
}
#include <Windows.h>

void MyWindow::changeEvent(QEvent* ev) {
  if (ev->type() == QEvent::WindowStateChange) {
    const auto state = windowState();
    if(state & Qt::WindowMaximized) {
      const int x = GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER);
      const int y = GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER);
      setContentsMargins({x, y, x, y});
    }
    else {
      setContentsMargins({0, 0, 0, 0});
    }
}