X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/46bd19787759f84d6e9bdc8754325b4ac4532618..0d29a4828eb4404ac69f29c7d82e2ea3292c6501:/src/msw/renderer.cpp diff --git a/src/msw/renderer.cpp b/src/msw/renderer.cpp index 4d7b390127..cbbd2a406a 100644 --- a/src/msw/renderer.cpp +++ b/src/msw/renderer.cpp @@ -31,6 +31,7 @@ #include "wx/settings.h" #endif //WX_PRECOMP +#include "wx/scopeguard.h" #include "wx/splitter.h" #include "wx/renderer.h" #include "wx/msw/private.h" @@ -76,8 +77,13 @@ #define HSAS_SORTEDDOWN 2 #endif -#if defined(__WXWINCE__) && !defined(DFCS_FLAT) - #define DFCS_FLAT 0 +#if defined(__WXWINCE__) + #ifndef DFCS_FLAT + #define DFCS_FLAT 0 + #endif + #ifndef DFCS_MONO + #define DFCS_MONO 0 + #endif #endif #ifndef DFCS_HOT @@ -110,6 +116,13 @@ public: const wxRect& rect, int flags = 0); + virtual void DrawFocusRect(wxWindow* win, + wxDC& dc, + const wxRect& rect, + int flags = 0); + + virtual int GetHeaderButtonHeight(wxWindow *win); + private: DECLARE_NO_COPY_CLASS(wxRendererMSW) }; @@ -133,7 +146,6 @@ public: int flags = 0, wxHeaderSortIconType sortArrow = wxHDR_SORT_ICON_NONE, wxHeaderButtonParams* params = NULL); - virtual int GetHeaderButtonHeight(wxWindow *win); virtual void DrawTreeItemButton(wxWindow *win, wxDC& dc, @@ -215,7 +227,7 @@ wxRendererMSW::DrawComboBoxDropButton(wxWindow * WXUNUSED(win), if ( flags & wxCONTROL_PRESSED ) style |= DFCS_PUSHED | DFCS_FLAT; - ::DrawFrameControl(GetHdcOf(dc), &r, DFC_SCROLL, style); + ::DrawFrameControl(GetHdcOf(*((wxMSWDCImpl*)dc.GetImpl())), &r, DFC_SCROLL, style); } void @@ -239,7 +251,7 @@ wxRendererMSW::DrawCheckBox(wxWindow * WXUNUSED(win), if ( flags & wxCONTROL_CURRENT ) style |= DFCS_HOT; - ::DrawFrameControl(GetHdcOf(dc), &r, DFC_BUTTON, style); + ::DrawFrameControl(GetHdcOf(*((wxMSWDCImpl*)dc.GetImpl())), &r, DFC_BUTTON, style); } void @@ -268,7 +280,41 @@ wxRendererMSW::DrawPushButton(wxWindow * WXUNUSED(win), RECT rc; wxCopyRectToRECT(rect, rc); - ::DrawFrameControl(GetHdcOf(dc), &rc, DFC_BUTTON, style); + ::DrawFrameControl(GetHdcOf(*((wxMSWDCImpl*)dc.GetImpl())), &rc, DFC_BUTTON, style); +} + +void wxRendererMSW::DrawFocusRect(wxWindow * WXUNUSED(win), + wxDC& dc, + const wxRect& rect, + int WXUNUSED(flags)) +{ + RECT rc; + wxCopyRectToRECT(rect, rc); + + ::DrawFocusRect(GetHdcOf(*((wxMSWDCImpl*)dc.GetImpl())), &rc); +} + +int wxRendererMSW::GetHeaderButtonHeight(wxWindow * WXUNUSED(win)) +{ + // some "reasonable" value returned in case of error, it doesn't really + // correspond to anything but it's better than returning 0 + static const int DEFAULT_HEIGHT = 20; + + + // create a temporary header window just to get its geometry + HWND hwndHeader = ::CreateWindow(WC_HEADER, NULL, 0, + 0, 0, 0, 0, NULL, NULL, NULL, NULL); + if ( !hwndHeader ) + return DEFAULT_HEIGHT; + + wxON_BLOCK_EXIT1( ::DestroyWindow, hwndHeader ); + + // initialize the struct filled with the values by Header_Layout() + RECT parentRect = { 0, 0, 100, 100 }; + WINDOWPOS wp = { 0, 0, 0, 0, 0, 0, 0 }; + HDLAYOUT hdl = { &parentRect, &wp }; + + return Header_Layout(hwndHeader, &hdl) ? wp.cy : DEFAULT_HEIGHT; } // ============================================================================ @@ -317,7 +363,7 @@ wxRendererXP::DrawComboBoxDropButton(wxWindow * win, wxUxThemeEngine::Get()->DrawThemeBackground ( hTheme, - GetHdcOf(dc), + GetHdcOf(*((wxMSWDCImpl*)dc.GetImpl())), CP_DROPDOWNBUTTON, state, &r, @@ -353,7 +399,7 @@ wxRendererXP::DrawHeaderButton(wxWindow *win, wxUxThemeEngine::Get()->DrawThemeBackground ( hTheme, - GetHdcOf(dc), + GetHdcOf(*((wxMSWDCImpl*)dc.GetImpl())), HP_HEADERITEM, state, &r, @@ -369,31 +415,6 @@ wxRendererXP::DrawHeaderButton(wxWindow *win, } -int -wxRendererXP::GetHeaderButtonHeight(wxWindow *win) -{ - wxUxThemeHandle hTheme(win, L"HEADER"); - if ( !hTheme ) - { - return m_rendererNative.GetHeaderButtonHeight(win); - } - - HRESULT hr; - int value = -1; - - hr = wxUxThemeEngine::Get()->GetThemeMetric( hTheme, - NULL, - HP_HEADERITEM, - HIS_NORMAL, - TMT_HEIGHT, - &value ); - if ( hr == S_OK ) - return value; - else - return 20; -} - - void wxRendererXP::DrawTreeItemButton(wxWindow *win, wxDC& dc, @@ -414,7 +435,7 @@ wxRendererXP::DrawTreeItemButton(wxWindow *win, wxUxThemeEngine::Get()->DrawThemeBackground ( hTheme, - GetHdcOf(dc), + GetHdcOf(*((wxMSWDCImpl*)dc.GetImpl())), TVP_GLYPH, state, &r, @@ -464,7 +485,7 @@ wxRendererXP::DrawCheckBox(wxWindow *win, wxUxThemeEngine::Get()->DrawThemeBackground ( hTheme, - GetHdcOf(dc), + GetHdcOf(*((wxMSWDCImpl*)dc.GetImpl())), BP_CHECKBOX, state, &r, @@ -503,7 +524,7 @@ wxRendererXP::DrawPushButton(wxWindow * win, wxUxThemeEngine::Get()->DrawThemeBackground ( hTheme, - GetHdcOf(dc), + GetHdcOf(*((wxMSWDCImpl*)dc.GetImpl())), BP_PUSHBUTTON, state, &r, @@ -513,7 +534,7 @@ wxRendererXP::DrawPushButton(wxWindow * win, } void -wxRendererXP::DrawItemSelectionRect(wxWindow * WXUNUSED(win), +wxRendererXP::DrawItemSelectionRect(wxWindow *win, wxDC& dc, const wxRect& rect, int flags) @@ -527,7 +548,7 @@ wxRendererXP::DrawItemSelectionRect(wxWindow * WXUNUSED(win), } else // !focused { - brush = wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNSHADOW)); + brush = wxBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)); } } else // !selected @@ -536,12 +557,11 @@ wxRendererXP::DrawItemSelectionRect(wxWindow * WXUNUSED(win), } dc.SetBrush(brush); - - // unlike for wxRendererGeneric, on windows we _never_ want to draw - // the outline of the rectangle: dc.SetPen(*wxTRANSPARENT_PEN); - dc.DrawRectangle( rect ); + + if ((flags & wxCONTROL_FOCUSED) && (flags & wxCONTROL_CURRENT)) + DrawFocusRect( win, dc, rect, flags ); }