-class wxMSWSystemMenuFontModule : public wxModule
-{
-public:
- virtual bool OnInit()
- {
- return true;
- }
-
- virtual void OnExit()
- {
- if ( ms_systemMenuFont )
- {
- delete ms_systemMenuFont;
- ms_systemMenuFont = NULL;
- }
- }
-
- static const wxFont& GetSystemMenuFont()
- {
- if ( !ms_systemMenuFont )
- DoInitFont();
-
- return *ms_systemMenuFont;
- }
-
- static int GetSystemMenuHeight()
- {
- if ( !ms_systemMenuHeight )
- DoInitMetrics();
-
- return ms_systemMenuHeight;
- }
-
- static bool AlwaysShowCues()
- {
- if ( !ms_systemMenuHeight )
- DoInitMetrics();
-
- return ms_alwaysShowCues;
- }
-
-private:
- static NONCLIENTMETRICS GetNCM()
- {
- WinStruct<NONCLIENTMETRICS> nm;
- if ( !::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &nm, 0) )
- {
-#if WINVER >= 0x0600
- // a new field has been added to NONCLIENTMETRICS under Vista, so
- // the call to SystemParametersInfo() fails if we use the struct
- // size incorporating this new value on an older system -- retry
- // without it
- nm.cbSize -= sizeof(int);
- if ( !::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &nm, 0) )
-#endif // WINVER >= 0x0600
- {
- // maybe we should initialize the struct with some defaults?
- wxLogLastError(_T("SystemParametersInfo(SPI_GETNONCLIENTMETRICS)"));
- }
- }
-
- return nm;
- }
-
- static void DoInitMetrics()
- {
- // iMenuHeight is the menu bar height and the menu items are less tall,
- // although I don't know by how much -- below is the value for my system
- ms_systemMenuHeight = GetNCM().iMenuHeight - 4;
-
- wxASSERT_MSG( ms_systemMenuHeight > 0,
- "menu height should be positive" );
-
- if ( ::SystemParametersInfo(SPI_GETKEYBOARDCUES, 0,
- &ms_alwaysShowCues, 0) == 0 )
- {
- // if it's not supported, we must be on an old Windows version
- // which always shows them
- ms_alwaysShowCues = true;
- }
- }
-
- static void DoInitFont()
- {
- ms_systemMenuFont = new wxFont(wxNativeFontInfo(GetNCM().lfMenuFont));
- }
-
- static wxFont* ms_systemMenuFont;
- static int ms_systemMenuHeight;
- static bool ms_alwaysShowCues;
-
-
- DECLARE_DYNAMIC_CLASS(wxMSWSystemMenuFontModule)
-};
-
-// these static variables are from the wxMSWSystemMenuFontModule object
-// and reflect the system settings returned by the Win32 API's
-// SystemParametersInfo() call.
-
-wxFont* wxMSWSystemMenuFontModule::ms_systemMenuFont = NULL;
-int wxMSWSystemMenuFontModule::ms_systemMenuHeight = 0;
-bool wxMSWSystemMenuFontModule::ms_alwaysShowCues = false;
-
-IMPLEMENT_DYNAMIC_CLASS(wxMSWSystemMenuFontModule, wxModule)
-
-
-// VC++ 6 gives a warning here:
-//
-// return type for 'OwnerDrawnSet_wxImplementation_HashTable::iterator::
-// operator ->' is 'class wxOwnerDrawn ** ' (ie; not a UDT or reference to
-// a UDT. Will produce errors if applied using infix notation.
-//
-// shut it down
-#if defined __VISUALC__ && __VISUALC__ <= 1300
- #if __VISUALC__ >= 1200
- #pragma warning(push)
- #define POP_WARNINGS
- #endif
- #pragma warning(disable: 4284)
-#endif
-
-#include "wx/hashset.h"
-WX_DECLARE_HASH_SET(wxOwnerDrawn*, wxPointerHash, wxPointerEqual, OwnerDrawnSet);