Чтение онлайн

ЖАНРЫ

Программирование на Visual C++. Архив рассылки

Jenter Алекс

Шрифт:

BOOL CTabDlg::OnInitDialog {

 TC_ITEM tci; // в нее записываются параметры создаваемой закладки

 memset(&tci,0,sizeof(tci));

 tci.mask = TCIF_TEXT; // у закладки будет только текст

 tci.pszText = "Закладка 1"; // название закладки

 m_Tab.InsertItem(0, &tci); // первая закладка имеет индекс 0

 tci.pszText = "Закладка 2";

 m_Tab.InsertItem(1, &tci); //
вставляем вторую закладку

 return TRUE;

}

Ну вот, у нас есть две закладки. Теперь нам нужно поместить что-нибудь внутрь. 

Прежде всего, для каждой из закладок нужно создать диалог, который будет отображаться при выборе этой закладки. Например, создайте для начала два диалога – IDD_TABPAGE1 и IDD_TABPAGE2. В свойствах каждому поставьте тип "Child" – "дочерний" (properties|styles|style:Child) и "Без рамки" (properties|styles|border:None). Для каждого диалога нужно создать соответствующий класс. Это можно сделать, два раза кликнув по поверхности диалога в редакторе. У меня получились классы CTabPage1 и CTabPage2.

Нужные контролы и обработчики в диалоги можно поместить на данном этапе, а можно и потом (хотя для оценки размеров лучше все-таки это сделать сейчас. Потом можно будет внести любые изменения). Но для тестирования какие-нибудь отличительные знаки в них поставить нужно обязательно , а то вы просто не узнаете, какие диалоги где у вас выводятся – все будут одинаковые.

В классе вашего диалога, кому принадлежит TabCtrl (в примере — CTabDlg) добавьте переменную-указатель на текущий диалог:

protected:

 CTabCtrl m_Tabs;

 CDialog* m_pTabDialog; // <--- добавить

В конструкторе класса проинициализируйте ее в 0:

CTabDlg::CTabDlg(CWnd* pParent /*=NULL*/)

 : CDialog(CTabDlg::IDD, pParent) {

 m_pTabDialog=0;

}

Зайдите в ClassWizard и для TabCtrl добавьте обработчик TCN_SELCHANGE (изменение закладки). 

Теперь мы будем динамически удалять прошлый диалог/создавать новый и выводить его в TabControl.

Вот как это выглядит:

void CTabDlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult) {

 int id; // ID диалога

 // надо сначала удалить предыдущий диалог в Tab Control'е:

 if ((m_pTabDialog) {

m_pTabDialog->DestroyWindow;

delete m_pTabDialog;

 }

 // теперь в зависимости от того, какая закладка выбрана, 

 // выбираем соотв. диалог

 switch(m_Tab.GetCurSel+1) // +1 для того, чтобы порядковые номера закладок

 // и диалогов совпадали с номерами в case

 {

 // первая закладка

 case 1:

id = IDD_TABPAGE1;

m_pTabDialog = new CTabPage1;

// тип
указателя соответствует нужному диалогу,

// иначе добавленный в диалог код не будет функционировать

break;

 // вторая закладка

 case 2:

id = IDD_TABPAGE2;

m_pTabDialog = new CTabPage2;

break;

// все остальные закладки, если они есть,

// будут здесь тоже представлены, каждая – отдельным case

// а если обработка такого номера не предусмотрена

 default:

m_pTabDialog = new CDialog; // новый пустой диалог

return;

 } // end switch

 // создаем диалог

 m_pTabDialog->Create(id, (CWnd*)&m_Tabs); //параметры: ресурс диалога и родитель

 CRect rc; 

 m_Tab.GetWindowRect(&rc); // получаем "рабочую область"

 m_Tab.ScreenToClient(&rc); // преобразуем в относительные координаты

 // исключаем область, где отображаются названия закладок:

 m_Tab.AdjustRect(FALSE, &rc); 

 // помещаем диалог на место...

 m_pTabDialog->MoveWindow(&rc);

 // и показываем:

 m_pTabDialog->ShowWindow(SW_SHOWNORMAL);

 m_pTabDialog->UpdateWindow;

 *pResult = 0;

}

Теперь последний штрих: в OnInitDialog нужно добавить следующий код:

 m_Tab.InsertItem(1, &tci); 

 //-----------------

 // добавить:

 NMHDR hdr;

 hdr.code = TCN_SELCHANGE;

 hdr.hwndFrom = m_Tab.m_hWnd;

 SendMessage(WM_NOTIFY, m_Tab.GetDlgCtrlID, (LPARAM)&hdr);

 //-----------------

 return TRUE;

}

Это необходимо для того, чтобы отобразить самую первую закладку.

Как вариант можно просто вызвать OnSelchangeTab1(0,0); но тогда из OnSelchangeTab1 нужно удалить последнюю строку (*pResult=0).

Можете вволю поэксперементировать со свойствами и стилями CTabCtrl. Мне, например, очень нравятся закладки, надписи на которых подсвечиваются при наведении курсора мыши, кстати это имеет место в MS Access 97 (стиль TCS_HOTTRACK).

И еще: не забудьте, если диалог у вас немодальный, вы должны обеспечить корректный обмен данными между активным диалогом в Tab Control и вашим приложением. Это делается точно так же, как и обычный обмен данными с немодальным диалогом.

ОБРАТНАЯ СВЯЗЬ 
Поделиться с друзьями: