如何从MFC中的CTabCtrl获取当前Tab项名称?

时间:2017-10-11 20:40:22

标签: c++ tabs 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,但主要的问题是如何从选项卡中获取文本。

1 个答案:

答案 0 :(得分:2)

tcItem.pszText指向0。要用文本填充它,必须在调用GetItem之前指向缓冲区:

文档:CTabCtrl::GetItem

  

<强> pszText

     

指向以null结尾的字符串的指针,该字符串包含选项卡文本   结构包含有关选项卡的信息。如果结构是   接收信息时,该成员指定缓冲区的地址   收到标签文本。

示例:

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都会指向相同的文字。或者CString / 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

看起来您正在使用推荐的Unicode设置。避免将UNICODE转换为ANSI(std::string)。这种转换大部分时间都适用于拉丁语言,但不需要。如果您需要在STL中使用{1}},或者如果您想将数据发送到互联网等,则可以使用转换为UTF-8。

std::wstring