diff options
| author | Manolo Gouy <Manolo> | 2016-08-25 12:42:50 +0000 |
|---|---|---|
| committer | Manolo Gouy <Manolo> | 2016-08-25 12:42:50 +0000 |
| commit | 5dbfe413ae8bd6aca1dfa36f79bb1168aaa50823 (patch) | |
| tree | a10473ddd5bfe0ad56df237e29ab6d698124aa71 /src/drivers | |
| parent | a7ce881c7d8b66a798ae7fff26bcd826b8994846 (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')
| -rw-r--r-- | src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H | 2 | ||||
| -rw-r--r-- | src/drivers/WinAPI/Fl_WinAPI_Window_Driver.cxx | 41 |
2 files changed, 36 insertions, 7 deletions
diff --git a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H index feede0814..59ced3e37 100644 --- a/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H +++ b/src/drivers/WinAPI/Fl_WinAPI_Window_Driver.H @@ -62,7 +62,7 @@ class FL_EXPORT Fl_WinAPI_Window_Driver : public Fl_Window_Driver HICON small_icon; }; private: - RECT border_width_title_bar_height(int &bx, int &by, int &bt); + RECT border_width_title_bar_height(int &bx, int &by, int &bt, float *pscaling = NULL); void shape_bitmap_(Fl_Image* b); void shape_alpha_(Fl_Image* img, int offset); public: 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; } |
