X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/783e2cc6489ddc014176c9e7556921332921be98..a843caf3e1355f0fe21e2ee59c1385b58e347c02:/src/msw/menu.cpp diff --git a/src/msw/menu.cpp b/src/msw/menu.cpp index 462bea448b..f0069e6407 100644 --- a/src/msw/menu.cpp +++ b/src/msw/menu.cpp @@ -17,10 +17,6 @@ // headers // --------------------------------------------------------------------------- -#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) - #pragma implementation "menu.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -62,6 +58,17 @@ // other standard headers #include +#if wxUSE_OWNER_DRAWN && defined(MIIM_BITMAP) + #include "wx/dynlib.h" +#endif + +#ifndef MNS_CHECKORBMP + #define MNS_CHECKORBMP 0x04000000 +#endif +#ifndef MIM_STYLE + #define MIM_STYLE 0x00000010 +#endif + // ---------------------------------------------------------------------------- // global variables // ---------------------------------------------------------------------------- @@ -78,7 +85,8 @@ static const int idMenuTitle = -3; // ---------------------------------------------------------------------------- // make the given menu item default -static void SetDefaultMenuItem(HMENU hmenu, UINT id) +static void SetDefaultMenuItem(HMENU WXUNUSED_IN_WINCE(hmenu), + UINT WXUNUSED_IN_WINCE(id)) { #ifndef __WXWINCE__ MENUITEMINFO mii; @@ -91,9 +99,6 @@ static void SetDefaultMenuItem(HMENU hmenu, UINT id) { wxLogLastError(wxT("SetMenuItemInfo")); } -#else - wxUnusedVar(hmenu); - wxUnusedVar(id); #endif } @@ -117,7 +122,7 @@ UINT GetMenuState(HMENU hMenu, UINT id, UINT flags) #include -WX_DEFINE_LIST( wxMenuInfoList ) ; +WX_DEFINE_LIST( wxMenuInfoList ) #if wxUSE_EXTENDED_RTTI @@ -296,6 +301,16 @@ void wxMenu::UpdateAccel(wxMenuItem *item) } else if ( !item->IsSeparator() ) { + // recurse upwards: we should only modify m_accels of the top level + // menus, not of the submenus as wxMenuBar doesn't look at them + // (alternative and arguable cleaner solution would be to recurse + // downwards in GetAccelCount() and CopyAccels()) + if ( GetParent() ) + { + GetParent()->UpdateAccel(item); + return; + } + // find the (new) accel for this item wxAcceleratorEntry *accel = wxGetAccelFromString(item->GetText()); if ( accel ) @@ -374,10 +389,15 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) LPCTSTR pData = NULL; if ( pos == (size_t)-1 ) { - // append at the end - pos = ::GetMenuItemCount(GetHmenu()); + // append at the end (note that the item is already appended to + // internal data structures) + pos = GetMenuItemCount() - 1; } + // adjust position to account for the title, if any + if ( !m_title.empty() ) + pos += 2; // for the title itself and its separator + BOOL ok = false; // check if we have something more than a simple text item @@ -428,10 +448,19 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos) // case in wx API WinStruct mi; - mi.fMask = MIM_STYLE; - mi.dwStyle = MNS_CHECKORBMP; - if ( !::SetMenuInfo(GetHmenu(), &mi) ) - wxLogLastError(_T("SetMenuInfo(MNS_NOCHECK)")); + // don't call SetMenuInfo() directly, this would prevent + // the app from starting up under Windows 95/NT 4 + typedef BOOL (WINAPI *SetMenuInfo_t)(HMENU, MENUINFO *); + + wxDynamicLibrary dllUser(_T("user32")); + wxDYNLIB_FUNCTION(SetMenuInfo_t, SetMenuInfo, dllUser); + if ( pfnSetMenuInfo ) + { + mi.fMask = MIM_STYLE; + mi.dwStyle = MNS_CHECKORBMP; + if ( !(*pfnSetMenuInfo)(GetHmenu(), &mi) ) + wxLogLastError(_T("SetMenuInfo(MNS_NOCHECK)")); + } // tell the item that it's not really owner-drawn but only // needs to draw its bitmap, the rest is done by Windows