2016-03-31 1 views
0

Comment obtenir un autre texte de langue par GetWindowText? J'ai modfying un projet de tableau blanc. Lorsque l'utilisateur tape dans le tableau blanc, la fonction onchange est appelée et affiche le texte sur le tableau blanc. Cependant, quand je tape du texte japonais (langue par défaut non système) il montre "?" au lieu. Ce qui suit est le code spinet pour onchange.Comment obtenir un autre texte de langue par 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); 
} 

Je suis vraiment nouveau en C++. J'ai fait des recherches et j'ai essayé GetwindowTextW avec UTF8 unicode, mais il montre toujours "?". Peut-être que la logique est fausse.

J'apprécierais que quelqu'un puisse me donner la solution pour montrer le texte différent de langue dans le tableau blanc. Je vous remercie.

Répondre

1

GetWindowTextW est le bon chemin. Windows utilise la norme UTF16 Unicode, avec une chaîne large wchar_t. La norme UTF8 est couramment utilisée avec Linux et Internet. Vous pouvez avoir besoin de la conversion UTF16/UTF8 uniquement lors de l'exportation/importation de données vers d'autres systèmes.

Si vous créez un nouveau projet MFC, il sera configuré en Unicode et les fonctions MFC par défaut seront Unicode. Exemple:

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

Si le projet est Unicode, cela fonctionnera en japonais et dans toutes les autres langues.

Si vous travaillez avec un projet MFC héritage qui est coincé dans en mode ANSI et vous ne pouvez pas le changer, utilisez le correctif suivant: vous

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

Merci pour votre réponse. Le projet était un jeu de caractères multi-octets et ne peut pas changer pour utiliser GetWindowTextW. Ensuite, j'ai converti l'ensemble du projet avec le jeu de caractères Unicode à la place du jeu de caractères multi-octets. Cependant, cette méthode a fait que beaucoup de variables ont besoin de changer de type. –

+0

Je ne sais pas comment cela est implémenté dans VS 2005, mais dans les versions modernes, vous ne devriez pas vous préoccuper de 'GetWindowTextW'/'GetWindowTextA', car' GetWindowText' est implémenté comme une macro qui résout automatiquement l'une de ces deux fonctions, selon que le projet est défini comme étant Unicode ou non. Je travaille également avec des projets supportant la langue japonaise en utilisant largement 'GetWindowText' et je n'ai pas les problèmes dont vous vous plaignez! – sergiol