Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2013, 14:23   #1
nubak
Пользователь
 
Регистрация: 26.01.2013
Сообщений: 18
По умолчанию Tab Control в MFC

Я создал 2 вкладки в диалоговом окне, однако при попытке переключится между ними компилятор выдаёт: "Необработанное исключение в "0x60c4e61c (mfc100ud.dll)" в "Example.exe": 0xC0000005: Нарушение прав доступа при чтении "0xccccccec"."(Visual Studio 2010). Вот код
Код:
TCITEM item;
//Инициализация вкладок
	CString csName("Вкладка 1");
	CRect rcTab;
	int x;
	int y;
 
	m_tabSet.Create(TabSet::IDD, this);
 
	item.mask=TCIF_PARAM|TCIF_TEXT;
	item.pszText=csName.LockBuffer();
	m_tabCTRL.GetWindowRect( rcTab );
	ScreenToClient( rcTab );
 
	x = rcTab.left + 2;
	y = rcTab.top + 22;
 
	m_tabCTRL.InsertItem( 0, &item );
	m_tabSet.SetWindowPos( &m_tabCTRL, x, y, 0, 0, SWP_NOSIZE);

	TCITEM item1;
	CString csName1("Вкладка 2");
	CRect rcTab1;
	int x1;
	int y1;
 
	m_tabSet2.Create(TabSet2::IDD, this);
 
	item1.mask=TCIF_PARAM|TCIF_TEXT;
	item1.pszText=csName1.LockBuffer();
	m_tabCTRL.GetWindowRect( rcTab1 );
	ScreenToClient( rcTab1 );
 
	x1 = rcTab1.left + 2;
	y1 = rcTab1.top + 22;
 
	m_tabCTRL.InsertItem( 0, &item1 );
	m_tabSet2.SetWindowPos( &m_tabCTRL, x1, y1, 0, 0, SWP_NOSIZE);
//Функция переключения вкладок
void ShowPage(CTabCtrl* pTab, int nItem, int nCommand) {
  TCITEM item;
  CWnd *pDialog;
 
  item.mask=TCIF_PARAM;
  pTab->GetItem( nItem, &item );
  pDialog = (CWnd *)item.lParam;
 
  pDialog->ShowWindow(nCommand);
};
//обработчики событий
void CExampleDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
	ShowPage( &m_tabCTRL, m_tabCTRL.GetCurSel(), SW_SHOW );
	// TODO: добавьте свой код обработчика уведомлений
	*pResult = 0;
}
void CExampleDlg::OnTcnSelchangingTab1(NMHDR *pNMHDR, LRESULT *pResult)
{ 
	ShowPage( &m_tabCTRL, m_tabCTRL.GetCurSel(), SW_HIDE );
	// TODO: добавьте свой код обработчика уведомлений
	*pResult = 0;
}
P.S. большая часть кода - переделанный пример из интернета.
nubak вне форума Ответить с цитированием
Старый 10.03.2013, 16:53   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

какие у вас основания считать, что GetCurSel() вернет правильный индекс - никаких... Далее у вас не срабатывает GetItem и далее item структура остается неинициализированой.
waleri вне форума Ответить с цитированием
Старый 10.03.2013, 19:20   #3
nubak
Пользователь
 
Регистрация: 26.01.2013
Сообщений: 18
По умолчанию

Не подскажете способы это исправить - я просто не знаю в какую сторону идти.
nubak вне форума Ответить с цитированием
Старый 16.03.2013, 14:17   #4
nubak
Пользователь
 
Регистрация: 26.01.2013
Сообщений: 18
По умолчанию

Переиначил код (нашёл ещё один пример)
Код:
TC_ITEM TABITEM;
	TABITEM.mask = TCIF_TEXT;

	TABITEM.pszText =_T("ЗАКЛАДКА1");
	m_ctrTab.InsertItem( 0, &TABITEM );

	TABITEM.pszText =_T("ЗАКЛАДКА2");
	m_ctrTab.InsertItem( 1, &TABITEM );

	TABITEM.pszText =_T("ЗАКЛАДКА3");
	m_ctrTab.InsertItem( 2, &TABITEM );

	Page1* PPAGE1;
	PPAGE1 = new Page1;
	TABITEM.mask = TCIF_PARAM;
	TABITEM.lParam = (LPARAM)PPAGE1;
	m_ctrTab.SetItem(0, &TABITEM);
	VERIFY(PPAGE1->Create(Page1::IDD, &m_ctrTab));
	PPAGE1->SetWindowPos(NULL, 10, 30, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
	PPAGE1->ShowWindow(SW_SHOW);

	Page2* PPAGE2;
	PPAGE2 = new Page2;
	TABITEM.mask = TCIF_PARAM;
	TABITEM.lParam = (LPARAM)PPAGE2;
	m_ctrTab.SetItem(1, &TABITEM);
	VERIFY(PPAGE1->Create(Page2::IDD, &m_ctrTab));
	PPAGE2->SetWindowPos(NULL, 10, 30, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
	PPAGE2->ShowWindow(SW_HIDE);

	Page3* PPAGE3;
	PPAGE3 = new Page3;
	TABITEM.mask = TCIF_PARAM;
	TABITEM.lParam = (LPARAM)PPAGE3;
	m_ctrTab.SetItem(2, &TABITEM);
	VERIFY(PPAGE1->Create(Page3::IDD, &m_ctrTab));
	PPAGE3->SetWindowPos(NULL, 10, 30, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
	PPAGE3->ShowWindow(SW_HIDE);

void CVkladkaDlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
	INT NTAB = m_ctrTab.GetCurSel();
	TC_ITEM TCI;
	TCI.mask = TCIF_PARAM;
	m_ctrTab.GetItem(NTAB, &TCI);
	ASSERT(TCI.lParam);
	CWnd* PWND = (CWnd *)TCI.lParam;
	PWND->ShowWindow(SW_SHOW);
	// TODO: добавьте свой код обработчика уведомлений
	*pResult = 0;
}


void CVkladkaDlg::OnTcnSelchangingTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
	INT NTAB = m_ctrTab.GetCurSel();
	TC_ITEM TCI;
	TCI.mask = TCIF_PARAM;
	m_ctrTab.GetItem(NTAB, &TCI);
	ASSERT(TCI.lParam);
	CWnd* PWND = (CWnd *)TCI.lParam;
	PWND->ShowWindow(SW_HIDE);
	// TODO: добавьте свой код обработчика уведомлений
	*pResult = 0;
}
Но теперь выпрыгивает такое
nubak вне форума Ответить с цитированием
Старый 16.03.2013, 18:48   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от nubak Посмотреть сообщение
Не подскажете способы это исправить - я просто не знаю в какую сторону идти.
В сторону проверки значения, полученого от GetCurSel...

В новом варианте ничего не изменилось - TCITEM содержит "мусор"
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
tab control в mdi Dj-IIyIIc Visual C++ 0 20.09.2012 01:18
c++ mfc элемент EGIT CONTROL Найки Общие вопросы C/C++ 2 14.12.2011 22:10
MFC text control Neolit1819 Помощь студентам 1 15.04.2011 15:44
Tab Control, цвет подложки dueram Win Api 0 23.01.2010 13:51