如何更改菜单文本

时间:2016-08-24 23:04:04

标签: c++ winapi mfc windows-ce

我目前正在努力使我们的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 );
         }
      }
   }
}

1 个答案:

答案 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 );