more framework fixes for menu displays

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6778 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Webster
2000-03-16 23:24:38 +00:00
parent cc534ff767
commit c3cea74805
2 changed files with 72 additions and 23 deletions

View File

@@ -552,6 +552,9 @@ void wxFrame::SetMenuBar(
wxMenuBar* pMenuBar wxMenuBar* pMenuBar
) )
{ {
ERRORID vError;
wxString sError;
if (!pMenuBar) if (!pMenuBar)
{ {
DetachMenuBar(); DetachMenuBar();
@@ -578,6 +581,22 @@ void wxFrame::SetMenuBar(
return; 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(); InternalSetMenuBar();
m_frameMenuBar = pMenuBar; m_frameMenuBar = pMenuBar;

View File

@@ -215,29 +215,38 @@ bool wxMenu::DoInsertOrAppend(
{ {
ERRORID vError; ERRORID vError;
wxString sError; wxString sError;
MENUITEM vItem;
#if wxUSE_ACCEL #if wxUSE_ACCEL
UpdateAccel(pItem); UpdateAccel(pItem);
#endif // wxUSE_ACCEL #endif // wxUSE_ACCEL
memset(&vItem, '\0', sizeof(vItem));
// //
// If "Break" has just been called, insert a menu break before this item // If "Break" has just been called, insert a menu break before this item
// (and don't forget to reset the flag) // (and don't forget to reset the flag)
// //
if (m_bDoBreak) if (m_bDoBreak)
{ {
m_vMenuData.afStyle |= MIS_BREAK; vItem.afStyle |= MIS_BREAK;
m_bDoBreak = FALSE; 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()) 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 // 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(); wxMenu* pSubmenu = pItem->GetSubMenu();
@@ -247,13 +256,13 @@ bool wxMenu::DoInsertOrAppend(
wxASSERT_MSG(pSubmenu->GetHMenu(), wxT("invalid submenu")); wxASSERT_MSG(pSubmenu->GetHMenu(), wxT("invalid submenu"));
pSubmenu->SetParent(this); pSubmenu->SetParent(this);
m_vMenuData.iPosition = 0; // submenus have a 0 position vItem.iPosition = 0; // submenus have a 0 position
m_vMenuData.id = (USHORT)pSubmenu->GetHMenu(); vItem.id = (USHORT)pSubmenu->GetHMenu();
m_vMenuData.afStyle |= MIS_SUBMENU | MIS_TEXT; vItem.afStyle |= MIS_SUBMENU | MIS_TEXT;
} }
else else
{ {
m_vMenuData.id = pItem->GetId(); vItem.id = pItem->GetId();
} }
BYTE* pData; BYTE* pData;
@@ -264,10 +273,11 @@ bool wxMenu::DoInsertOrAppend(
// //
// Want to get {Measure|Draw}Item messages? // Want to get {Measure|Draw}Item messages?
// item draws itself, pass pointer to it in data parameter // 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; pData = (BYTE*)pItem;
// vItem.hItem = ????
} }
else else
#endif #endif
@@ -275,28 +285,28 @@ bool wxMenu::DoInsertOrAppend(
// //
// Menu is just a normal string (passed in data parameter) // 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(); pData = (char*)pItem->GetText().c_str();
} }
APIRET rc; APIRET rc;
m_vMenuData.hwndSubMenu = NULLHANDLE; if (pSubmenu == NULL)
m_vMenuData.hItem = NULLHANDLE;
//
// -1 means append at end
//
if (nPos == (size_t)-1)
{ {
m_vMenuData.iPosition = MIT_END; //
} // -1 means append at end
else //
{ if (nPos == (size_t)-1)
m_vMenuData.iPosition = nPos; {
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) if (rc == MIT_MEMERROR || rc == MIT_ERROR)
{ {
vError = ::WinGetLastError(vHabmain); vError = ::WinGetLastError(vHabmain);
@@ -660,6 +670,26 @@ WXHMENU wxMenuBar::Create()
APIRET rc; APIRET rc;
ERRORID vError; ERRORID vError;
wxString sError; 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()); 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) if (rc == MIT_MEMERROR || rc == MIT_ERROR)