X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6c9a19aabab3a878b565e6c2a5f2a3824277c4dc..ff699386b9b709c069ecc3c24acd6f7f4644d23e:/src/msw/ownerdrw.cpp diff --git a/src/msw/ownerdrw.cpp b/src/msw/ownerdrw.cpp index d47642669e..f3bafeae3c 100644 --- a/src/msw/ownerdrw.cpp +++ b/src/msw/ownerdrw.cpp @@ -38,6 +38,53 @@ #if wxUSE_OWNER_DRAWN +class wxMSWSystemMenuFontModule : public wxModule +{ +public: + + virtual bool OnInit() + { + ms_systemMenuFont = new wxFont; + +#if defined(__WXMSW__) && defined(__WIN32__) && defined(SM_CXMENUCHECK) + NONCLIENTMETRICS nm; + nm.cbSize = sizeof(NONCLIENTMETRICS); + SystemParametersInfo(SPI_GETNONCLIENTMETRICS,0,&nm,0); + + ms_systemMenuButtonWidth = nm.iMenuHeight; + ms_systemMenuHeight = nm.iMenuHeight; + + // create menu font + wxNativeFontInfo info; + memcpy(&info.lf, &nm.lfMenuFont, sizeof(LOGFONT)); + ms_systemMenuFont->Create(info); +#endif + + return true; + } + + virtual void OnExit() + { + delete ms_systemMenuFont; + ms_systemMenuFont = NULL; + } + + static wxFont* ms_systemMenuFont; + static int ms_systemMenuButtonWidth; // windows clean install default + static int ms_systemMenuHeight; // windows clean install default +private: + DECLARE_DYNAMIC_CLASS(wxMSWSystemMenuFontModule) +}; + +// these static variables are by the wxMSWSystemMenuFontModule object +// and reflect the system settings returned by the Win32 API's +// SystemParametersInfo() call. + +wxFont* wxMSWSystemMenuFontModule::ms_systemMenuFont = NULL; +int wxMSWSystemMenuFontModule::ms_systemMenuButtonWidth = 18; // windows clean install default +int wxMSWSystemMenuFontModule::ms_systemMenuHeight = 18; // windows clean install default + +IMPLEMENT_DYNAMIC_CLASS(wxMSWSystemMenuFontModule, wxModule) // ============================================================================ // implementation of wxOwnerDrawn class @@ -46,10 +93,9 @@ // ctor // ---- wxOwnerDrawn::wxOwnerDrawn(const wxString& str, - bool bCheckable, bool WXUNUSED(bMenuItem)) + bool bCheckable, bool bMenuItem) : m_strName(str) { -#if defined(__WXMSW__) && defined(__WIN32__) && defined(SM_CXMENUCHECK) // get the default menu height and font from the system NONCLIENTMETRICS nm; nm.cbSize = sizeof (NONCLIENTMETRICS); @@ -60,30 +106,24 @@ wxOwnerDrawn::wxOwnerDrawn(const wxString& str, // menu icons and checkmarks if (ms_nDefaultMarginWidth == 0) { - ms_nDefaultMarginWidth = nm.iMenuWidth; - ms_nLastMarginWidth = nm.iMenuWidth; + ms_nDefaultMarginWidth = wxMSWSystemMenuFontModule::ms_systemMenuButtonWidth; + ms_nLastMarginWidth = wxMSWSystemMenuFontModule::ms_systemMenuButtonWidth; } - wxNativeFontInfo info; - memcpy(&info.lf, &nm.lfMenuFont, sizeof(LOGFONT)); - m_font.Create(info); -#else - // windows clean install default - m_nMinHeight = 18; - - if (ms_nDefaultMarginWidth == 0) + if (wxMSWSystemMenuFontModule::ms_systemMenuFont->Ok() && bMenuItem) { - ms_nDefaultMarginWidth = 18; - ms_nLastMarginWidth = 18; + m_font = *wxMSWSystemMenuFontModule::ms_systemMenuFont; + } + else + { + m_font = *wxNORMAL_FONT; } - if (wxNORMAL_FONT) - m_font = *wxNORMAL_FONT; -#endif m_bCheckable = bCheckable; m_bOwnerDrawn = FALSE; m_nHeight = 0; m_nMarginWidth = ms_nLastMarginWidth; + m_nMinHeight = wxMSWSystemMenuFontModule::ms_systemMenuHeight; } @@ -188,7 +228,7 @@ bool wxOwnerDrawn::OnMeasureItem(size_t *pwidth, size_t *pheight) // get drawn embossed? How can we tell DrawState that we don't want the // embossing? -#if defined(__WIN32__) && !defined(__SC__) && !defined(__TWIN32__) +#if defined(__WIN32__) && !defined(__SYMANTEC__) && !defined(__TWIN32__) #define O_DRAW_NATIVE_API // comments below explain why I use it #endif