【发布时间】:2016-08-24 23:04:03
【问题描述】:
我目前正在尝试使我们的 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 块)。
所以我的问题是我可以这样更改菜单还是需要动态构建它(在运行时)。代码导航菜单层次结构并从对 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 );
}
}
}
}
【问题讨论】:
-
我需要的是“HMENU hmenu = SHGetMenu(pCommandBar->m_hWnd);”并使用此命令中的 HMENU,弹出菜单文本现在已根据需要进行修改。剩下的唯一问题是菜单关闭的 CommandBar 按钮不会从其整数值更改。
标签: c++ winapi mfc windows-ce