2016-03-31 28 views
0

GetWindowTextで別の言語のテキストを取得するには? 私はホワイトボードプロジェクトを変更しています。ユーザーがホワイトボードに入力すると、onchange関数が呼び出され、テキストがホワイトボードに表示されます。しかし、日本語のテキスト(非システムデフォルト言語)を入力すると、 "?"代わりに。 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++で本当に新しいです。私は研究を行い、UTF8のユニコードでGetwindowTextWを試しましたが、それでも "?"が表示されます。論理が間違っているかもしれません。

ホワイトボードに異なる言語のテキストを表示するソリューションを誰かに教えていただければ幸いです。ありがとうございました。

答えて

1

GetWindowTextWが正しい方法です。 WindowsはUTF16 Unicode標準を使用し、wchar_tワイド文字列を使用します。 UTF8標準は、Linuxとインターネットでよく使用されます。他のシステムにデータをエクスポート/インポートする場合にのみUTF16/UTF8変換が必要な場合があります。

新しいMFCプロジェクトを作成すると、Unicodeでセットアップされ、MFC関数はデフォルトでUnicodeに設定されます。例:

プロジェクトがUnicodeの場合、これは日本語と他のすべての言語で動作します。

あなたはANSIモードででスタックしているレガシーMFCプロジェクトで作業しているし、あなたがそれを変更できない場合は、以下の修正プログラムを使用:

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

は、あなたの答えをいただき、ありがとうございます。プロジェクトはマルチバイト文字セットであり、GetWindowTextWを使用するように変更することはできません。 その後、マルチバイト文字セットの代わりにUnicode文字セットを使用してプロジェクト全体を変換しました。 しかし、このメソッドは多くの変数を型の変更が必要としました。 –

+0

これはVS 2005でどのように実装されているのか分かりませんが、最新のバージョンでは 'GetWindowTextW' /' GetWindowTextA'は気にしないでください。 'GetWindowText'はこれらの2つの関数の1つに自動的に解決されるマクロとして実装されます。プロジェクトがUnicodeとして定義されているかどうかによって異なります。私は広範囲に渡って 'GetWindowText'を使って日本語をサポートするプロジェクトにも取り組んでいますが、あなたが不満を感じることはありません! – sergiol

関連する問題