2016-08-24 2 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라고하며 재귀 적으로 호출됩니다 (블록의 끝을 참조하십시오).

제 질문은이 방법으로 메뉴를 변경하거나 동적으로 (런타임에) 빌드해야합니까? 이 코드는 메뉴 계층 구조를 탐색하고 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

[(윈도우 CE 5.0) 응용 프로그램과 MUI를 사용 (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를 사용하고 난 필요에 따라 팝업 메뉴 텍스트는 이제 수정됩니다.

도구 모음 단추 텍스트를 설정하려면 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); 
관련 문제