如何更改菜单文本
How to change menu text
我目前正在尝试让我们的 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 );
}
}
}
}
我需要的是
HMENU hmenu = SHGetMenu( pCommandBar->m_hWnd );
NavigateMenu( hmenu );
并使用此命令中的 HMENU,弹出菜单文本现在已按我的要求修改。
要设置工具栏按钮文本,我需要在 pCommandBar 上使用 TB_SETBUTTONINFO->m_hWnd;
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 );
我目前正在尝试让我们的 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 );
}
}
}
}
我需要的是
HMENU hmenu = SHGetMenu( pCommandBar->m_hWnd );
NavigateMenu( hmenu );
并使用此命令中的 HMENU,弹出菜单文本现在已按我的要求修改。
要设置工具栏按钮文本,我需要在 pCommandBar 上使用 TB_SETBUTTONINFO->m_hWnd;
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 );