2016-03-31 14 views
0

Wie bekomme ich einen anderen Sprachtext von GetWindowText? Ich habe ein Whiteboard-Projekt modifiziert. Wenn der Benutzer das Whiteboard eingibt, wird die Onchange-Funktion aufgerufen und zeigt den Text im Whiteboard an. Wenn ich jedoch japanischen Text (keine Systemstandardsprache) eintippe, wird "?" stattdessen. Das folgende ist der Code-Spinet für onchange.Wie bekomme ich einen anderen Sprachtext von 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); 
} 

Ich bin wirklich neu in C++. Ich habe recherchiert und GetwindowTextW mit UTF8 Unicode versucht, aber es zeigt immer noch "?". Vielleicht ist die Logik falsch.

Ich würde es schätzen, wenn mir jemand die Lösung geben könnte, um verschiedene Sprache Text im Whiteboard zu zeigen. Vielen Dank.

Antwort

1

GetWindowTextW ist der richtige Weg. Windows verwendet UTF16 Unicode-Standard mit wchar_t Wide-Zeichenfolge. UTF8-Standard wird häufig mit Linux und Internet verwendet. Sie benötigen möglicherweise nur UTF16/UTF8-Konvertierung, wenn Sie Daten in andere Systeme exportieren/importieren.

Wenn Sie ein neues MFC-Projekt erstellen, wird es in Unicode eingerichtet und MFC-Funktionen werden standardmäßig Unicode. Beispiel:

Wenn Projekt Unicode ist, wird dies in Japanisch und allen anderen Sprachen funktionieren.

Wenn Sie mit einem Legacy-MFC-Projekt arbeiten, die im ANSI-Modus stecken in und Sie können es nicht ändern, verwenden Sie das folgende Update:

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

Dank für Ihre Antwort danken. Das Projekt war ein Multi-Byte-Zeichensatz und kann nicht geändert werden, um GetWindowTextW zu verwenden. Dann konvertierte ich das ganze Projekt mit dem Unicode-Zeichensatz anstelle des Multi-Byte-Zeichensatzes. Allerdings hat diese Methode viele Variablen gezwungen, ihren Typ zu ändern. –

+0

Ich weiß nicht, wie dies in VS 2005 implementiert ist, aber in modernen Versionen sollten Sie 'GetWindowTextW '/' GetWindowTextA' nicht beachten, da 'GetWindowText' als ein Makro implementiert ist, das automatisch in eine dieser beiden Funktionen auflöst, abhängig davon, ob das Projekt als Unicode definiert ist oder nicht. Ich arbeite auch mit Projekten, die die japanische Sprache unter Verwendung von 'GetWindowText' unterstützen und ich habe nicht die Probleme, über die Sie sich beschweren! – sergiol