如何从MFC中的CTabCtrl获取当前的选项卡项目名称?
问题描述:
我正在尝试获取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,但主要问题是如何从该选项卡中获取文本。
答
tcItem.pszText
指向0
。要使用文本填充它,它指向的缓冲区中调用,以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.pszText
和buf
将指向相同的文本。或者使用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中使用std::wstring
,则可以使用std::wstring
;如果要将数据发送到Internet等,则可以将其转换为UTF-8。
std::string str = CW2A(tabCurrentCString, CP_UTF8);