]> git.saurik.com Git - wxWidgets.git/commitdiff
more framework fixes for menu displays
authorDavid Webster <Dave.Webster@bhmi.com>
Thu, 16 Mar 2000 23:24:38 +0000 (23:24 +0000)
committerDavid Webster <Dave.Webster@bhmi.com>
Thu, 16 Mar 2000 23:24:38 +0000 (23:24 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6778 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/os2/frame.cpp
src/os2/menu.cpp

index 0643f20c5bd8202de70e729fff0191030653b0c6..f3c22d5db5d40bf5d8bd79aa50fdb6a9240a6fa2 100644 (file)
@@ -552,6 +552,9 @@ void wxFrame::SetMenuBar(
   wxMenuBar*                        pMenuBar
 )
 {
+    ERRORID                         vError;
+    wxString                        sError;
+
     if (!pMenuBar)
     {
         DetachMenuBar();
@@ -578,6 +581,22 @@ void wxFrame::SetMenuBar(
             return;
     }
 
+    //
+    // Set the parent and owner of the menubar to be the frame
+    //
+    if (!::WinSetParent(m_hMenu, GetHwnd(), FALSE))
+    {
+        vError = ::WinGetLastError(vHabmain);
+        sError = wxPMErrorToStr(vError);
+        wxLogError("Error setting parent for submenu. Error: %s\n", sError);
+    }
+
+    if (!::WinSetOwner(m_hMenu, GetHwnd()))
+    {
+        vError = ::WinGetLastError(vHabmain);
+        sError = wxPMErrorToStr(vError);
+        wxLogError("Error setting parent for submenu. Error: %s\n", sError);
+    }
     InternalSetMenuBar();
 
     m_frameMenuBar = pMenuBar;
index d9cfa8d761468f8e7db299fbb010c33df251a74c..2dc2789ceb35ae1aeb16485184180e97d0151b24 100644 (file)
@@ -215,29 +215,38 @@ bool wxMenu::DoInsertOrAppend(
 {
     ERRORID                         vError;
     wxString                        sError;
+    MENUITEM                        vItem;
 
 #if wxUSE_ACCEL
     UpdateAccel(pItem);
 #endif // wxUSE_ACCEL
 
+    memset(&vItem, '\0', sizeof(vItem));
+
     //
     // If "Break" has just been called, insert a menu break before this item
     // (and don't forget to reset the flag)
     //
     if (m_bDoBreak)
     {
-        m_vMenuData.afStyle |= MIS_BREAK;
+        vItem.afStyle |= MIS_BREAK;
         m_bDoBreak = FALSE;
     }
 
+    //
+    // Menu items that are being inserted into a submenu MUST have a
+    // MENUITEM structure separate from the parent menu so we must use
+    // a local vItem not the object's m_vMenuItem as that is the MENUITEM
+    // associated with the parent submenu.
+    //
     if (pItem->IsSeparator())
     {
-        m_vMenuData.afStyle |= MIS_SEPARATOR;
+        vItem.afStyle |= MIS_SEPARATOR;
     }
 
     //
     // Id is the numeric id for normal menu items and HMENU for submenus as
-    // required by ::WinInsertMenu() API
+    // required by ::MM_INSERTITEM message API
     //
 
     wxMenu*                         pSubmenu = pItem->GetSubMenu();
@@ -247,13 +256,13 @@ bool wxMenu::DoInsertOrAppend(
         wxASSERT_MSG(pSubmenu->GetHMenu(), wxT("invalid submenu"));
         pSubmenu->SetParent(this);
 
-        m_vMenuData.iPosition = 0; // submenus have a 0 position
-        m_vMenuData.id = (USHORT)pSubmenu->GetHMenu();
-        m_vMenuData.afStyle |= MIS_SUBMENU | MIS_TEXT;
+        vItem.iPosition = 0; // submenus have a 0 position
+        vItem.id = (USHORT)pSubmenu->GetHMenu();
+        vItem.afStyle |= MIS_SUBMENU | MIS_TEXT;
     }
     else
     {
-        m_vMenuData.id = pItem->GetId();
+        vItem.id = pItem->GetId();
     }
 
     BYTE*                           pData;
@@ -264,10 +273,11 @@ bool wxMenu::DoInsertOrAppend(
         //
         // Want to get {Measure|Draw}Item messages?
         // item draws itself, pass pointer to it in data parameter
-        // Will eventually need to set the image handle somewhere into m_vMenuData.hItem
+        // Will eventually need to set the image handle somewhere into vItem.hItem
         //
-        m_vMenuData.afStyle |= MIS_OWNERDRAW;
+        vItem.afStyle |= MIS_OWNERDRAW;
         pData = (BYTE*)pItem;
+        // vItem.hItem = ????
     }
     else
 #endif
@@ -275,28 +285,28 @@ bool wxMenu::DoInsertOrAppend(
         //
         // Menu is just a normal string (passed in data parameter)
         //
-        m_vMenuData.afStyle |= MIS_TEXT;
+        vItem.afStyle |= MIS_TEXT;
         pData = (char*)pItem->GetText().c_str();
     }
 
     APIRET                          rc;
 
-    m_vMenuData.hwndSubMenu = NULLHANDLE;
-    m_vMenuData.hItem       = NULLHANDLE;
-
-    //
-    // -1 means append at end
-    //
-    if (nPos == (size_t)-1)
+    if (pSubmenu == NULL)
     {
-        m_vMenuData.iPosition = MIT_END;
-    }
-    else
-    {
-        m_vMenuData.iPosition   = nPos;
+        //
+        // -1 means append at end
+        //
+        if (nPos == (size_t)-1)
+        {
+            vItem.iPosition = MIT_END;
+        }
+        else
+        {
+            vItem.iPosition = nPos;
+        }
     }
 
-    rc = (APIRET)::WinSendMsg(GetHmenu(), MM_INSERTITEM, (MPARAM)&m_vMenuData, (MPARAM)pData);
+    rc = (APIRET)::WinSendMsg(GetHmenu(), MM_INSERTITEM, (MPARAM)&vItem, (MPARAM)pData);
     if (rc == MIT_MEMERROR || rc == MIT_ERROR)
     {
         vError = ::WinGetLastError(vHabmain);
@@ -660,6 +670,26 @@ WXHMENU wxMenuBar::Create()
             APIRET                  rc;
             ERRORID                 vError;
             wxString                sError;
+            MENUITEM                vItem;
+
+            //
+            // Set the parent and owner of the submenues to be the menubar, not the desktop
+            //
+            if (!::WinSetParent(m_menus[i]->m_vMenuData.hwndSubMenu, hMenuBar, FALSE))
+            {
+                vError = ::WinGetLastError(vHabmain);
+                sError = wxPMErrorToStr(vError);
+                wxLogError("Error setting parent for submenu. Error: %s\n", sError);
+                return NULLHANDLE;
+            }
+
+            if (!::WinSetOwner(m_menus[i]->m_vMenuData.hwndSubMenu, hMenuBar))
+            {
+                vError = ::WinGetLastError(vHabmain);
+                sError = wxPMErrorToStr(vError);
+                wxLogError("Error setting parent for submenu. Error: %s\n", sError);
+                return NULLHANDLE;
+            }
 
             rc = (APIRET)::WinSendMsg(hMenuBar, MM_INSERTITEM, (MPARAM)&m_menus[i]->m_vMenuData, (MPARAM)m_titles[i].c_str());
             if (rc == MIT_MEMERROR || rc == MIT_ERROR)