BOOL LoadMenuIndirect( const void* lpMenuTemplate );
Возвращаемое значение
Отлично от нуля если ресурс меню был загружен успешно, иначе 0.
Параметры
lpMenuTemplate
Укажите на шаблон меню который является одиночной структурой MENUITEMTEMPLATEHEADER и совокупностью одной или большего количества структур MENUITEMTEMPLATE.
Замечания
Загружает ресурс из шаблона меню в памяти и присоединяет его к объекту CMenu. Шаблон меню - верхний колонтитул, сопровождаемый совокупностью одной или большим количеством структур MENUITEMTEMPLATE каждая из которых может содержать один или большее количество пунктов меню и всплывающих меню.
Номер версии должен быть 0.
Флажки mtOption должны включить MF_END для последнего элемента в списке и для последнего элемента в основном списке. См. AppendMenu функцию для других флажков. MtId член должен быть опущен из структуры MENUITEMTEMPLATE когда MF_POPUP определен в mtOption.
Пространство распределенное для структуры MENUITEMTEMPLATE должен быть достаточно большим для mtString, чтобы содержать имя пункта меню как строка с нулевым символом в конце.
Перед выходом, прикладная программа должна освободить ресурсы системы связанные с меню, если меню не назначено к окну. Прикладная программа освобождает меню вызывая DestroyMenu функцию.
Пример
// CMainFrame::OnLoadMenuIndirect()- драйвер команды меню для
// CMainFrame класса, который в свою очередь является классом потомком CFrameWnd. Это
// показывает как использовать LoadMenuIndirect () чтобы загрузить ресурс из
// шаблона меню в памяти.
void CMainFrame::OnLoadMenuIndirect()
{
// Для простоты распределите 500 байтов в стеке. Можно использовать
// GlobalAlloc () чтобы распределить байты памяти в "куче".
BYTE milist[500];
memset(milist, 0, 500);
// Заполнить структуру MENUITEMTEMPLATEHEADER.
MENUITEMTEMPLATEHEADER* mheader = (MENUITEMTEMPLATEHEADER*) milist;
mheader->versionNumber = 0;
mheader->offset = 0;
int bytes_used = sizeof(MENUITEMTEMPLATEHEADER);
// Добавить следующие пункты меню:
// File Edit
// Exit Copy
// Paste
bytes_used += AddMenuItem(milist + bytes_used, L"&File", 0, TRUE, FALSE);
bytes_used += AddMenuItem(milist + bytes_used, L"E&xit", ID_APP_EXIT, FALSE, TRUE);
bytes_used += AddMenuItem(milist + bytes_used, L"&Edit", 0, TRUE, TRUE);
bytes_used += AddMenuItem(milist + bytes_used, L"&Copy", ID_EDIT_COPY, FALSE, FALSE);
bytes_used += AddMenuItem(milist + bytes_used, L"&Paste", ID_EDIT_PASTE, FALSE, TRUE);
// Загрузите ресурс шаблона меню в памяти.
ASSERT(m_NewMenu.LoadMenuIndirect(milist));
// Удалите старое меню
SetMenu(NULL);
::DestroyMenu(m_hMenuDefault);
// Добавьте новое меню
SetMenu(&m_NewMenu);
// Установите меню по умолчанию
m_hMenuDefault = m_NewMenu.m_hMenu;
}
// Это - функция помощника для добавления пункта меню (любое всплывающее
// или элемент команды) к определенному шаблону меню.
// MenuTemplate - указатель на шаблон меню
// MenuString - строка для пункта меню которая будет добавлена
// MenuID - идентификатор для элемента команды. Значение игнорируется если IsPopup TRUE.
// IsPopup - TRUE для всплывающего меню (или под-меню); FALSE для команды
// LastItem - TRUE если MenuString - последний элемент для всплывающего, FALSE иначе.
UINT AddMenuItem(LPVOID MenuTemplate, WCHAR* MenuString, WORD MenuID, BOOL IsPopup, BOOL LastItem)
{
MENUITEMTEMPLATE* mitem = (MENUITEMTEMPLATE*) MenuTemplate;
UINT bytes_used = 0;
if (IsPopup) // для всплывающего меню
{
if (LastItem)
mitem->mtOption = MF_POPUP | MF_END;
else
mitem->mtOption = MF_POPUP;
bytes_used += sizeof (mitem->mtOption);
mitem = (MENUITEMTEMPLATE*) ((BYTE*) MenuTemplate + bytes_used);
// Всплывающее не имеет mtID!!!
wcscpy((WCHAR*) mitem, MenuString);
bytes_used += sizeof (WCHAR) * (wcslen(MenuString) + 1); // включая'\0'
}
else // для команд
{
mitem->mtOption = LastItem ? MF_END : 0;
mitem->mtID = MenuID;
wcscpy(mitem->mtString, MenuString);
bytes_used += sizeof (mitem->mtOption ) + sizeof (mitem->mtID) +
sizeof (WCHAR) * (wcslen(MenuString) + 1); // включая '\0'
}
return bytes_used;
}