From a6a0484e013e3d2771a0689677911e1348c747c9 Mon Sep 17 00:00:00 2001 From: dreamsourcelabTAI Date: Sun, 28 Apr 2024 15:14:49 +0800 Subject: [PATCH] fix: The mouse scroll wheel cannot be used in Windows 7 --- DSView/pv/mainframe.cpp | 10 ++++++- DSView/pv/winnativewidget.cpp | 51 ++++++++++++++++++++++++++++------- DSView/pv/winnativewidget.h | 5 ++-- 3 files changed, 54 insertions(+), 12 deletions(-) diff --git a/DSView/pv/mainframe.cpp b/DSView/pv/mainframe.cpp index 9f702324..c972e7c6 100644 --- a/DSView/pv/mainframe.cpp +++ b/DSView/pv/mainframe.cpp @@ -759,8 +759,16 @@ void MainFrame::AttachNativeWindow() _titleBar->EnableAbleDrag(false); setWindowFlags(Qt::FramelessWindowHint); + + if (nativeWindow->IsWin7()){ + SetWindowLong((HWND)winId(), GWL_STYLE, WS_CLIPCHILDREN | WS_CLIPSIBLINGS); + } + else{ + SetWindowLong((HWND)winId(), GWL_STYLE, WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS); + } + + SetWindowLong((HWND)winId(), GWL_STYLE, WS_CLIPCHILDREN | WS_CLIPSIBLINGS); - SetWindowLong((HWND)winId(), GWL_STYLE, WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS); SetParent((HWND)winId(), nativeWindow->Handle()); setVisible(true); diff --git a/DSView/pv/winnativewidget.cpp b/DSView/pv/winnativewidget.cpp index b5fc4b9d..160bc597 100644 --- a/DSView/pv/winnativewidget.cpp +++ b/DSView/pv/winnativewidget.cpp @@ -726,9 +726,15 @@ void WinNativeWidget::hideBorder() } } -bool WinNativeWidget::isWinXOrGreater(DWORD major_version, DWORD minor_version, DWORD build_number) -{ - bool is_win_x_or_greater = false; +bool WinNativeWidget::getWinSysVersion(DWORD *major_version, DWORD *minor_version, DWORD *build_number) +{ + assert(major_version); + assert(minor_version); + assert(build_number); + + *major_version = 0; + *minor_version = 0; + *build_number = 0; typedef NTSTATUS(WINAPI *tRtlGetVersion)(LPOSVERSIONINFOEXW); tRtlGetVersion pRtlGetVersion = tRtlGetVersion(QLibrary::resolve("ntdll", "RtlGetVersion")); @@ -739,20 +745,47 @@ bool WinNativeWidget::isWinXOrGreater(DWORD major_version, DWORD minor_version, memset(&os_info, 0, sizeof(OSVERSIONINFOEXW)); os_info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW); NTSTATUS status = pRtlGetVersion(&os_info); + if (status == 0) - { - is_win_x_or_greater = (os_info.dwMajorVersion >= major_version && - os_info.dwMinorVersion >= minor_version && - os_info.dwBuildNumber >= build_number); + { + *major_version = os_info.dwMajorVersion; + *minor_version = os_info.dwMinorVersion; + *build_number = os_info.dwBuildNumber; + return true; } } - return is_win_x_or_greater; + return false; } bool WinNativeWidget::IsWin11OrGreater() { - return isWinXOrGreater(10, 0, 22000); + DWORD major_version = 0; + DWORD minor_version = 0; + DWORD build_number = 0; + + if (getWinSysVersion(&major_version, &minor_version, &build_number)){ + if (major_version >= 10 && build_number >= 22000){ + return true; + } + } + + return false; +} + +bool WinNativeWidget::IsWin7() +{ + DWORD major_version = 0; + DWORD minor_version = 0; + DWORD build_number = 0; + + if (getWinSysVersion(&major_version, &minor_version, &build_number)){ + if (major_version == 6 && minor_version == 1){ + return true; + } + } + + return false; } int WinNativeWidget::GetDevicePixelRatio() diff --git a/DSView/pv/winnativewidget.h b/DSView/pv/winnativewidget.h index df316f46..99e8d67a 100644 --- a/DSView/pv/winnativewidget.h +++ b/DSView/pv/winnativewidget.h @@ -86,6 +86,7 @@ public: void SetBorderColor(QColor color); bool IsWin11OrGreater(); + bool IsWin7(); inline void SetTitleBarWidget(QWidget *w){ _titleBarWidget = w; @@ -99,8 +100,8 @@ public: static void EnalbeNoClientArea(bool bEnabled); private: - QScreen* screenFromCurrentMonitorHandle(); - bool isWinXOrGreater(DWORD major_version, DWORD minor_version, DWORD build_number); + QScreen* screenFromCurrentMonitorHandle(); + bool getWinSysVersion(DWORD *major_version, DWORD *minor_version, DWORD *build_number); void showBorder(); void hideBorder(); static RECT GetMonitorArea(HMONITOR hMonitor, bool isPhysics);