gpt4 book ai didi

c++ - TabCtrl_GetItem 宏未按预期工作

转载 作者:行者123 更新时间:2023-11-28 00:38:15 26 4
gpt4 key购买 nike

我正在创建一个基本的记事本程序,当用户单击关闭时,我希望它询问用户是否要保存当前打开的文档。我使用的是选项卡式界面,并尝试检索文件名(选项卡上的文本),所以我有一个消息框,上面写着“你想保存:untitled.txt”或类似内容。我在获取文件名时遇到问题。这是我目前拥有的:

case ID_FILE_CLOSE:  // When the close button is clicked
{
HWND hEdit, hTabs;
hTabs = GetDlgItem( hwnd, IDC_MAIN_TAB );
int curTab = TabCtrl_GetCurSel( hTabs );

TCITEM curtitem;
TabCtrl_GetItem( hTabs, curTab, &curtitem );

// Check for file name
MessageBox( hwnd, curtitem.pszText, "Test", MB_OK );
}
break;

这是我在带有 Break、Continue、Ignore 按钮的弹出框中不断遇到的错误:

notepadpremium.exe 中 0x7597d298 处的未处理异常:0xC0000005:访问冲突读取位置 0xcccccccc。

我使用的是 MS Visual C++ Express 2010。

我还有一个列表框,其中的文件名也显示了扩展名(几乎像 notepad++ 文档切换器),并通过消息尝试了 LB_GETITEMDATA,但总是返回空白。我认为那是因为我使用 LB_ADDSTRING 将其添加到列表框。 (列表框和标签是相互关联的,当你点击列表框中的一个文件时,它会变成相应的标签)。为什么我的代码没有按应有的方式工作?

最佳答案

Read the documentation :

pitem Type: LPTCITEM

Pointer to a TCITEM structure that specifies the information to retrieve and receives information about the tab. When the message is sent, the mask member specifies which attributes to return. If the mask member specifies the TCIF_TEXT value, the pszText member must contain the address of the buffer that receives the item text, and the cchTextMax member must specify the size of the buffer.

您根本没有初始化 TCITEM。您需要告诉 TabCtrl_GetItem() 要检索什么数据,更重要的是, 提供什么缓冲区来接收该数据。您没有执行任何操作,而是将随机数据传递给 TabCtrl_GetItem(),这就是它崩溃的原因。

试试这个:

case ID_FILE_CLOSE:  // When the close button is clicked
{
HWND hTabs = GetDlgItem( hwnd, IDC_MAIN_TAB );

int curTab = TabCtrl_GetCurSel( hTabs );
TCHAR szFileName[MAX_PATH+1] = {0};

TCITEM curtitem = {0};
curitem.mask = TCIF_TEXT;
curitem.pszText = szFileName;
curitem.cchTextMax = MAX_PATH;

if (TabCtrl_GetItem( hTabs, curTab, &curtitem ))
{
// also from the documentation:
//
// "the control may change the pszText member of the structure
// to point to the new text instead of filling the buffer with
// the requested text. The control may set the pszText member
// to NULL to indicate that no text is associated with the item."
//
// which means you cannot rely on the szFileName[] buffer actually
// containing the filename, you have to use whatever buffer the
// TCITEM is actually pointing at, which may or may not be the
// szFileName buffer...

MessageBox( hwnd, curitem.pszText, TEXT("Test"), MB_OK );
}
}
break;

关于您的 ListBox 问题,您说您正在使用 LB_ADDSTRING 将字符串添加到 ListBox,但正在使用 LB_GETITEMDATA 来检索它们。那是错的。您需要改用 LB_GETTEXTLENLB_GETTEXTLB_GETITEMDATA 用于检索使用 LB_SETITEMDATA 添加到 ListBox 的用户定义数据。

关于c++ - TabCtrl_GetItem 宏未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20081032/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com