В настоящее время я пытаюсь сделать наш язык Windows CE несколько языков.Как изменить текст меню
Для этого я подменил цифры для текста в ресурсе меню, например «51234». При создании панели меню я перебираю меню и подменю и конвертирую текстовый номер в целое число и просматриваю его в базе данных и конвертирую текст.
IDMB_BULK_AUDIT MENU
BEGIN
POPUP "51420"
BEGIN
MENUITEM "51432", ID_OPTIONS_PREFERENCES
MENUITEM "51435", ID_OPTIONS_STATS
END
END
Чтобы получить целый текст, я использую GetMenuItemInfo и установить текст с SetMenuItemInfo. Пример кода ниже. У меня есть свой собственный метод OutputDebug (...), и этот метод называется NavigateMenu и вызывается рекурсивно (см. End if block).
Итак, мой вопрос в том, могу ли я изменить это меню или мне нужно его динамически строить (во время выполнения). Код перемещается по иерархии меню и получает целые значения из вызовов, которые передаются GetMenuItemInfo и SetMenuItemInfo. Ошибка CommandBar_DrawMenuBar с помощью недействительной ручки меню (1401).
// This is how I call the method.
NavigateMenu(pCommandBar->GetMenu());
if(::CommandBar_DrawMenuBar(pCommandBar->m_hCommandBar, MenuId))
{
OutputDebug(L"Draw - OK\n");
}
else
{
DWORD lastError = GetLastError();
OutputDebug(L"Draw - Fail [%d]\n", lastError);
}
void CMainFrame::NavigateMenu(HMENU HandleMenu)
{
wchar_t menuText[ 200 ];
BOOL cont = TRUE;
for(int i = 0; cont; ++i)
{
MENUITEMINFO menuiteminfo;
menuiteminfo.cbSize = sizeof(MENUITEMINFO);
menuiteminfo.fMask = MIIM_SUBMENU | MIIM_TYPE;
menuiteminfo.dwTypeData = menuText;
menuiteminfo.cch = 200;
menuiteminfo.hSubMenu = 0;
menuiteminfo.fType = MFT_STRING;
cont = GetMenuItemInfo(HandleMenu, i, true, &menuiteminfo);
if(cont)
{
CStringW menuText2((wchar_t *)menuiteminfo.dwTypeData);
if(menuText2.GetLength())
{
const int menuId = StringToInt(menuText2);
if(menuId > 0)
{
CStringW menuText3(LoadResString(menuId));
wcscpy(menuText, menuText3);
menuiteminfo.cch = menuText3.GetLength() + 1;
menuiteminfo.fMask = MIIM_TYPE;
//if(ModifyMenu(HandleMenu, i, MF_BYPOSITION, MF_STRING, menuText))
//if(ModifyMenu(HandleMenu, menuiteminfo.wID, MF_BYCOMMAND, MF_STRING, menuText))
if(SetMenuItemInfo(HandleMenu, i, true, &menuiteminfo))
{
//if(SetMenuItemInfo(HandleMenu, menuiteminfo.wID, false, &menuiteminfo))
OutputDebug(L"Success - > %d to '%s'\n", menuId, menuiteminfo.dwTypeData);
}
else
{
DWORD menuError = GetLastError();
OutputDebug(L"Fail [%d] - > %d to '%s'\n", menuError, menuId, menuiteminfo.dwTypeData);
}
}
}
if(menuiteminfo.hSubMenu)
{
NavigateMenu(menuiteminfo.hSubMenu);
}
}
}
}
[Использование MUI с приложениями (Windows CE 5.0)] (https://msdn.microsoft.com/en-us/library/ms904384.aspx). – IInspectable
Мне нужно было «HMENU hmenu = SHGetMenu (pCommandBar-> m_hWnd); и используйте HMENU из этой команды, и текст всплывающего меню теперь изменяется по мере необходимости. Единственная проблема - кнопка CommandBar, которая отключается в меню, не изменяется от ее целочисленного значения. –