109 lines
3.2 KiB
C++
109 lines
3.2 KiB
C++
//+---------------------------------------------------------------------
|
||
//
|
||
// File: iputils.hxx
|
||
//
|
||
// Contents: Helper functions for in-place activation
|
||
//
|
||
//----------------------------------------------------------------------
|
||
|
||
#include "headers.hxx"
|
||
#pragma hdrstop
|
||
|
||
#define MAXLABELLEN 32
|
||
|
||
//+---------------------------------------------------------------
|
||
//
|
||
// Function: InsertServerMenus
|
||
//
|
||
// Synopsis: Inserts the objects menus into a shared menu after
|
||
// the top-level application has inserted its menus
|
||
//
|
||
// Arguments: [hmenuShared] -- the shared menu to recieve the objects menus
|
||
// [hmenuObject] -- all of the objects menus
|
||
// [lpmgw] -- menu group widths indicating where the menus
|
||
// should be inserted
|
||
//
|
||
// Returns: Success if the menus were merged successfully
|
||
//
|
||
// Notes: The function does most of the shared menu work
|
||
// by the object between the IOleInPlaceFrame::InsertMenus and
|
||
// IOleInPlaceFrame::SetMenu method calls.
|
||
// c.f. RemoveServerMenus
|
||
//
|
||
//----------------------------------------------------------------
|
||
|
||
HRESULT
|
||
InsertServerMenus(HMENU hmenuShared,
|
||
HMENU hmenuObject,
|
||
LPOLEMENUGROUPWIDTHS lpmgw)
|
||
{
|
||
int i, j;
|
||
HMENU hmenuXfer;
|
||
TCHAR szLabel[MAXLABELLEN];
|
||
UINT iServer = 0;
|
||
UINT iShared = 0;
|
||
|
||
// for each of the Edit, Object, and Help menu groups
|
||
for (j = 1; j <= 5; j += 2)
|
||
{
|
||
// advance over container menus
|
||
iShared += (UINT)lpmgw->width[j-1];
|
||
|
||
// pull out the popup menus from servers menu
|
||
for (i = 0; i < lpmgw->width[j]; i++)
|
||
{
|
||
GetMenuString(hmenuObject,
|
||
iServer,
|
||
szLabel,
|
||
MAXLABELLEN,
|
||
MF_BYPOSITION);
|
||
hmenuXfer = GetSubMenu(hmenuObject, iServer++);
|
||
if (!InsertMenu(hmenuShared,
|
||
iShared++,
|
||
MF_BYPOSITION|MF_POPUP,
|
||
(UINT_PTR)hmenuXfer,
|
||
szLabel))
|
||
{
|
||
return HRESULT_FROM_WIN32(GetLastError());
|
||
}
|
||
}
|
||
}
|
||
return NOERROR;
|
||
}
|
||
|
||
//+---------------------------------------------------------------
|
||
//
|
||
// Function: RemoveServerMenus
|
||
//
|
||
// Synopsis: Removes the objects menus from a shared menu
|
||
//
|
||
// Arguments: [hmenuShared] -- the menu contain both the application's
|
||
// and the object's menus
|
||
// [lpmgw] -- menu group widths indicating which menus should
|
||
// be removed
|
||
//
|
||
// Notes: c.f. InsertServerMenus
|
||
//
|
||
//----------------------------------------------------------------
|
||
|
||
void
|
||
RemoveServerMenus(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpmgw)
|
||
{
|
||
int i, j;
|
||
UINT iShared = 0;
|
||
|
||
// for each of the Edit, Object, and Help menu groups
|
||
for (j = 1; j <= 5; j += 2)
|
||
{
|
||
// advance over container menus
|
||
iShared += (UINT)lpmgw->width[j-1];
|
||
|
||
// pull out the popup menus from shared menu
|
||
for (i = 0; i < lpmgw->width[j]; i++)
|
||
{
|
||
RemoveMenu(hmenuShared, iShared, MF_BYPOSITION);
|
||
}
|
||
}
|
||
}
|
||
|
||
|