Comments (11)
在构造函数添加以下代码就可以了,好像是屏幕变化的时候Qt又给窗口加上了边框导致的
connect(window, &QWindow::screenChanged, this, [=]
{
auto hWnd = reinterpret_cast<HWND>(window->winId());
SetWindowPos(hWnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);
});
from framelesshelper.
简单处理了下,跨屏幕移动时resize下,有概率失败。
另外副屏幕通过最大化时,再最小化时恢复一定白屏(原因屏幕识别错误)。
.../FramelessHelper/Kernels/NativeWindowHelper.cpp | 30 ++++++++++++++--------
1 file changed, 19 insertions(+), 11 deletions(-)
diff --git a/ThirdParty/FramelessHelper/Kernels/NativeWindowHelper.cpp b/ThirdParty/FramelessHelper/Kernels/NativeWindowHelper.cpp
index 0c2cefa..b75da1f 100644
--- a/ThirdParty/FramelessHelper/Kernels/NativeWindowHelper.cpp
+++ b/ThirdParty/FramelessHelper/Kernels/NativeWindowHelper.cpp
@@ -110,7 +110,13 @@ bool NativeWindowHelper::nativeEventFilter(void *msg, long *result)
LPMINMAXINFO lpMinMaxInfo = reinterpret_cast<LPMINMAXINFO>(lParam);
QRect g = d->availableGeometry();
+ static QRect old_g = g;
QMargins m = d->maximizedMargins();
+ if(g != old_g) {
+ //fix:screen swtich window size change bug
+ old_g = g;
+ d->window->resize(d->window->size());
+ }
lpMinMaxInfo->ptMaxPosition.x = - m.left();
lpMinMaxInfo->ptMaxPosition.y = - m.top();
@@ -329,15 +335,17 @@ QMargins NativeWindowHelperPrivate::maximizedMargins() const
QRect NativeWindowHelperPrivate::availableGeometry() const
{
- MONITORINFO mi{0};
- mi.cbSize = sizeof(MONITORINFO);
-
- auto hWnd = reinterpret_cast<HWND>(window->winId());
- auto hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
- if (!hMonitor || !GetMonitorInfoW(hMonitor, &mi)) {
- Q_ASSERT(NULL != hMonitor);
- return window->screen()->availableGeometry();
- }
-
- return QRect(mi.rcWork.left, mi.rcWork.top, mi.rcWork.right - mi.rcWork.left, mi.rcWork.bottom - mi.rcWork.top);
+ //fix:restore form max window,get wrong geometry size(multi screens)
+ return window->screen()->availableGeometry();
+
+// MONITORINFO mi{0};
+// mi.cbSize = sizeof(MONITORINFO);
+
+// auto hWnd = reinterpret_cast<HWND>(window->winId());
+// auto hMonitor = MonitorFromWindow(hWnd, MONITOR_DEFAULTTONEAREST);
+// if (!hMonitor || !GetMonitorInfoW(hMonitor, &mi)) {
+// Q_ASSERT(NULL != hMonitor);
+// return window->screen()->availableGeometry();
+// }
+// return QRect(mi.rcWork.left, mi.rcWork.top, mi.rcWork.right - mi.rcWork.left, mi.rcWork.bottom - mi.rcWork.top);
}
from framelesshelper.
我尝试在
nativeEventFilter
函数中处理WM_MOVE
消息,执行如下代码SetWindowPos(msg->hwnd, nullptr, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); RedrawWindow(msg->hwnd, nullptr, nullptr, RDW_INVALIDATE | RDW_UPDATENOW | RDW_NOCHILDREN);
即可解决多个显示器之间切换问题,但是程序还是会有其他问题。
这个方法我在VS调试诊断中看到,使用这个方法CPU性能前后都是在25左右。
感觉是歪门邪道,但是目前确实解决了我的问题,大家可以参考一下。
确实解决了,还可以精简下只设置SetWindowPos就行。
RECT rcClient;
GetWindowRect(msg->hwnd, &rcClient);
SetWindowPos(msg->hwnd, NULL, rcClient.left, rcClient.top, rcClient.right - rcClient.left, rcClient.bottom - rcClient.top, SWP_FRAMECHANGED);
from framelesshelper.
same problem
from framelesshelper.
Qt 5.12.9 + Mingw,same problem
from framelesshelper.
已遇到同样的问题。从一个屏幕到另一个屏幕的拖动过程中,绘制的区域变小了(水平方向上大约1016个像素,垂直方向上大约3040个像素)。还不知道如何修改
from framelesshelper.
同样遇到相同的问题,不知道如何修改
from framelesshelper.
我尝试在nativeEventFilter
函数中处理WM_MOVE
消息,执行如下代码SetWindowPos(msg->hwnd, nullptr, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); RedrawWindow(msg->hwnd, nullptr, nullptr, RDW_INVALIDATE | RDW_UPDATENOW | RDW_NOCHILDREN);
即可解决多个显示器之间切换问题,但是程序还是会有其他问题。
这个方法我在VS调试诊断中看到,使用这个方法CPU性能前后都是在25左右。
感觉是歪门邪道,但是目前确实解决了我的问题,大家可以参考一下。
from framelesshelper.
我尝试在
nativeEventFilter
函数中处理WM_MOVE
消息,执行如下代码SetWindowPos(msg->hwnd, nullptr, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); RedrawWindow(msg->hwnd, nullptr, nullptr, RDW_INVALIDATE | RDW_UPDATENOW | RDW_NOCHILDREN);
即可解决多个显示器之间切换问题,但是程序还是会有其他问题。
这个方法我在VS调试诊断中看到,使用这个方法CPU性能前后都是在25左右。
感觉是歪门邪道,但是目前确实解决了我的问题,大家可以参考一下。
HOOK本就不是正道
from framelesshelper.
在多个显示器之间切换时,界面错位并失效,编译环境VS2015/2017都试过
显示器【1】正常
拖动到显示器【2】错位并失效
按钮其实并没有失效,只是坐标没变。我在做无边框的时候用的也是nativeEventFilter拦截系统消息,出现了完全一样的问题。
from framelesshelper.
我尝试在
nativeEventFilter
函数中处理WM_MOVE
消息,执行如下代码SetWindowPos(msg->hwnd, nullptr, 0, 0, 0, 0, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOOWNERZORDER); RedrawWindow(msg->hwnd, nullptr, nullptr, RDW_INVALIDATE | RDW_UPDATENOW | RDW_NOCHILDREN);
即可解决多个显示器之间切换问题,但是程序还是会有其他问题。
这个方法我在VS调试诊断中看到,使用这个方法CPU性能前后都是在25左右。
感觉是歪门邪道,但是目前确实解决了我的问题,大家可以参考一下。HOOK本就不是正道
感觉不涉及到什么正道不正道的问题,用win32开发无边框也是拦截消息的做法(msdn 的文档 https://docs.microsoft.com/en-us/windows/win32/dwm/customframe ) 更觉得这是windows系统做的不好
from framelesshelper.
Related Issues (18)
- QML 窗口关闭会崩溃问题
- 在win7系统没有阴影边框 鼠标拖动到屏幕左上右边缘没有系统的动画效果 HOT 4
- link错误,QT 5.15.2, VS2019 64bit
- Multiple screen problem HOT 2
- 如何设置可伸缩?
- 设置Qt::WA_TranslucentBackground属性后无法最大化
- QWidget下点击最大化按钮后,如果鼠标不移动,最大化按钮的hover状态无法取消
- Cannot play video with QMediaPlayer
- 缩放QML窗口右上角有系统的关闭按钮 HOT 4
- Resize会忽视当前屏幕dpr导致错误 HOT 3
- 你好
- 窗口大小和位置的计算有问题 HOT 6
- 去除对widgets模块的强制依赖 HOT 4
- 不能跨平台 HOT 1
- Facing issues on Windows 10, Qt 5.12.1 MSVC 2015 & MSVC 2017 HOT 11
- 5.12
- Maximize window issue. Windows 10, Qt 5.13.1, MSVC 2017 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from framelesshelper.