1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        msw/settings.cpp 
   3 // Purpose:     wxSystemSettingsNative implementation for MSW 
   4 // Author:      Julian Smart 
   8 // Copyright:   (c) Julian Smart 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // ============================================================================ 
  14 // ============================================================================ 
  16 // ---------------------------------------------------------------------------- 
  18 // ---------------------------------------------------------------------------- 
  20 // For compilers that support precompilation, includes "wx.h". 
  21 #include "wx/wxprec.h" 
  29     #include "wx/gdicmn.h" 
  32 #include "wx/settings.h" 
  34 #include "wx/msw/private.h" 
  36 #ifndef SPI_GETFLATMENU 
  37 #define SPI_GETFLATMENU                     0x1022 
  40 #include "wx/module.h" 
  41 #include "wx/fontutil.h" 
  43 #ifdef __WXWINCE__ // for SM_CXCURSOR and SM_CYCURSOR 
  44 #include "wx/msw/wince/missing.h" 
  47 // ---------------------------------------------------------------------------- 
  49 // ---------------------------------------------------------------------------- 
  51 // the module which is used to clean up wxSystemSettingsNative data (this is a 
  52 // singleton class so it can't be done in the dtor) 
  53 class wxSystemSettingsModule 
: public wxModule
 
  56     virtual bool OnInit(); 
  57     virtual void OnExit(); 
  60     DECLARE_DYNAMIC_CLASS(wxSystemSettingsModule
) 
  63 // ---------------------------------------------------------------------------- 
  65 // ---------------------------------------------------------------------------- 
  67 // the font returned by GetFont(wxSYS_DEFAULT_GUI_FONT): it is created when 
  68 // GetFont() is called for the first time and deleted by wxSystemSettingsModule 
  69 static wxFont 
*gs_fontDefault 
= NULL
; 
  71 // ============================================================================ 
  73 // ============================================================================ 
  75 // TODO: see ::SystemParametersInfo for all sorts of Windows settings. 
  76 // Different args are required depending on the id. How does this differ 
  77 // from GetSystemMetric, and should it? Perhaps call it GetSystemParameter 
  78 // and pass an optional void* arg to get further info. 
  79 // Should also have SetSystemParameter. 
  80 // Also implement WM_WININICHANGE (NT) / WM_SETTINGCHANGE (Win95) 
  82 // ---------------------------------------------------------------------------- 
  83 // wxSystemSettingsModule 
  84 // ---------------------------------------------------------------------------- 
  86 IMPLEMENT_DYNAMIC_CLASS(wxSystemSettingsModule
, wxModule
) 
  88 bool wxSystemSettingsModule::OnInit() 
  93 void wxSystemSettingsModule::OnExit() 
  95     delete gs_fontDefault
; 
  96     gs_fontDefault 
= NULL
; 
  99 // ---------------------------------------------------------------------------- 
 100 // wxSystemSettingsNative 
 101 // ---------------------------------------------------------------------------- 
 103 // ---------------------------------------------------------------------------- 
 105 // ---------------------------------------------------------------------------- 
 107 wxColour 
wxSystemSettingsNative::GetColour(wxSystemColour index
) 
 109     // we use 0 as the default value just to avoid compiler warnings, as there 
 110     // is no invalid colour value we use hasCol as the real indicator of 
 111     // whether colSys was initialized or not 
 115     // the default colours for the entries after BTNHIGHLIGHT 
 116     static const COLORREF s_defaultSysColors
[] = 
 118         0x000000,   // 3DDKSHADOW 
 120         0x000000,   // INFOTEXT 
 123         0,          // filler - no std colour with this index 
 125         // TODO: please fill in the standard values of those, I don't have them 
 127         0,          // GRADIENTACTIVECAPTION 
 128         0,          // GRADIENTINACTIVECAPTION 
 130         0,          // MENUBAR (unused) 
 133     if ( index 
== wxSYS_COLOUR_LISTBOX 
) 
 135         // there is no standard colour with this index, map to another one 
 136         index 
= wxSYS_COLOUR_WINDOW
; 
 138     else if ( index 
> wxSYS_COLOUR_BTNHIGHLIGHT 
) 
 140         // the indices before BTNHIGHLIGHT are understood by GetSysColor() in 
 141         // all Windows version, for the other ones we have to check 
 145         wxGetOsVersion(&verMaj
, &verMin
); 
 151         else if ( verMaj 
== 4 ) 
 154             useDefault 
= index 
> wxSYS_COLOUR_INFOBK
; 
 156         else if ( verMaj 
== 5 && verMin 
== 0 ) 
 159             useDefault 
= index 
> wxSYS_COLOUR_GRADIENTINACTIVECAPTION
; 
 165                         // Determine if we are using flat menus, only then allow wxSYS_COLOUR_MENUBAR 
 166                         if ( index 
== wxSYS_COLOUR_MENUBAR 
) 
 169                                 if ( SystemParametersInfo( SPI_GETFLATMENU 
, 0 ,&isFlat
, 0 ) ) 
 172                                                 index 
= wxSYS_COLOUR_MENU 
; 
 179             // special handling for MENUBAR colour: we use this in wxToolBar 
 180             // and wxStatusBar to have correct bg colour under Windows XP 
 181             // (which uses COLOR_MENUBAR for them) but they should still look 
 182             // correctly under previous Windows versions as well 
 183             if ( index 
== wxSYS_COLOUR_MENUBAR 
) 
 185                 index 
= wxSYS_COLOUR_3DFACE
; 
 187             else // replace with default colour 
 189                 unsigned int n 
= index 
- wxSYS_COLOUR_BTNHIGHLIGHT
; 
 191                 wxASSERT_MSG( n 
< WXSIZEOF(s_defaultSysColors
), 
 192                               _T("forgot tp update the default colours array") ); 
 194                 colSys 
= s_defaultSysColors
[n
]; 
 203         colSys 
= ::GetSysColor(index
|SYS_COLOR_INDEX_FLAG
); 
 205         colSys 
= ::GetSysColor(index
); 
 209     return wxRGBToColour(colSys
); 
 212 // ---------------------------------------------------------------------------- 
 214 // ---------------------------------------------------------------------------- 
 216 wxFont 
wxCreateFontFromStockObject(int index
) 
 220     HFONT hFont 
= (HFONT
) ::GetStockObject(index
); 
 224         if ( ::GetObject(hFont
, sizeof(LOGFONT
), &lf
) != 0 ) 
 226             wxNativeFontInfo info
; 
 228             // Under MicroWindows we pass the HFONT as well 
 229             // because it's hard to convert HFONT -> LOGFONT -> HFONT 
 230             // It's OK to delete stock objects, the delete will be ignored. 
 231 #ifdef __WXMICROWIN__ 
 232             font
.Create(info
, (WXHFONT
) hFont
); 
 239             wxFAIL_MSG( _T("failed to get LOGFONT") ); 
 242     else // GetStockObject() failed 
 244         wxFAIL_MSG( _T("stock font not found") ); 
 250 wxFont 
wxSystemSettingsNative::GetFont(wxSystemFont index
) 
 253     // under CE only a single SYSTEM_FONT exists 
 256     if ( !gs_fontDefault 
) 
 258         gs_fontDefault 
= new wxFont(wxCreateFontFromStockObject(SYSTEM_FONT
)); 
 261     return *gs_fontDefault
; 
 262 #else // !__WXWINCE__ 
 263     // wxWindow ctor calls GetSystemFont(wxSYS_DEFAULT_GUI_FONT) so we're 
 264     // called fairly often -- this is why we cache this particular font 
 265     const bool isDefaultRequested 
= index 
== wxSYS_DEFAULT_GUI_FONT
; 
 266     if ( isDefaultRequested 
) 
 268         if ( gs_fontDefault 
) 
 269             return *gs_fontDefault
; 
 272     wxFont font 
= wxCreateFontFromStockObject(index
); 
 274     if ( isDefaultRequested 
) 
 276         // if we got here it means we hadn't cached it yet - do now 
 277         gs_fontDefault 
= new wxFont(font
); 
 281 #endif // __WXWINCE__/!__WXWINCE__ 
 284 // ---------------------------------------------------------------------------- 
 285 // system metrics/features 
 286 // ---------------------------------------------------------------------------- 
 288 // TODO: some of the "metrics" clearly should be features now that we have 
 291 // the conversion table from wxSystemMetric enum to GetSystemMetrics() param 
 293 // if the constant is not defined, put -1 in the table to indicate that it is 
 295 static const int gs_metricsMap
[] = 
 297     -1,  // wxSystemMetric enums start at 1, so give a dummy value for pos 0. 
 298 #if defined(__WIN32__) && !defined(__WXWINCE__) 
 310 #if defined(__WIN32__) && defined(SM_CXDRAG) 
 338 #if defined(__WIN32__) && defined(SM_CXSIZEFRAME) 
 357 #if defined(__WIN32__) && defined(SM_NETWORK) 
 367 #if defined(__WIN32__) && defined(SM_SHOWSOUNDS) 
 379 // Get a system metric, e.g. scrollbar size 
 380 int wxSystemSettingsNative::GetMetric(wxSystemMetric index
) 
 382 #ifdef __WXMICROWIN__ 
 383     // TODO: probably use wxUniv themes functionality 
 385 #else // !__WXMICROWIN__ 
 386     wxCHECK_MSG( index 
> 0 && (size_t)index 
< WXSIZEOF(gs_metricsMap
), 0, 
 387                  _T("invalid metric") ); 
 389     int indexMSW 
= gs_metricsMap
[index
]; 
 390     if ( indexMSW 
== -1 ) 
 392         // not supported under current system 
 396     int rc 
= ::GetSystemMetrics(indexMSW
); 
 397     if ( index 
== wxSYS_NETWORK_PRESENT 
) 
 399         // only the last bit is significant according to the MSDN 
 404 #endif // __WXMICROWIN__/!__WXMICROWIN__ 
 407 bool wxSystemSettingsNative::HasFeature(wxSystemFeature index
) 
 411         case wxSYS_CAN_ICONIZE_FRAME
: 
 412         case wxSYS_CAN_DRAW_FRAME_DECORATIONS
: 
 416             wxFAIL_MSG( _T("unknown system feature") ); 
 422 // ---------------------------------------------------------------------------- 
 423 // function from wx/msw/wrapcctl.h: there is really no other place for it... 
 424 // ---------------------------------------------------------------------------- 
 426 #if wxUSE_LISTCTRL || wxUSE_TREECTRL 
 428 extern wxFont 
wxGetCCDefaultFont() 
 431     // under the systems enumerated below (anything released after Win98), the 
 432     // default font used for the common controls seems to be the desktop font 
 433     // which is also used for the icon titles and not the stock default GUI 
 437     switch ( wxGetOsVersion(&verMaj
, &verMin
) ) 
 441             useIconFont 
= verMin 
== 4 && verMin 
>= 10; 
 446             useIconFont 
= verMaj 
>= 5; 
 456         if ( ::SystemParametersInfo
 
 458                     SPI_GETICONTITLELOGFONT
, 
 464             return wxFont(wxCreateFontFromLogFont(&lf
)); 
 468             wxLogLastError(_T("SystemParametersInfo(SPI_GETICONTITLELOGFONT")); 
 471 #endif // __WXWINCE__ 
 473     // fall back to the default font for the normal controls 
 474     return wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
); 
 477 #endif // wxUSE_LISTCTRL || wxUSE_TREECTRL