X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ad30bb374f539a1f9a98bd9aeee88037c90bb454..ec36b155bd46fe075a4dc7911804632df23bed21:/src/msw/control.cpp diff --git a/src/msw/control.cpp b/src/msw/control.cpp index a020137ad7..030a55f704 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 // ---------------------------------------------------------------------------- @@ -139,25 +136,11 @@ bool wxControl::MSWCreateControl(const wxChar *classname, // ... and adjust it to account for a possible parent frames toolbar AdjustForParentClientOrigin(x, y); - // notice the apparently unnecessary label.empty() test: without it wse get - // crashes when creating controls (notebook to be precise) with empty - // labels as for some reason Windows looks not only at first but also at - // the second byte of the string which is not NUL in the buffer pointed to - // by label.c_str() and if the buffer contains "00 cc cc cc ..." (this is - // what happens in debug build where 0xcc is used as uninitialized memory - // marker) it creates a window not with empty label but with label - // consisting of many Unicode (!) 0xcccc characters - // - // this is not fatal in itself, but becomes so when wxGetWindowText() is - // called because GetWindowTextA() overwrites ASCII buffer with Unicode (!) - // characters without any qualms and so crashes the program... m_hWnd = (WXHWND)::CreateWindowEx ( exstyle, // extended style classname, // the kind of control to create - label.empty() // the window name - ? _T("\0") - : label.c_str(), + label.wx_str(), // the window name style, // the window style x, y, w, h, // the window position and size GetHwndOf(GetParent()), // parent @@ -179,16 +162,61 @@ bool wxControl::MSWCreateControl(const wxChar *classname, return false; } + // saving the label in m_labelOrig to return it verbatim + // later in GetLabel() + m_labelOrig = label; + // install wxWidgets window proc for this window SubclassWin(m_hWnd); // set up fonts and colours InheritAttributes(); - if (!m_hasFont) - SetFont(GetDefaultAttributes().font); + if ( !m_hasFont ) + { + bool setFont = true; + + wxFont font = GetDefaultAttributes().font; + + // 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 + + // FIXME: replace the dynamic casts with virtual function calls!! +#if wxUSE_LISTCTRL || wxUSE_TREECTRL + bool testFont = false; +#if wxUSE_LISTCTRL + if ( wxDynamicCastThis(wxListCtrl) ) + testFont = true; +#endif // wxUSE_LISTCTRL +#if wxUSE_TREECTRL + if ( wxDynamicCastThis(wxTreeCtrl) ) + testFont = true; +#endif // wxUSE_TREECTRL + + if ( testFont ) + { + // 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 + if ( font != wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT) ) + { + setFont = false; + } + } +#endif // wxUSE_LISTCTRL || wxUSE_TREECTRL + + if ( setFont ) + { + SetFont(GetDefaultAttributes().font); + } + } // set the size now if no initial size specified - SetInitialBestSize(size); + SetInitialSize(size); return true; } @@ -213,7 +241,7 @@ WXDWORD wxControl::MSWGetStyle(long style, WXDWORD *exstyle) const { long msStyle = wxWindow::MSWGetStyle(style, exstyle); - if ( AcceptsFocus() ) + if ( AcceptsFocusFromKeyboard() ) { msStyle |= WS_TABSTOP; } @@ -296,7 +324,6 @@ bool wxControl::ProcessCommand(wxCommandEvent& event) return GetEventHandler()->ProcessEvent(event); } -#ifdef __WIN95__ bool wxControl::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARAM* result) @@ -344,7 +371,6 @@ bool wxControl::MSWOnNotify(int idCtrl, return GetEventHandler()->ProcessEvent(event); } -#endif // Win95 WXHBRUSH wxControl::DoMSWControlColor(WXHDC pDC, wxColour colBg, WXHWND hWnd) { @@ -376,14 +402,15 @@ WXHBRUSH wxControl::DoMSWControlColor(WXHDC pDC, wxColour colBg, WXHWND hWnd) hbr = (WXHBRUSH)brush->GetResourceHandle(); - // if we use custom background, we should set foreground ourselves too - if ( !m_hasFgCol ) - { - ::SetTextColor(hdc, ::GetSysColor(COLOR_WINDOWTEXT)); - } - //else: already set above } + // if we use custom background, we should set foreground ourselves too + if ( hbr && !m_hasFgCol ) + { + ::SetTextColor(hdc, ::GetSysColor(COLOR_WINDOWTEXT)); + } + //else: already set above + return hbr; }