X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/eae4425db65fd3399aecdc70a8a05cc4f82d1eec..be74a2a21a491f5d0ec6a333b2fdc4bedb578eaa:/src/msw/settings.cpp diff --git a/src/msw/settings.cpp b/src/msw/settings.cpp index 55939bf02b..4fbc2299f6 100644 --- a/src/msw/settings.cpp +++ b/src/msw/settings.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: msw/settings.cpp +// Name: src/msw/settings.cpp // Purpose: wxSystemSettingsNative implementation for MSW // Author: Julian Smart // Modified by: @@ -24,25 +24,24 @@ #pragma hdrstop #endif +#include "wx/settings.h" + #ifndef WX_PRECOMP #include "wx/utils.h" #include "wx/gdicmn.h" + #include "wx/module.h" #endif -#include "wx/settings.h" - #include "wx/msw/private.h" +#include "wx/msw/missing.h" // for SM_CXCURSOR, SM_CYCURSOR, SM_TABLETPC +#include "wx/msw/private/metrics.h" #ifndef SPI_GETFLATMENU #define SPI_GETFLATMENU 0x1022 #endif -#include "wx/module.h" #include "wx/fontutil.h" - -#ifdef __WXWINCE__ // for SM_CXCURSOR and SM_CYCURSOR -#include "wx/msw/wince/missing.h" -#endif // __WXWINCE__ +#include "wx/fontenum.h" // ---------------------------------------------------------------------------- // private classes @@ -87,13 +86,12 @@ IMPLEMENT_DYNAMIC_CLASS(wxSystemSettingsModule, wxModule) bool wxSystemSettingsModule::OnInit() { - return TRUE; + return true; } void wxSystemSettingsModule::OnExit() { - delete gs_fontDefault; - gs_fontDefault = NULL; + wxDELETE(gs_fontDefault); } // ---------------------------------------------------------------------------- @@ -110,7 +108,7 @@ wxColour wxSystemSettingsNative::GetColour(wxSystemColour index) // is no invalid colour value we use hasCol as the real indicator of // whether colSys was initialized or not COLORREF colSys = 0; - bool hasCol = FALSE; + bool hasCol = false; // the default colours for the entries after BTNHIGHLIGHT static const COLORREF s_defaultSysColors[] = @@ -130,7 +128,17 @@ wxColour wxSystemSettingsNative::GetColour(wxSystemColour index) 0, // MENUBAR (unused) }; - if ( index == wxSYS_COLOUR_LISTBOX ) + if ( index == wxSYS_COLOUR_LISTBOXTEXT) + { + // there is no standard colour with this index, map to another one + index = wxSYS_COLOUR_WINDOWTEXT; + } + else if ( index == wxSYS_COLOUR_LISTBOXHIGHLIGHTTEXT) + { + // there is no standard colour with this index, map to another one + index = wxSYS_COLOUR_HIGHLIGHTTEXT; + } + else if ( index == wxSYS_COLOUR_LISTBOX ) { // there is no standard colour with this index, map to another one index = wxSYS_COLOUR_WINDOW; @@ -141,14 +149,12 @@ wxColour wxSystemSettingsNative::GetColour(wxSystemColour index) // all Windows version, for the other ones we have to check bool useDefault; - // none of the is supported under Win16 anyhow -#ifdef __WIN32__ int verMaj, verMin; wxGetOsVersion(&verMaj, &verMin); if ( verMaj < 4 ) { // NT 3.5 - useDefault = TRUE; + useDefault = true; } else if ( verMaj == 4 ) { @@ -163,21 +169,18 @@ wxColour wxSystemSettingsNative::GetColour(wxSystemColour index) else // >= 5.1 { // 5.1 is Windows XP - useDefault = FALSE; - // Determine if we are using flat menus, only then allow wxSYS_COLOUR_MENUBAR - if ( index == wxSYS_COLOUR_MENUBAR ) - { - BOOL isFlat ; - if ( SystemParametersInfo( SPI_GETFLATMENU , 0 ,&isFlat, 0 ) ) - { - if ( !isFlat ) - index = wxSYS_COLOUR_MENU ; - } - } - } -#else - useDefault = TRUE; -#endif // __WIN32__ + useDefault = false; + // Determine if we are using flat menus, only then allow wxSYS_COLOUR_MENUBAR + if ( index == wxSYS_COLOUR_MENUBAR ) + { + BOOL isFlat ; + if ( SystemParametersInfo( SPI_GETFLATMENU , 0 ,&isFlat, 0 ) ) + { + if ( !isFlat ) + index = wxSYS_COLOUR_MENU ; + } + } + } if ( useDefault ) { @@ -194,10 +197,10 @@ wxColour wxSystemSettingsNative::GetColour(wxSystemColour index) unsigned int n = index - wxSYS_COLOUR_BTNHIGHLIGHT; wxASSERT_MSG( n < WXSIZEOF(s_defaultSysColors), - _T("forgot tp update the default colours array") ); + wxT("forgot tp update the default colours array") ); colSys = s_defaultSysColors[n]; - hasCol = TRUE; + hasCol = true; } } } @@ -211,7 +214,9 @@ wxColour wxSystemSettingsNative::GetColour(wxSystemColour index) #endif } - return wxRGBToColour(colSys); + wxColour ret = wxRGBToColour(colSys); + wxASSERT(ret.IsOk()); + return ret; } // ---------------------------------------------------------------------------- @@ -241,12 +246,12 @@ wxFont wxCreateFontFromStockObject(int index) } else { - wxFAIL_MSG( _T("failed to get LOGFONT") ); + wxFAIL_MSG( wxT("failed to get LOGFONT") ); } } else // GetStockObject() failed { - wxFAIL_MSG( _T("stock font not found") ); + wxFAIL_MSG( wxT("stock font not found") ); } return font; @@ -255,32 +260,50 @@ wxFont wxCreateFontFromStockObject(int index) wxFont wxSystemSettingsNative::GetFont(wxSystemFont index) { #ifdef __WXWINCE__ - // this one is special: we don't get it from GetStockObject() - if ( index == wxSYS_ICONTITLE_FONT ) + // under CE only a single SYSTEM_FONT exists + index; + + if ( !gs_fontDefault ) { - LOGFONT lf; - SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(lf), &lf, 0); - return wxCreateFontFromLogFont(&lf); + gs_fontDefault = new wxFont(wxCreateFontFromStockObject(SYSTEM_FONT)); } -#endif // __WXWINCE__ - // wxWindow ctor calls GetSystemFont(wxSYS_DEFAULT_GUI_FONT) so we're - // called fairly often - this is why we cache this particular font - bool isDefaultRequested = index == wxSYS_DEFAULT_GUI_FONT; - if ( isDefaultRequested && gs_fontDefault ) + wxASSERT(gs_fontDefault->IsOk() && + wxFontEnumerator::IsValidFacename(gs_fontDefault->GetFaceName())); + return *gs_fontDefault; +#else // !__WXWINCE__ + // wxWindow ctor calls GetFont(wxSYS_DEFAULT_GUI_FONT) so we're + // called fairly often -- this is why we cache this particular font + if ( index == wxSYS_DEFAULT_GUI_FONT ) { + if ( !gs_fontDefault ) + { + // http://blogs.msdn.com/oldnewthing/archive/2005/07/07/436435.aspx + // explains why neither SYSTEM_FONT nor DEFAULT_GUI_FONT should be + // used here + // + // the message box font seems to be the one which should be used + // for most (simple) controls, e.g. buttons and such but other + // controls may prefer to use lfStatusFont or lfCaptionFont if it + // is more appropriate for them + wxNativeFontInfo info; + info.lf = wxMSWImpl::GetNonClientMetrics().lfMessageFont; + gs_fontDefault = new wxFont(info); + } + return *gs_fontDefault; } wxFont font = wxCreateFontFromStockObject(index); - if ( isDefaultRequested ) - { - // if we got here it means we hadn't cached it yet - do now - gs_fontDefault = new wxFont(font); - } + wxASSERT(font.IsOk()); + +#if wxUSE_FONTENUM + wxASSERT(wxFontEnumerator::IsValidFacename(font.GetFaceName())); +#endif // wxUSE_FONTENUM return font; +#endif // __WXWINCE__/!__WXWINCE__ } // ---------------------------------------------------------------------------- @@ -305,8 +328,12 @@ static const int gs_metricsMap[] = SM_CXBORDER, SM_CYBORDER, +#ifdef SM_CXCURSOR SM_CXCURSOR, SM_CYCURSOR, +#else + -1, -1, +#endif SM_CXDOUBLECLK, SM_CYDOUBLECLK, #if defined(__WIN32__) && defined(SM_CXDRAG) @@ -346,7 +373,7 @@ static const int gs_metricsMap[] = -1, -1, -1, -1, #endif SM_CYHSCROLL, - SM_CXVSCROLL, + SM_CXHSCROLL, SM_CXVSCROLL, SM_CYVSCROLL, #ifdef SM_CYVTHUMB @@ -371,28 +398,37 @@ static const int gs_metricsMap[] = #else -1, #endif + // SM_SWAPBUTTON is not available under CE and it doesn't make sense to ask + // for it there #ifdef SM_SWAPBUTTON SM_SWAPBUTTON, #else - -1 + -1, #endif + -1 // wxSYS_DCLICK_MSEC - not available as system metric }; // Get a system metric, e.g. scrollbar size -int wxSystemSettingsNative::GetMetric(wxSystemMetric index) +int wxSystemSettingsNative::GetMetric(wxSystemMetric index, wxWindow* WXUNUSED(win)) { #ifdef __WXMICROWIN__ // TODO: probably use wxUniv themes functionality return 0; #else // !__WXMICROWIN__ wxCHECK_MSG( index > 0 && (size_t)index < WXSIZEOF(gs_metricsMap), 0, - _T("invalid metric") ); + wxT("invalid metric") ); + + if ( index == wxSYS_DCLICK_MSEC ) + { + // This one is not a Win32 system metric + return ::GetDoubleClickTime(); + } int indexMSW = gs_metricsMap[index]; if ( indexMSW == -1 ) { // not supported under current system - return 0; + return -1; } int rc = ::GetSystemMetrics(indexMSW); @@ -412,11 +448,71 @@ bool wxSystemSettingsNative::HasFeature(wxSystemFeature index) { case wxSYS_CAN_ICONIZE_FRAME: case wxSYS_CAN_DRAW_FRAME_DECORATIONS: - return TRUE; + return true; + + case wxSYS_TABLET_PRESENT: + return ::GetSystemMetrics(SM_TABLETPC) != 0; + + default: + wxFAIL_MSG( wxT("unknown system feature") ); + + return false; + } +} + +// ---------------------------------------------------------------------------- +// function from wx/msw/wrapcctl.h: there is really no other place for it... +// ---------------------------------------------------------------------------- + +#if wxUSE_LISTCTRL || wxUSE_TREECTRL + +extern wxFont wxGetCCDefaultFont() +{ +#ifndef __WXWINCE__ + // under the systems enumerated below (anything released after Win98), the + // default font used for the common controls seems to be the desktop font + // which is also used for the icon titles and not the stock default GUI + // font + bool useIconFont; + int verMaj, verMin; + switch ( wxGetOsVersion(&verMaj, &verMin) ) + { + case wxOS_WINDOWS_9X: + // 4.10 is Win98 + useIconFont = verMaj == 4 && verMin >= 10; + break; + + case wxOS_WINDOWS_NT: + // 5.0 is Win2k + useIconFont = verMaj >= 5; + break; default: - wxFAIL_MSG( _T("unknown system feature") ); + useIconFont = false; + } - return FALSE; + if ( useIconFont ) + { + LOGFONT lf; + if ( ::SystemParametersInfo + ( + SPI_GETICONTITLELOGFONT, + sizeof(lf), + &lf, + 0 + ) ) + { + return wxFont(wxCreateFontFromLogFont(&lf)); + } + else + { + wxLogLastError(wxT("SystemParametersInfo(SPI_GETICONTITLELOGFONT")); + } } +#endif // __WXWINCE__ + + // fall back to the default font for the normal controls + return wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT); } + +#endif // wxUSE_LISTCTRL || wxUSE_TREECTRL