summaryrefslogtreecommitdiff
path: root/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx
diff options
context:
space:
mode:
authorManolo Gouy <Manolo>2016-08-25 12:42:50 +0000
committerManolo Gouy <Manolo>2016-08-25 12:42:50 +0000
commit5dbfe413ae8bd6aca1dfa36f79bb1168aaa50823 (patch)
treea10473ddd5bfe0ad56df237e29ab6d698124aa71 /src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx
parenta7ce881c7d8b66a798ae7fff26bcd826b8994846 (diff)
Fix computation of Fl_Window::decorated_w() and decorated_h() when apps are resized through display setting.
Under Windows 10: when the user sets the value of "Change the size of text, apps and other items" in display settings to above 100 %, the computation of Fl_Window::decorated_w() and decorated_h() has to take the scaling factor into account. This factor is also necessary to draw correctly window title bars. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11893 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx')
-rw-r--r--src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx41
1 files changed, 35 insertions, 6 deletions
diff --git a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx
index c7976afb1..30109bb31 100644
--- a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx
+++ b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx
@@ -60,7 +60,13 @@ Fl_WinAPI_Window_Driver::~Fl_WinAPI_Window_Driver()
// --- private
-RECT Fl_WinAPI_Window_Driver::border_width_title_bar_height(int &bx, int &by, int &bt)
+RECT // frame of the decorated window in screen coordinates
+ Fl_WinAPI_Window_Driver::border_width_title_bar_height(
+ int &bx, // left and right border width
+ int &by, // bottom border height (=bx)
+ int &bt, // height of window title bar
+ float *pscaling // display scaling factor
+ )
{
Fl_Window *win = pWindow;
RECT r = {0,0,0,0};
@@ -71,20 +77,42 @@ RECT Fl_WinAPI_Window_Driver::border_width_title_bar_height(int &bx, int &by, in
static DwmGetWindowAttribute_type DwmGetWindowAttribute = dwmapi_dll ?
(DwmGetWindowAttribute_type)GetProcAddress(dwmapi_dll, "DwmGetWindowAttribute") : NULL;
int need_r = 1;
+ float scaling = 1;
if (DwmGetWindowAttribute) {
const DWORD DWMWA_EXTENDED_FRAME_BOUNDS = 9;
if ( DwmGetWindowAttribute(fl_xid(win), DWMWA_EXTENDED_FRAME_BOUNDS, &r, sizeof(RECT)) == S_OK ) {
need_r = 0;
+ // Compute the global display scaling factor: 1, 1.25, 1.5, 1.75, etc...
+ // This factor can be set in Windows 10 by
+ // "Change the size of text, apps and other items" in display settings.
+ HDC hdc = GetDC(NULL);
+ int hs = GetDeviceCaps(hdc, HORZSIZE);
+ int hr = GetDeviceCaps(hdc, HORZRES);
+ int px = GetDeviceCaps(hdc, LOGPIXELSX);
+ //int dhr = GetDeviceCaps(hdc, DESKTOPHORZRES);
+ //int vs = GetDeviceCaps(hdc, VERTSIZE);
+ //int vr = GetDeviceCaps(hdc, VERTRES);
+ //int py = GetDeviceCaps(hdc, LOGPIXELSY);
+ //int dvr = GetDeviceCaps(hdc, DESKTOPVERTRES);
+ ReleaseDC(NULL, hdc);
+ scaling = (hs * px) / (hr * 25.4); scaling = int(scaling * 100 + 0.5)/100.;
}
}
if (need_r) {
GetWindowRect(fl_xid(win), &r);
}
- bx = (r.right - r.left - win->w())/2;
+ if (pscaling) *pscaling = scaling;
+
+ bx = (r.right - r.left - int(win->w() * scaling))/2;
+ if (bx < 1) bx = 1;
by = bx;
- bt = r.bottom - r.top - win->h() - 2*by;
+ bt = r.bottom - r.top - int(win->h() * scaling) - 2 * by;
+
+ //fprintf(LOG,
+ // "HORZSIZE=%d %d, HORZRES=%d %d, LOGPIXELSX=%d %d, DESKTOPHORZRES=%d %d scaling=%f bx=%d bt=%d\n",
+ // hs,vs,hr,vr,px,py,dhr,dvr,scaling, bx,bt);fflush(LOG);
}
- return RECT(r);
+ return r;
}
@@ -100,8 +128,9 @@ int Fl_WinAPI_Window_Driver::decorated_w()
int Fl_WinAPI_Window_Driver::decorated_h()
{
int bt, bx, by;
- border_width_title_bar_height(bx, by, bt);
- return h() + bt + 2 * by;
+ float scaling;
+ border_width_title_bar_height(bx, by, bt, &scaling);
+ return h() + bt/scaling + 2 * by;
}