From 066bd2519140d36312712e27f2ac81d98c4b72fa Mon Sep 17 00:00:00 2001 From: Robin Dunn Date: Thu, 5 May 2011 17:56:18 +0000 Subject: [PATCH] When we're using GDI+, the DC might have transforms applied to it, but the renderer APIs don't respect them. So we need to apply the transforms to the rect ourselves. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67704 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/msw/renderer.cpp | 47 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/src/msw/renderer.cpp b/src/msw/renderer.cpp index 9d1e4d79e4..380ad2e383 100644 --- a/src/msw/renderer.cpp +++ b/src/msw/renderer.cpp @@ -31,6 +31,7 @@ #include "wx/settings.h" #endif //WX_PRECOMP +#include "wx/dcgraph.h" #include "wx/scopeguard.h" #include "wx/splitter.h" #include "wx/renderer.h" @@ -113,6 +114,28 @@ #define DFCS_HOT 0x1000 #endif +// When we're using GDI+, the DC might have transforms applied to it, +// but the renderer APIs don't respect them. So we need to apply +// the transforms to the rect ourselves. +inline +wxRect applyGDIPlusTransformsToRect(wxDC& dc, const wxRect& r) +{ + wxRect rect = r; +#if wxUSE_GRAPHICS_CONTEXT + wxGCDC* gcdc = dynamic_cast(&dc); + if (gcdc) + { + double xtrans = 0; + double ytrans = 0; + wxGraphicsContext* gc = gcdc->GetGraphicsContext(); + gc->GetTransform().TransformPoint(&xtrans, &ytrans); + rect.x = rect.x + (int)xtrans; + rect.y = rect.y + (int)ytrans; + } +#endif + return rect; +} + // ---------------------------------------------------------------------------- // methods common to wxRendererMSW and wxRendererXP // ---------------------------------------------------------------------------- @@ -394,8 +417,10 @@ wxRendererMSW::DrawComboBoxDropButton(wxWindow * WXUNUSED(win), const wxRect& rect, int flags) { + wxRect adjustedRect = applyGDIPlusTransformsToRect(dc, rect); + RECT r; - wxCopyRectToRECT(rect, r); + wxCopyRectToRECT(adjustedRect, r); int style = DFCS_SCROLLCOMBOBOX; if ( flags & wxCONTROL_DISABLED ) @@ -414,8 +439,10 @@ wxRendererMSW::DoDrawFrameControl(UINT type, const wxRect& rect, int flags) { + wxRect adjustedRect = applyGDIPlusTransformsToRect(dc, rect); + RECT r; - wxCopyRectToRECT(rect, r); + wxCopyRectToRECT(adjustedRect, r); int style = kind; if ( flags & wxCONTROL_CHECKED ) @@ -615,8 +642,10 @@ wxRendererXP::DrawComboBoxDropButton(wxWindow * win, return; } + wxRect adjustedRect = applyGDIPlusTransformsToRect(dc, rect); + RECT r; - wxCopyRectToRECT(rect, r); + wxCopyRectToRECT(adjustedRect, r); int state; if ( flags & wxCONTROL_PRESSED ) @@ -654,8 +683,10 @@ wxRendererXP::DrawHeaderButton(wxWindow *win, return m_rendererNative.DrawHeaderButton(win, dc, rect, flags, sortArrow, params); } + wxRect adjustedRect = applyGDIPlusTransformsToRect(dc, rect); + RECT r; - wxCopyRectToRECT(rect, r); + wxCopyRectToRECT(adjustedRect, r); int state; if ( flags & wxCONTROL_PRESSED ) @@ -696,8 +727,10 @@ wxRendererXP::DrawTreeItemButton(wxWindow *win, return; } + wxRect adjustedRect = applyGDIPlusTransformsToRect(dc, rect); + RECT r; - wxCopyRectToRECT(rect, r); + wxCopyRectToRECT(adjustedRect, r); int state = flags & wxCONTROL_EXPANDED ? GLPS_OPENED : GLPS_CLOSED; wxUxThemeEngine::Get()->DrawThemeBackground @@ -734,8 +767,10 @@ wxRendererXP::DoDrawButtonLike(HTHEME htheme, const wxRect& rect, int flags) { + wxRect adjustedRect = applyGDIPlusTransformsToRect(dc, rect); + RECT r; - wxCopyRectToRECT(rect, r); + wxCopyRectToRECT(adjustedRect, r); // the base state is always 1, whether it is PBS_NORMAL, // {CBS,RBS}_UNCHECKEDNORMAL or CBS_NORMAL -- 2.45.2