X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/5aaabb37107a52c9c28438fea8e3f81c12cd759e..d2d0adc7765dfe904f0f7e97d85a2638c934a7d6:/src/msw/control.cpp diff --git a/src/msw/control.cpp b/src/msw/control.cpp index caaa395f3c..9817456107 100644 --- a/src/msw/control.cpp +++ b/src/msw/control.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msw/control.cpp +// Name: src/msw/control.cpp // Purpose: wxControl class // Author: Julian Smart // Modified by: @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "control.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -30,7 +26,10 @@ #if wxUSE_CONTROLS +#include "wx/control.h" + #ifndef WX_PRECOMP + #include "wx/msw/wrapcctl.h" // include "properly" #include "wx/event.h" #include "wx/app.h" #include "wx/dcclient.h" @@ -38,19 +37,17 @@ #include "wx/settings.h" #endif -#include "wx/control.h" +#if wxUSE_LISTCTRL + #include "wx/listctrl.h" +#endif // wxUSE_LISTCTRL -#if wxUSE_NOTEBOOK - #include "wx/notebook.h" -#endif // wxUSE_NOTEBOOK +#if wxUSE_TREECTRL + #include "wx/treectrl.h" +#endif // wxUSE_TREECTRL #include "wx/msw/private.h" #include "wx/msw/uxtheme.h" -#if defined(__WIN95__) && !(defined(__GNUWIN32_OLD__) && !defined(__CYGWIN10__)) - #include -#endif - // ---------------------------------------------------------------------------- // wxWin macros // ---------------------------------------------------------------------------- @@ -170,8 +167,33 @@ bool wxControl::MSWCreateControl(const wxChar *classname, // set up fonts and colours InheritAttributes(); - if (!m_hasFont) - SetFont(GetDefaultAttributes().font); + if ( !m_hasFont ) + { +#if wxUSE_LISTCTRL || wxUSE_TREECTRL + // if we set a font for {list,tree}ctrls and the font size is changed in + // the display properties then the font size for these controls doesn't + // automatically adjust when they receive WM_SETTINGCHANGE + if ( wxDynamicCastThis(wxListCtrl) || wxDynamicCastThis(wxTreeCtrl) ) + { + // not sure if we need to explicitly set the font here for Win95/NT4 + // but we definitely can't do it for any newer version + // see wxGetCCDefaultFont() in src/msw/settings.cpp for explanation + // of why this test works + + // TODO: test Win95/NT4 to see if this is needed or breaks the + // font resizing as it does on newer versions + wxFont font = GetDefaultAttributes().font; + if ( font == wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) ) + { + SetFont(font); + } + } + else +#endif // wxUSE_LISTCTRL || wxUSE_TREECTRL + { + SetFont(GetDefaultAttributes().font); + } + } // set the size now if no initial size specified SetInitialBestSize(size); @@ -188,7 +210,11 @@ wxBorder wxControl::GetDefaultBorder() const // we want to automatically give controls a sunken style (confusingly, // it may not really mean sunken at all as we map it to WS_EX_CLIENTEDGE // which is not sunken at all under Windows XP -- rather, just the default) +#if defined(__POCKETPC__) || defined(__SMARTPHONE__) + return wxBORDER_SIMPLE; +#else return wxBORDER_SUNKEN; +#endif } WXDWORD wxControl::MSWGetStyle(long style, WXDWORD *exstyle) const @@ -278,7 +304,6 @@ bool wxControl::ProcessCommand(wxCommandEvent& event) return GetEventHandler()->ProcessEvent(event); } -#ifdef __WIN95__ bool wxControl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM* result) @@ -326,9 +351,8 @@ bool wxControl::MSWOnNotify(int idCtrl, return GetEventHandler()->ProcessEvent(event); } -#endif // Win95 -WXHBRUSH wxControl::DoMSWControlColor(WXHDC pDC, wxColour colBg) +WXHBRUSH wxControl::DoMSWControlColor(WXHDC pDC, wxColour colBg, WXHWND hWnd) { HDC hdc = (HDC)pDC; if ( m_hasFgCol ) @@ -336,8 +360,19 @@ WXHBRUSH wxControl::DoMSWControlColor(WXHDC pDC, wxColour colBg) ::SetTextColor(hdc, wxColourToRGB(GetForegroundColour())); } + WXHBRUSH hbr = 0; + if ( !colBg.Ok() ) + { + hbr = MSWGetBgBrush(pDC, hWnd); + + // if the control doesn't have any bg colour, foreground colour will be + // ignored as the return value would be 0 -- so forcefully give it a + // non default background brush in this case + if ( !hbr && m_hasFgCol ) + colBg = GetBackgroundColour(); + } + // use the background colour override if a valid colour is given - WXHBRUSH hbr; if ( colBg.Ok() ) { ::SetBkColor(hdc, wxColourToRGB(colBg)); @@ -346,29 +381,36 @@ WXHBRUSH wxControl::DoMSWControlColor(WXHDC pDC, wxColour colBg) wxBrush *brush = wxTheBrushList->FindOrCreateBrush(colBg, wxSOLID); hbr = (WXHBRUSH)brush->GetResourceHandle(); + } - else // use our own background colour and recurse upwards if necessary + + // if we use custom background, we should set foreground ourselves too + if ( hbr && !m_hasFgCol ) { - hbr = MSWGetBgBrush(pDC); + ::SetTextColor(hdc, ::GetSysColor(COLOR_WINDOWTEXT)); } + //else: already set above return hbr; } -WXHBRUSH wxControl::MSWControlColor(WXHDC pDC) +WXHBRUSH wxControl::MSWControlColor(WXHDC pDC, WXHWND hWnd) { - // by default consider that the controls text shouldn't erase the - // background under it (this is true for all static controls, check boxes, - // radio buttons, ... - ::SetBkMode((HDC)pDC, TRANSPARENT); + wxColour colBg; + + if ( HasTransparentBackground() ) + ::SetBkMode((HDC)pDC, TRANSPARENT); + else // if the control is opaque it shouldn't use the parents background + colBg = GetBackgroundColour(); - return DoMSWControlColor(pDC, wxNullColour); + return DoMSWControlColor(pDC, colBg, hWnd); } WXHBRUSH wxControl::MSWControlColorDisabled(WXHDC pDC) { return DoMSWControlColor(pDC, - wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)); + wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE), + GetHWND()); } // ---------------------------------------------------------------------------