From c3cea748056e6ecabc4271989d8f75c6d2d1a0c1 Mon Sep 17 00:00:00 2001 From: David Webster Date: Thu, 16 Mar 2000 23:24:38 +0000 Subject: [PATCH] more framework fixes for menu displays git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6778 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/os2/frame.cpp | 19 ++++++++++++ src/os2/menu.cpp | 76 +++++++++++++++++++++++++++++++++-------------- 2 files changed, 72 insertions(+), 23 deletions(-) diff --git a/src/os2/frame.cpp b/src/os2/frame.cpp index 0643f20c5b..f3c22d5db5 100644 --- a/src/os2/frame.cpp +++ b/src/os2/frame.cpp @@ -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; diff --git a/src/os2/menu.cpp b/src/os2/menu.cpp index d9cfa8d761..2dc2789ceb 100644 --- a/src/os2/menu.cpp +++ b/src/os2/menu.cpp @@ -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) -- 2.45.2