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
This commit is contained in:
Jamie Gadd
2006-02-24 14:19:12 +00:00
parent 605c2c4ac6
commit 3c96418b71
6 changed files with 78 additions and 38 deletions

View File

@@ -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:

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);

View File

@@ -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

View File

@@ -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()
{