From 3c96418b71850dff63106c9ac68637c7abba7b14 Mon Sep 17 00:00:00 2001 From: Jamie Gadd <jrgadd2@cs.latrobe.edu.au> Date: Fri, 24 Feb 2006 14:19:12 +0000 Subject: [PATCH] Make wx{List,Tree}Ctrl resize their standard font if the user changes the system font. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@37707 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 2 ++ include/wx/msw/toplevel.h | 5 ----- include/wx/msw/window.h | 1 + src/msw/control.cpp | 39 ++++++++++++++++++++++++++++++++++----- src/msw/toplevel.cpp | 30 ++---------------------------- src/msw/window.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 78 insertions(+), 38 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 493d21b9bf..6d7cc77b54 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -134,6 +134,8 @@ wxMSW: - Link oleacc.lib conditionally. - Drag and drop now works inside static boxes. - Fall back to unthemed wxNotebook if specified orientation not available. +- wxListCtrl and wxTreeCtrl now resize their standard font if the user + changes the system font. wxGTK: diff --git a/include/wx/msw/toplevel.h b/include/wx/msw/toplevel.h index 3647a33b9b..e36cedce96 100644 --- a/include/wx/msw/toplevel.h +++ b/include/wx/msw/toplevel.h @@ -87,11 +87,6 @@ public: virtual bool MSWShouldPreProcessMessage(WXMSG* pMsg); #endif // __SMARTPHONE__ && __WXWINCE__ -#if defined(__SMARTPHONE__) || defined(__POCKETPC__) - // Soft Input Panel (SIP) change notification - virtual bool HandleSettingChange(WXWPARAM wParam, WXLPARAM lParam); -#endif - // translate wxWidgets flags to Windows ones virtual WXDWORD MSWGetStyle(long flags, WXDWORD *exstyle) const; diff --git a/include/wx/msw/window.h b/include/wx/msw/window.h index 3b7ad3fb3c..e95c957a2f 100644 --- a/include/wx/msw/window.h +++ b/include/wx/msw/window.h @@ -299,6 +299,7 @@ public: bool HandleSysColorChange(); bool HandleDisplayChange(); bool HandleCaptureChanged(WXHWND gainedCapture); + bool HandleSettingChange(WXWPARAM wParam, WXLPARAM lParam); bool HandleQueryEndSession(long logOff, bool *mayEnd); bool HandleEndSession(bool endSession, long logOff); diff --git a/src/msw/control.cpp b/src/msw/control.cpp index a5a7431b76..e8a3e921d8 100644 --- a/src/msw/control.cpp +++ b/src/msw/control.cpp @@ -36,9 +36,13 @@ #include "wx/control.h" -#if wxUSE_NOTEBOOK - #include "wx/notebook.h" -#endif // wxUSE_NOTEBOOK +#if wxUSE_LISTCTRL + #include "wx/listctrl.h" +#endif // wxUSE_LISTCTRL + +#if wxUSE_TREECTRL + #include "wx/treectrl.h" +#endif // wxUSE_TREECTRL #include "wx/msw/private.h" #include "wx/msw/uxtheme.h" @@ -165,8 +169,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); diff --git a/src/msw/toplevel.cpp b/src/msw/toplevel.cpp index e861e661ef..fb4efe5882 100644 --- a/src/msw/toplevel.cpp +++ b/src/msw/toplevel.cpp @@ -312,15 +312,6 @@ WXHWND wxTopLevelWindowMSW::MSWGetParent() const return (WXHWND)hwndParent; } -#if defined(__SMARTPHONE__) || defined(__POCKETPC__) -bool wxTopLevelWindowMSW::HandleSettingChange(WXWPARAM wParam, WXLPARAM lParam) -{ - SHACTIVATEINFO* info = (SHACTIVATEINFO*) m_activateInfo; - if (!info) return false; - return SHHandleWMSettingChange(GetHwnd(), wParam, lParam, info) == TRUE; -} -#endif - WXLRESULT wxTopLevelWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM lParam) { WXLRESULT rc = 0; @@ -345,11 +336,6 @@ WXLRESULT wxTopLevelWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WX break; } - case WM_SETTINGCHANGE: - { - processed = HandleSettingChange(wParam,lParam); - break; - } case WM_HIBERNATE: { if (wxTheApp) @@ -1095,8 +1081,8 @@ void wxTopLevelWindowMSW::OnActivate(wxActivateEvent& event) LONG APIENTRY _EXPORT wxDlgProc(HWND hDlg, UINT message, - WPARAM wParam, - LPARAM lParam) + WPARAM WXUNUSED(wParam), + LPARAM WXUNUSED(lParam)) { switch ( message ) { @@ -1128,18 +1114,6 @@ wxDlgProc(HWND hDlg, // ourselves, we return FALSE for it as well return FALSE; } - - case WM_SETTINGCHANGE: - { -#if defined(__SMARTPHONE__) || defined(__POCKETPC__) - wxTopLevelWindow *tlw = wxDynamicCast(wxGetWindowFromHWND(hDlg), wxTopLevelWindow); - if(tlw) return tlw->HandleSettingChange(wParam,lParam) ? TRUE : FALSE; -#else - wxUnusedVar(wParam); - wxUnusedVar(lParam); -#endif - break; - } } // for almost all messages, returning FALSE means that we didn't process diff --git a/src/msw/window.cpp b/src/msw/window.cpp index 7328f6539a..ded4f2b2ca 100644 --- a/src/msw/window.cpp +++ b/src/msw/window.cpp @@ -2849,6 +2849,10 @@ WXLRESULT wxWindowMSW::MSWWindowProc(WXUINT message, WXWPARAM wParam, WXLPARAM l processed = HandleCaptureChanged((WXHWND) (HWND) lParam); break; + case WM_SETTINGCHANGE: + processed = HandleSettingChange(wParam, lParam); + break; + case WM_QUERYNEWPALETTE: processed = HandleQueryNewPalette(); break; @@ -3933,6 +3937,41 @@ bool wxWindowMSW::HandleCaptureChanged(WXHWND hWndGainedCapture) return GetEventHandler()->ProcessEvent(event); } +bool wxWindowMSW::HandleSettingChange(WXWPARAM wParam, WXLPARAM lParam) +{ + // despite MSDN saying "(This message cannot be sent directly to a window.)" + // we need to send this to child windows (it is only sent to top-level + // windows) so {list,tree}ctrls can adjust their font size if necessary + // this is exactly how explorer does it to enable the font size changes + + wxWindowList::compatibility_iterator node = GetChildren().GetFirst(); + while ( node ) + { + // top-level windows already get this message from the system + wxWindow *win = node->GetData(); + if ( !win->IsTopLevel() ) + { + ::SendMessage(GetHwndOf(win), WM_SETTINGCHANGE, wParam, lParam); + } + + node = node->GetNext(); + } + +#if defined(__SMARTPHONE__) || defined(__POCKETPC__) + if ( IsTopLevel() ) + { + SHACTIVATEINFO *info = (SHACTIVATEINFO*) m_activateInfo; + if ( info ) + { + return SHHandleWMSettingChange(GetHwnd(), wParam, lParam, info) == TRUE; + } + } +#endif // defined(__SMARTPHONE__) || defined(__POCKETPC__) + + // let the system handle it + return false; +} + bool wxWindowMSW::HandleQueryNewPalette() { -- 2.47.2