Макрос TabCtrl_GetItem не работает должным образом

Я создаю простую программу-блокнот, и когда пользователь нажимает кнопку «Закрыть», я хочу, чтобы он спросил пользователя, хотят ли они сохранить текущий открытый документ. Я использую интерфейс с вкладками и пытаюсь получить имя файла (текст на вкладке), поэтому у меня есть MessageBox, который говорит: «Вы хотите сохранить: 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:

Необработанное исключение в 0x7597d298 в notepadpremium.exe: 0xC0000005: расположение чтения нарушения доступа 0xcccccccc.

Я использую MS Visual C ++ Express 2010.

У меня также есть список с именами файлов, которые также показывают расширение (почти как переключатель документов notepad ++) и пробовали LB_GETITEMDATA через сообщение, но оно всегда возвращалось пустым. Я думаю, что это потому, что я использую LB_ADDSTRING, чтобы добавить его в список. (окно списка и вкладки взаимосвязаны, когда вы щелкаете файл в списке, он переключается на соответствующую вкладку). Почему мой код не работает так, как должен?

0

Решение

Читать документацию:

pitem
Тип: LPTCITEM

Указатель на структуру TCITEM, которая определяет информацию для извлечения и получения информации о вкладке. Когда сообщение отправлено, член маски указывает, какие атрибуты необходимо вернуть. Если элемент маски указывает значение TCIF_TEXT, элемент pszText должен содержать адрес буфера, который получает текст элемента, а элемент cchTextMax должен указывать размер буфера.

Вы не инициализируете 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_GETTEXTLEN а также LB_GETTEXT вместо. LB_GETITEMDATA используется для извлечения пользовательских данных, которые были добавлены в ListBox с помощью LB_SETITEMDATA,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]