2017-10-11 43 views
1

CTabCtrlで現在選択されているタブのテキストを取得しようとしています。MFCのCTabCtrlから現在のタブ項目名を取得する方法は?

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; 

私は明らかにいくつかの不要な文字列変換を持っており、現在、これは私がCTabCtrlから文字列を取得できますか

tcItem.pszText; 

に「文字列の文字を読んでエラー」を返しますか?私は最終的にstd :: stringを取得しようとしていますが、主な質問はタブからテキストを取得する方法です。

答えて

2

tcItem.pszTextは、0を指しています。

ドキュメントのために:NULLで終わる文字列への

ポインタCTabCtrl::GetItem

pszText呼び出しがGetItemに行われる前にテキストでそれを埋めるために、それはバッファを指すように持っています 構造体にタブに関する情報が含まれている場合は、タブテキストが含まれます。構造体が の情報を受け取る場合、このメンバーは、タブテキストを受け取るバッファ のアドレスを指定します。

例:

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

両方tcItem.pszTextbufは同じテキストを指します。それとも、推奨Unicodeの設定を使用しているように見えます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 

CStringを使用しています。 UNICODEをANSI(std::string)に変換しないでください。この変換はほとんどの場合、ラテン語では機能しますが、必要はありません。 STLで使用する必要がある場合はstd::wstringを、インターネットなどにデータを送信する場合はUTF-8に変換することができます。

std::string str = CW2A(tabCurrentCString, CP_UTF8); 
関連する問題