Index: ui/views/win/hwnd_message_handler.cc |
diff --git a/ui/views/win/hwnd_message_handler.cc b/ui/views/win/hwnd_message_handler.cc |
index 6914dcd81fea44ba1a408fb1c012a9f1693a351d..c24479a601f7e6a40daf13b12485d5d80f3ac2fa 100644 |
--- a/ui/views/win/hwnd_message_handler.cc |
+++ b/ui/views/win/hwnd_message_handler.cc |
@@ -454,9 +454,28 @@ void HWNDMessageHandler::CloseNow() { |
DestroyWindow(hwnd()); |
} |
+void ConvertToScreen(RECT* rect) { |
+#if defined(ENABLE_HIDPI) |
+ static float os_scale = ui::GetDPIScale(); |
+ rect->left *= os_scale; |
+ rect->right *= os_scale; |
+ rect->top *= os_scale; |
+ rect->bottom *= os_scale; |
+#endif |
+} |
+ |
+void ConvertToScreen(POINT* point) { |
+#if defined(ENABLE_HIDPI) |
+ static float os_scale = ui::GetDPIScale(); |
+ point->x *= os_scale; |
+ point->y *= os_scale; |
+#endif |
+} |
+ |
gfx::Rect HWNDMessageHandler::GetWindowBoundsInScreen() const { |
RECT r; |
GetWindowRect(hwnd(), &r); |
+ ConvertToScreen(&r); |
return gfx::Rect(r); |
} |
@@ -465,6 +484,8 @@ gfx::Rect HWNDMessageHandler::GetClientAreaBoundsInScreen() const { |
GetClientRect(hwnd(), &r); |
POINT point = { r.left, r.top }; |
ClientToScreen(hwnd(), &point); |
+ ConvertToScreen(&r); // Scales right/left |
+ ConvertToScreen(&point); // Scale x/y |
return gfx::Rect(point.x, point.y, r.right - r.left, r.bottom - r.top); |
} |
@@ -1041,6 +1062,17 @@ void HWNDMessageHandler::TrackMouseEvents(DWORD mouse_tracking_flags) { |
} |
} |
+ui::ScaleFactor GetScaleFactor() { |
+#if defined(ENABLE_HIDPI) |
+ float scale = ui::GetDPIScale(); |
+ if (scale > 1.6) |
+ return ui::SCALE_FACTOR_180P; |
+ else if (scale > 1.2) |
+ return ui::SCALE_FACTOR_140P; |
+#endif |
+ return ui::SCALE_FACTOR_100P; |
+} |
+ |
void HWNDMessageHandler::ClientAreaSizeChanged() { |
RECT r = {0, 0, 0, 0}; |
if (delegate_->WidgetSizeIsClientSize()) { |
@@ -1056,7 +1088,7 @@ void HWNDMessageHandler::ClientAreaSizeChanged() { |
delegate_->HandleClientSizeChanged(s); |
if (use_layered_buffer_) { |
layered_window_contents_.reset( |
- new gfx::Canvas(s, ui::SCALE_FACTOR_100P, false)); |
+ new gfx::Canvas(s, GetScaleFactor(), false)); |
} |
} |
@@ -1465,6 +1497,17 @@ LRESULT HWNDMessageHandler::OnMouseActivate(UINT message, |
return MA_ACTIVATE; |
} |
+void ScaleScreenPoint(CPoint* point) { |
+ static float dpi_scale = ui::GetDPIScale(); |
+ point->SetPoint( point->x * dpi_scale, point->y * dpi_scale); |
+} |
+ |
+void ScaleScreenPoint(POINT* point) { |
+ static float dpi_scale = ui::GetDPIScale(); |
+ point->x *= dpi_scale; |
+ point->y *= dpi_scale; |
+} |
+ |
LRESULT HWNDMessageHandler::OnMouseRange(UINT message, |
WPARAM w_param, |
LPARAM l_param) { |
@@ -1480,6 +1523,7 @@ LRESULT HWNDMessageHandler::OnMouseRange(UINT message, |
// |point| is in window coordinates, but WM_NCHITTEST and TrackPopupMenu() |
// expect screen coordinates. |
CPoint screen_point(l_param); |
+ ScaleScreenPoint(&screen_point); |
MapWindowPoints(hwnd(), HWND_DESKTOP, &screen_point, 1); |
w_param = SendMessage(hwnd(), WM_NCHITTEST, 0, |
MAKELPARAM(screen_point.x, screen_point.y)); |
@@ -1520,6 +1564,7 @@ LRESULT HWNDMessageHandler::OnMouseRange(UINT message, |
MSG msg = { hwnd(), message, w_param, l_param, GetMessageTime(), |
{ GET_X_LPARAM(l_param), GET_Y_LPARAM(l_param) } }; |
+ //ScaleScreenPoint(&msg.pt); |
ui::MouseEvent event(msg); |
if (!touch_ids_.empty() || ui::IsMouseEventFromTouch(message)) |
event.set_flags(event.flags() | ui::EF_FROM_TOUCH); |