2017-10-11 6 views
1

J'essaie d'obtenir le texte de l'onglet actuellement sélectionné dans CTabCtrl.Comment obtenir le nom de l'élément Tab actuel à partir de CTabCtrl dans MFC?

int tabCurSel = currentTabCtrl->GetCurSel(); 

    TCITEM tcItem; 
    tcItem.mask = TCIF_TEXT; 
    tcItem.cchTextMax = 256; //Do I need this? 

    CString tabCurrentCString; 
    currentTabCtrl->GetItem(tabCurSel, &tcItem); 

    tabCurrentCString = tcItem.pszText; 
    CT2A tabCurrentChar(tabCurrentCString); 
    std::string tabCurrentStr(tabCurrentChar); 
    return tabCurrentStr; 

je clairement quelques conversions de chaînes inutiles et en cela renvoie une « erreur de lecture des caractères de la chaîne » dans

tcItem.pszText; 

Comment puis-je obtenir la chaîne de la CTabCtrl? J'essaye finalement d'obtenir une chaîne de std :: mais la question principale est comment obtenir le texte de l'étiquette.

Répondre

2

tcItem.pszText pointe vers 0. Pour le remplir avec du texte, il doit pointer vers un tampon avant qu'un appel soit fait à GetItem:

Documentation: CTabCtrl::GetItem

pszText

pointeur vers une chaîne terminée par null contenant le texte de l'onglet si la structure contient des informations sur un onglet. Si la structure est en recevant des informations, ce membre spécifie l'adresse du tampon qui reçoit le texte de l'onglet.

Exemple:

TCITEM tcItem { 0 }; 
tcItem.mask = TCIF_TEXT; 
const int len = 256; 
tcItem.cchTextMax = len; 
TCHAR buf[len] = { 0 }; 
tcItem.pszText = buf; 
currentTabCtrl->GetItem(tabCurSel, &tcItem); 

Les deux tcItem.pszText et buf pointera vers le même texte. Ou utiliser CString avec CString::GetBuffer()/CString::ReleaseBuffer()

CString tabCurrentCString; 
TCITEM tcItem; 
tcItem.mask = TCIF_TEXT; 
tcItem.cchTextMax = 256; 
tcItem.pszText = tabCurrentCString.GetBuffer(tcItem.cchTextMax); 
BOOL result = currentTabCtrl->GetItem(tabCurSel, &tcItem); 
tabCurrentCString.ReleaseBuffer(); 

if (result) 
    MessageBox(tabCurrentCString); //success 

Il semble que vous utilisez les paramètres recommandés Unicode. Évitez de convertir UNICODE en ANSI (std::string). Cette conversion fonctionnera pour les langues latines, la plupart du temps, mais ce n'est pas nécessaire. Vous pouvez utiliser std::wstring si vous avez besoin de l'utiliser en STL, ou convertir en UTF-8 si vous voulez envoyer des données à Internet, etc.

std::string str = CW2A(tabCurrentCString, CP_UTF8);