2017-10-11 207 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); 
相关问题