fixed dpi not initializing when the window shows

This commit is contained in:
Daniel _ 2017-09-23 18:37:51 +02:00
parent 14511e10ef
commit 206a3518b0
6 changed files with 46 additions and 9 deletions

View file

@ -22,14 +22,16 @@ public:
MSG *msg = reinterpret_cast<MSG *>(message);
if (msg->message == WM_NCCREATE) {
typedef BOOL(WINAPI * EnableNonClientDpiScaling)(HWND);
QLibrary user32("user32.dll", NULL);
{
typedef BOOL(WINAPI * EnableNonClientDpiScaling)(HWND);
EnableNonClientDpiScaling enableNonClientDpiScaling =
(EnableNonClientDpiScaling)user32.resolve("EnableNonClientDpiScaling");
EnableNonClientDpiScaling enableNonClientDpiScaling =
(EnableNonClientDpiScaling)user32.resolve("EnableNonClientDpiScaling");
if (enableNonClientDpiScaling)
enableNonClientDpiScaling(msg->hwnd);
if (enableNonClientDpiScaling)
enableNonClientDpiScaling(msg->hwnd);
}
}
return false;
}

View file

@ -1,7 +1,10 @@
#pragma once
#ifdef USEWINSDK
#include "windows.h"
#include <windows.h>
#include <boost/optional.hpp>
#include <QLibrary>
namespace chatterino {
namespace util {
@ -17,7 +20,23 @@ static bool tryHandleDpiChangedMessage(void *message, int &dpi)
}
return false;
}
static boost::optional<UINT> getWindowDpi(quintptr ptr)
{
typedef UINT(WINAPI * GetDpiForWindow)(HWND);
QLibrary user32("user32.dll", NULL);
GetDpiForWindow getDpiForWindow = (GetDpiForWindow)user32.resolve("GetDpiForWindow");
if (getDpiForWindow) {
UINT value = getDpiForWindow((HWND)ptr);
return value == 0 ? boost::none : boost::optional<UINT>(value);
}
return boost::none;
}
}
} // namespace util
} // namespace chatterino
#endif

View file

@ -51,6 +51,17 @@ void BaseWidget::init()
});
}
void BaseWidget::initAsWindow()
{
#ifdef USEWINSDK
auto dpi = util::getWindowDpi(this->winId());
if (dpi) {
this->dpiMultiplier = dpi.value() / 96.f;
}
#endif
}
void BaseWidget::refreshTheme()
{
// Do any color scheme updates here

View file

@ -32,6 +32,7 @@ protected:
#ifdef USEWINSDK
virtual bool nativeEvent(const QByteArray &eventType, void *message, long *result) override;
#endif
void initAsWindow();
private:
float dpiMultiplier = 1.f;

View file

@ -16,6 +16,8 @@ EmotePopup::EmotePopup(ColorScheme &colorScheme, EmoteManager &emoteManager,
: BaseWidget(colorScheme, 0)
, emoteManager(emoteManager)
{
this->initAsWindow();
QHBoxLayout *layout = new QHBoxLayout(this);
this->setLayout(layout);
layout->setMargin(0);
@ -69,5 +71,5 @@ void EmotePopup::loadChannel(std::shared_ptr<Channel> _channel)
this->view->setChannel(emoteChannel);
}
}
}
} // namespace widgets
} // namespace chatterino

View file

@ -26,6 +26,8 @@ MainWindow::MainWindow(ChannelManager &_channelManager, ColorScheme &_colorSchem
, dpi(this->getDpiMultiplier())
// , windowGeometry("/windows/0/geometry")
{
this->initAsWindow();
QVBoxLayout *layout = new QVBoxLayout(this);
// add titlebar