2017-10-11 3 views
1

Ich versuche, den Text der aktuell gewählten Registerkarte in CTabCtrl zu bekommen.Wie erhält man den aktuellen Tab-Item-Namen von CTabCtrl in 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; 

Ich habe eindeutig einige unnötige String-Konvertierungen und zur Zeit gibt diese ein „Fehler Zeichen der Zeichenfolge Lesen“ in

tcItem.pszText; 

Wie kann ich die Zeichenfolge der CTabCtrl bekommen? Ich versuche schließlich, eine std :: string zu bekommen, aber die Hauptfrage ist, wie man den Text von der Registerkarte erhält.

Antwort

2

tcItem.pszText zeigt auf 0. So füllen sie mit Text, hat es auf einen Puffer zeigen, bevor ein Aufruf an GetItem gemacht wird:

Dokumentation für: CTabCtrl::GetItem

pszText

Zeiger auf einen nullterminierten String enthält den Tab-Text, wenn die Struktur Informationen zu einer Registerkarte enthält. Wenn die Struktur Informationen empfängt, gibt dieses Mitglied die Adresse des Puffers an, der den Tab-Text erhält.

Beispiel:

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); 

Beide tcItem.pszText und buf auf denselben Text verweisen. Oder nutzen Sie CString mit 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 

Es sieht aus wie Sie die empfohlenen Einstellungen Unicode verwenden. Vermeiden Sie die Konvertierung von UNICODE in ANSI (std::string). Diese Konvertierung funktioniert meistens für lateinische Sprachen, wird aber nicht benötigt. Sie können std::wstring verwenden, wenn Sie dies in STL verwenden müssen, oder in UTF-8 konvertieren, wenn Sie Daten an das Internet usw. senden möchten.

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