2017-10-11 324 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; 

我顯然有一些不必要的字符串轉換,目前這個返回一個「錯誤讀取字符串的字符」在

tcItem.pszText; 

我怎樣才能從CTabCtrl字符串?我最終試圖獲得一個std :: string,但主要問題是如何從該選項卡中獲取文本。

回答

2

tcItem.pszText指向0。要使用文本填充它,它指向的緩衝區中調用,以GetItem前:

的文檔:CTabCtrl::GetItem

pszText

指向一個空結束的字符串如果 結構包含有關選項卡的信息,則包含選項卡文本。如果結構是 接收信息,該成員指定接收選項卡文本的緩衝區 的地址。

實施例:

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將指向相同的文本。或者使用CStringCString::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 

它看起來像您使用的是推薦的Unicode設置。避免將UNICODE轉換爲ANSI(std::string)。這種轉換在大部分時間都適用於拉丁語言,但不是必需的。如果需要在STL中使用std::wstring,則可以使用std::wstring;如果要將數據發送到Internet等,則可以將其轉換爲UTF-8。

std::string str = CW2A(tabCurrentCString, CP_UTF8); 
相關問題