我有一个 QML 应用程序(也在 QWidgets 中进行了测试,问题相同),为了使它无边框(但仍支持本机 WM 功能,如 Aero Snap 等),我遵循了 这个,通过实现 QAbstractNativeEventFilter 并响应 WM_NCCALSIZE 信号并将其设置为零:
switch(msg->message) {
case WM_NCCALCSIZE:
*r = 0;
return 1;
...
}
我还设置了一些不在Qt命名空间中的窗口标志,使用以下代码:
SetWindowLong(hwnd, GWL_STYLE, WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_THICKFRAME);
这在窗口未移动或调整大小时运行良好,但一旦Qt重新渲染,就会出现一个宽度等于标题和边框的未绘制区域:
移动/调整大小之前
移动/调整大小之后
我还发现了一个解决方法,即在Qt中添加FramelessWindowHint标志:
window->setFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::Dialog);
但是,现在当窗口状态改变(最大化、最小化等)时,这些边距再次出现。例如,通过阻止 WM_SIZE 事件,当 SIZE_MAXIMIZED 是参数时,边距不会出现,但我也无法从 Qt 最大化窗口。这意味着这是一个 Qt 的问题。
我还注意到,通过使用 winspector 检查窗口样式后,在我将其最大化后会出现一个新的属性原子: 请问你能帮我解决这个问题吗?