我目前正在努力使我们的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)。
所以我的问题是我可以通过这种方式更改菜单,还是需要动态构建它(在运行时)。代码导航菜单层次结构并获取对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 );
}
}
}
}
答案 0 :(得分:0)
我需要的是
HMENU hmenu = SHGetMenu( pCommandBar->m_hWnd );
NavigateMenu( hmenu );
并使用此命令中的HMENU,现在可以根据需要修改弹出菜单文本。
设置工具栏按钮文本我需要在pCommandBar-> m_hWnd上使用TB_SETBUTTONINFO;
TBBUTTONINFO buttonInfo;
ZeroMemory( &buttonInfo, sizeof( TBBUTTONINFO ) );
buttonInfo.cbSize = sizeof( TBBUTTONINFO );
buttonInfo.dwMask = TBIF_TEXT | TBIF_BYINDEX;// | TBIF_COMMAND ;
wchar_t buffer[200];
buttonInfo.pszText = buffer;
buttonInfo.cchText = 200;
HWND hwnd = pCommandBar->m_hWnd;
::SendMessage( hwnd, TB_GETBUTTONINFO, 0, (LPARAM)&buttonInfo );
OutputDebug( L" *** Button Text = [%s]", buttonInfo.pszText );
buttonInfo.pszText = L"BLAH";
buttonInfo.cchText = 5;
::SendMessage( hwnd, TB_SETBUTTONINFO, 0, (LPARAM)&buttonInfo );