2016-08-24 3 views
1

В настоящее время я пытаюсь сделать наш язык 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); 
     } 
     } 
    } 
} 
+0

[Использование MUI с приложениями (Windows CE 5.0)] (https://msdn.microsoft.com/en-us/library/ms904384.aspx). – IInspectable

+0

Мне нужно было «HMENU hmenu = SHGetMenu (pCommandBar-> m_hWnd); и используйте HMENU из этой команды, и текст всплывающего меню теперь изменяется по мере необходимости. Единственная проблема - кнопка CommandBar, которая отключается в меню, не изменяется от ее целочисленного значения. –

ответ

0

Что мне было нужно

HMENU hmenu = SHGetMenu(pCommandBar->m_hWnd); 
NavigateMenu(hmenu); 

и использовать HMENU из этой команды и текст всплывающего меню теперь изменен я требую.

Чтобы установить текст кнопки на панели инструментов, мне нужно было использовать TB_SETBUTTONINFO на pCommandBar-> 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); 

 Смежные вопросы

  • Нет связанных вопросов^_^