Apply system background color for top level window

Repaint top level window with system background color when it shows up
first time. The system background color will be affected by dark or
light mode settings in windows

Fixes: QTBUG-106583
Pick-to: 6.4
Change-Id: I9205335540e74e90bb068e30fc3d4db037fd580f
Reviewed-by: Yuhang Zhao <2546789017@qq.com>
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
bb10
Santhosh Kumar 2022-10-25 13:47:26 +02:00
parent 0d517a1352
commit 2991c66b75
2 changed files with 16 additions and 1 deletions

View File

@ -31,6 +31,7 @@
#include <private/qguiapplication_p.h>
#include <private/qhighdpiscaling_p.h>
#include <qpa/qwindowsysteminterface.h>
#include <qpa/qplatformtheme.h>
#include <QtCore/qdebug.h>
#include <QtCore/qlibraryinfo.h>
@ -2301,9 +2302,22 @@ static inline bool isSoftwareGl()
}
bool QWindowsWindow::handleWmPaint(HWND hwnd, UINT message,
WPARAM, LPARAM, LRESULT *result)
WPARAM wParam, LPARAM, LRESULT *result)
{
if (message == WM_ERASEBKGND) { // Backing store - ignored.
if (!m_firstBgDraw && QWindowsIntegration::instance()->darkModeHandling().testFlag(QWindowsApplication::DarkModeStyle)) {
// Get system background color
const QColor bgColor = QGuiApplicationPrivate::platformTheme()->palette()->color(QPalette::Window);
HBRUSH bgBrush = CreateSolidBrush(RGB(bgColor.red(), bgColor.green(), bgColor.blue()));
// Fill rectangle with system background color
RECT rc;
auto hdc = reinterpret_cast<HDC>(wParam);
GetClientRect(hwnd, &rc);
FillRect(hdc, &rc, bgBrush);
DeleteObject(bgBrush);
// Brush the window with system background color only for first time
m_firstBgDraw = true;
}
*result = 1;
return true;
}

View File

@ -377,6 +377,7 @@ private:
HICON m_iconBig = nullptr;
void *m_surface = nullptr;
int m_savedDpi = 96;
bool m_firstBgDraw = false;
static bool m_screenForGLInitialized;