]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/menu.cpp
Better fix
[wxWidgets.git] / src / msw / menu.cpp
index 27ccbc0fb8d453cb0ee84a7f0f0e66a954908b47..8ebd4952da6c279a3d4405943d80c9e6199e0c78 100644 (file)
@@ -97,7 +97,7 @@ typedef struct tagMENUINFO
 // ----------------------------------------------------------------------------
 
 // the (popup) menu title has this special id
 // ----------------------------------------------------------------------------
 
 // the (popup) menu title has this special id
-static const int idMenuTitle = -3;
+static const UINT idMenuTitle = (UINT)-3;
 
 // ----------------------------------------------------------------------------
 // private functions
 
 // ----------------------------------------------------------------------------
 // private functions
@@ -261,9 +261,15 @@ void wxMenu::Init()
 // The wxWindow destructor will take care of deleting the submenus.
 wxMenu::~wxMenu()
 {
 // The wxWindow destructor will take care of deleting the submenus.
 wxMenu::~wxMenu()
 {
-    if ( !::DestroyMenu(GetHmenu()) )
+    // we should free Windows resources only if Windows doesn't do it for us
+    // which happens if we're attached to a menubar or a submenu of another
+    // menu
+    if ( !IsAttached() && !GetParent() )
     {
     {
-        wxLogLastError(wxT("DestroyMenu"));
+        if ( !::DestroyMenu(GetHmenu()) )
+        {
+            wxLogLastError(wxT("DestroyMenu"));
+        }
     }
 
 #if wxUSE_ACCEL
     }
 
 #if wxUSE_ACCEL
@@ -381,19 +387,19 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos)
 
     // id is the numeric id for normal menu items and HMENU for submenus as
     // required by ::AppendMenu() API
 
     // id is the numeric id for normal menu items and HMENU for submenus as
     // required by ::AppendMenu() API
-    UINT id;
+    UINT_PTR id;
     wxMenu *submenu = pItem->GetSubMenu();
     if ( submenu != NULL ) {
         wxASSERT_MSG( submenu->GetHMenu(), wxT("invalid submenu") );
 
         submenu->SetParent(this);
 
     wxMenu *submenu = pItem->GetSubMenu();
     if ( submenu != NULL ) {
         wxASSERT_MSG( submenu->GetHMenu(), wxT("invalid submenu") );
 
         submenu->SetParent(this);
 
-        id = (UINT)submenu->GetHMenu();
+        id = (UINT_PTR)submenu->GetHMenu();
 
         flags |= MF_POPUP;
     }
     else {
 
         flags |= MF_POPUP;
     }
     else {
-        id = pItem->GetId();
+        id = pItem->GetMSWId();
     }
 
 
     }
 
 
@@ -558,7 +564,7 @@ bool wxMenu::DoInsertOrAppend(wxMenuItem *pItem, size_t pos)
 
 
     // if we just appended the title, highlight it
 
 
     // if we just appended the title, highlight it
-    if ( (int)id == idMenuTitle )
+    if ( id == idMenuTitle )
     {
         // visually select the menu title
         SetDefaultMenuItem(GetHmenu(), id);
     {
         // visually select the menu title
         SetDefaultMenuItem(GetHmenu(), id);
@@ -725,7 +731,7 @@ void wxMenu::SetTitle(const wxString& label)
         if ( !label.empty() )
         {
             if ( !::InsertMenu(hMenu, 0u, MF_BYPOSITION | MF_STRING,
         if ( !label.empty() )
         {
             if ( !::InsertMenu(hMenu, 0u, MF_BYPOSITION | MF_STRING,
-                               (unsigned)idMenuTitle, m_title.wx_str()) ||
+                               idMenuTitle, m_title.wx_str()) ||
                  !::InsertMenu(hMenu, 1u, MF_BYPOSITION, (unsigned)-1, NULL) )
             {
                 wxLogLastError(wxT("InsertMenu"));
                  !::InsertMenu(hMenu, 1u, MF_BYPOSITION, (unsigned)-1, NULL) )
             {
                 wxLogLastError(wxT("InsertMenu"));
@@ -761,7 +767,7 @@ void wxMenu::SetTitle(const wxString& label)
 #else
             if ( !ModifyMenu(hMenu, 0u,
                              MF_BYPOSITION | MF_STRING,
 #else
             if ( !ModifyMenu(hMenu, 0u,
                              MF_BYPOSITION | MF_STRING,
-                             (unsigned)idMenuTitle, m_title.wx_str()) )
+                             idMenuTitle, m_title.wx_str()) )
             {
                 wxLogLastError(wxT("ModifyMenu"));
             }
             {
                 wxLogLastError(wxT("ModifyMenu"));
             }
@@ -773,7 +779,7 @@ void wxMenu::SetTitle(const wxString& label)
     // put the title string in bold face
     if ( !m_title.empty() )
     {
     // put the title string in bold face
     if ( !m_title.empty() )
     {
-        SetDefaultMenuItem(GetHmenu(), (UINT)idMenuTitle);
+        SetDefaultMenuItem(GetHmenu(), idMenuTitle);
     }
 #endif // Win32
 }
     }
 #endif // Win32
 }
@@ -787,7 +793,7 @@ bool wxMenu::MSWCommand(WXUINT WXUNUSED(param), WXWORD id_)
     const int id = (signed short)id_;
 
     // ignore commands from the menu title
     const int id = (signed short)id_;
 
     // ignore commands from the menu title
-    if ( id != idMenuTitle )
+    if ( id != (int)idMenuTitle )
     {
         // update the check item when it's clicked
         wxMenuItem * const item = FindItem(id);
     {
         // update the check item when it's clicked
         wxMenuItem * const item = FindItem(id);
@@ -874,8 +880,9 @@ wxMenuBar::~wxMenuBar()
             toolMenuBar->SetMenuBar(NULL);
     }
 #else
             toolMenuBar->SetMenuBar(NULL);
     }
 #else
-
-    if ( m_hMenu )
+    // we should free Windows resources only if Windows doesn't do it for us
+    // which happens if we're attached to a frame
+    if (m_hMenu && !IsAttached())
     {
 #if defined(WINCE_WITH_COMMANDBAR)
         ::DestroyWindow((HWND) m_commandBar);
     {
 #if defined(WINCE_WITH_COMMANDBAR)
         ::DestroyWindow((HWND) m_commandBar);
@@ -973,7 +980,7 @@ WXHMENU wxMenuBar::Create()
         for ( i = 0, it = m_menus.begin(); i < count; i++, it++ )
         {
             if ( !::AppendMenu((HMENU)m_hMenu, MF_POPUP | MF_STRING,
         for ( i = 0, it = m_menus.begin(); i < count; i++, it++ )
         {
             if ( !::AppendMenu((HMENU)m_hMenu, MF_POPUP | MF_STRING,
-                               (UINT)(*it)->GetHMenu(),
+                               (UINT_PTR)(*it)->GetHMenu(),
                                m_titles[i].wx_str()) )
             {
                 wxLogLastError(wxT("AppendMenu"));
                                m_titles[i].wx_str()) )
             {
                 wxLogLastError(wxT("AppendMenu"));
@@ -1045,7 +1052,7 @@ void wxMenuBar::SetMenuLabel(size_t pos, const wxString& label)
 
     int mswpos = MSWPositionForWxMenu(GetMenu(pos),pos);
 
 
     int mswpos = MSWPositionForWxMenu(GetMenu(pos),pos);
 
-    UINT id;
+    UINT_PTR id;
     UINT flagsOld = ::GetMenuState((HMENU)m_hMenu, mswpos, MF_BYPOSITION);
     if ( flagsOld == 0xFFFFFFFF )
     {
     UINT flagsOld = ::GetMenuState((HMENU)m_hMenu, mswpos, MF_BYPOSITION);
     if ( flagsOld == 0xFFFFFFFF )
     {
@@ -1058,7 +1065,7 @@ void wxMenuBar::SetMenuLabel(size_t pos, const wxString& label)
     {
         // HIBYTE contains the number of items in the submenu in this case
         flagsOld &= 0xff;
     {
         // HIBYTE contains the number of items in the submenu in this case
         flagsOld &= 0xff;
-        id = (UINT)::GetSubMenu((HMENU)m_hMenu, mswpos);
+        id = (UINT_PTR)::GetSubMenu((HMENU)m_hMenu, mswpos);
     }
     else
     {
     }
     else
     {
@@ -1073,7 +1080,7 @@ void wxMenuBar::SetMenuLabel(size_t pos, const wxString& label)
     info.fType = MFT_STRING;
     info.cch = label.length();
     info.dwTypeData = wx_const_cast(wxChar *, label.wx_str());
     info.fType = MFT_STRING;
     info.cch = label.length();
     info.dwTypeData = wx_const_cast(wxChar *, label.wx_str());
-    if ( !SetMenuItemInfo(GetHmenu(), id, TRUE, & info) )
+    if ( !SetMenuItemInfo(GetHmenu(), id, TRUE, &info) )
     {
         wxLogLastError(wxT("SetMenuItemInfo"));
     }
     {
         wxLogLastError(wxT("SetMenuItemInfo"));
     }
@@ -1125,7 +1132,7 @@ wxMenu *wxMenuBar::Replace(size_t pos, wxMenu *menu, const wxString& title)
 
         if ( !::InsertMenu(GetHmenu(), (UINT)mswpos,
                            MF_BYPOSITION | MF_POPUP | MF_STRING,
 
         if ( !::InsertMenu(GetHmenu(), (UINT)mswpos,
                            MF_BYPOSITION | MF_POPUP | MF_STRING,
-                           (UINT)GetHmenuOf(menu), title.wx_str()) )
+                           (UINT_PTR)GetHmenuOf(menu), title.wx_str()) )
         {
             wxLogLastError(wxT("InsertMenu"));
         }
         {
             wxLogLastError(wxT("InsertMenu"));
         }
@@ -1192,7 +1199,7 @@ bool wxMenuBar::Insert(size_t pos, wxMenu *menu, const wxString& title)
 #else
         if ( !::InsertMenu(GetHmenu(), mswpos,
                            MF_BYPOSITION | MF_POPUP | MF_STRING,
 #else
         if ( !::InsertMenu(GetHmenu(), mswpos,
                            MF_BYPOSITION | MF_POPUP | MF_STRING,
-                           (UINT)GetHmenuOf(menu), title.wx_str()) )
+                           (UINT_PTR)GetHmenuOf(menu), title.wx_str()) )
         {
             wxLogLastError(wxT("InsertMenu"));
         }
         {
             wxLogLastError(wxT("InsertMenu"));
         }
@@ -1251,7 +1258,7 @@ bool wxMenuBar::Append(wxMenu *menu, const wxString& title)
         }
 #else
         if ( !::AppendMenu(GetHmenu(), MF_POPUP | MF_STRING,
         }
 #else
         if ( !::AppendMenu(GetHmenu(), MF_POPUP | MF_STRING,
-                           (UINT)submenu, title.wx_str()) )
+                           (UINT_PTR)submenu, title.wx_str()) )
         {
             wxLogLastError(wxT("AppendMenu"));
         }
         {
             wxLogLastError(wxT("AppendMenu"));
         }