2016-03-31 2 views
0

Как получить текст на другом языке с помощью GetWindowText? У меня есть modfying проект доски. Когда пользователь вводит на доске, функция onchange вызывается и будет показывать текст на доске. Однако, когда я печатаю японский текст (нестандартный язык по умолчанию), он показывает «?» вместо. Ниже приведен код spetet для onchange.Как получить текст на другом языке с помощью GetWindowText?

void CHBEdit::OnChange() 
{ 
    static bool bChanged = true; 
    CDC *pDC = GetDC(); 

    if (bChanged) { 
     CString str; 
     GetWindowText(str); 
     m_strText = str; 

     int iStartChar, iEndChar; 
     GetSel(iStartChar, iEndChar); 

     CRect rect; 
     GetWindowRect(&rect); 

     CFont *Oldfont = (CFont *)pDC->SelectObject(&m_Font); 
     CSize size = pDC->GetOutputTextExtent(str); //+ "a"); 
     pDC->SelectObject(Oldfont); 

     SetWindowPos(NULL, 0, 0, size.cx, size.cy, SWP_NOMOVE); 

     bChanged = false; 
     SetWindowText(str); 

     SetSel(iStartChar, iEndChar); 
    } 
    else   
     bChanged = true; 

    ReleaseDC(pDC); 
} 

Я действительно новичок в C++. Я занимался исследованиями и пытался использовать GetwindowTextW с юникодом UTF8, но он все еще показывает «?». Может быть, логика ошибочна.

Я был бы признателен, если бы кто-нибудь мог дать мне решение, чтобы показать текст на другом языке в доске. Спасибо.

ответ

1

GetWindowTextW - правильный путь. Windows использует стандарт Unicode UTF16, с широкоформатной строкой wchar_t. Стандарт UTF8 обычно используется с Linux и Интернетом. Возможно, вам потребуется преобразование UTF16/UTF8 только при экспорте/импорте данных в другие системы.

Если вы создадите новый проект MFC, он будет настроен в Unicode, а функции MFC по умолчанию будут использовать Unicode. Пример:

//UNICODE project: 
CString str; 
GetWindowText(str); 
MessageBox(str); 

Если проект является Unicode, это будет работать на японском и всех других языках.

Если вы работаете с MFC проект унаследованной, который застрял в в режиме ANSI, и вы не можете изменить его, используйте следующее исправление:

//ANSI project: 
CStringW str; 
GetWindowTextW(str); 
MessageBoxW(str); 
+0

Спасибо за ваш ответ. Проект был многобайтным набором символов и не может использоваться для использования GetWindowTextW. Затем я преобразовал весь проект с использованием набора символов Unicode вместо многобайтового набора символов. Однако этот метод заставил множество переменных изменить свой тип. –

+0

Я не знаю, как это реализовано в VS 2005, но в современных версиях вам не нужно «GetWindowTextW»/'GetWindowTextA', поскольку« GetWindowText »реализуется как макрос, который автоматически разрешает одну из этих двух функций, если проект определен как Unicode или нет. Я также работаю над проектами, поддерживающими японский язык, широко используя 'GetWindowText', и у меня нет проблем, о которых вы жалуетесь! – sergiol

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