FAQ по C/C++/Visual C++
![]() Работа с сетью![]() ![]() Работа с CTabCtrl (MFC) |
Составители: SUnteXx, Leprecon |
| Работа с CTabCtrl (MFC) | |||
|
На нашем основном диалоге (там где будут сидеть вкладки) рисуем ТабКонтрол (он №19 на панели инструментов) по размеру соответствующий желаемым размерам будущих страниц. Создаём шаблоны диалогов в редакторе ресурсов (это наши будущие страницы), на второй странице их св-в (щелчок правой кнопкой мыши на диалоге -> Properties) ставим каждому Style = child Border = None Title bar = no Размеры диалогов значения не имеет, им вовсе не обязательно быть одинаковыми и совпадать по размеру с ТабКонтролом. Пусть класс нашего основного диалога зовётся COurDlg. Тогда: Члены класса COurDlg: HWND m_TabPages[_d_TabPagesNum];В заголовке класса COurDlg объявим количество будущих страниц в ТабКонтроле #define _d_TabPagesNum 2В конструкторе COurDlg::COurDlg ZeroMemory(m_TabPages, sizeof(m_TabPages));В COurDlg::OnInitDialog() //.........................
//.........................
//Счетчик для циклов
int i;
//Создадим страницы если ещё не созданы
//(!!!) здесь предполагается что идентификаторы шаблонов диалогов равны IDD_DIALOG1, IDD_DIALOG1 + 1 и т.д.
if (!m_TabPages[0])
{
for (i = 0; i < _d_TabPagesNum; i++)
{
m_TabPages[i] = CreateDialog(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDD_DIALOG1 + i), m_TabCtrl, NULL);
}
}
//Зададим страницам правильные размер и положение на ТабКонтроле
CRect l_Rect;
m_TabCtrl.GetClientRect(l_Rect);
l_Rect.top += 25;
l_Rect.left += 2;
l_Rect.right -= 2;
l_Rect.bottom -= 2;
for (i = 0; i < _d_TabPagesNum; i++)
{
::MoveWindow(m_TabPages[i], l_Rect.left, l_Rect.top, l_Rect.Width(), l_Rect.Height(), true);
}
//Создаём закладки в контроле
for (i = 0; i < _d_TabPagesNum; i++)
{
CString c_Caption;
c_Caption.Format("%d", i);
m_TabCtrl.InsertItem(i, c_Caption /*Впишите сюда свои названия закладок*/);
}
//Делаем первую страницу активной
m_TabCtrl.SetCurSel(0);
ActivateTabPage(0);Далее, создаём функцию-член класса COurDlg (она будет отображать нужную нам страницу и прятать остальные)void COurDlg::ActivateTabPage(int p_NumPageToActivate)
{
for (int i = 0; i < _d_TabPagesNum; i++)
{
::ShowWindow(m_TabPages[i], ((i == p_NumPageToActivate) ? SW_SHOW : SW_HIDE));
}
}2) ТабКонтрол -> TCN_SELCHANGEvoid COurDlg::OnSelchange***(NMHDR* pNMHDR, LRESULT* pResult)
{
ActivateTabPage(m_TabCtrl.GetCurSel());
*pResult = 0;
}3) Если вы также хотите обрабатывать смену страницы (в смысле - в зависимости от каких-то критериев менять страницу или нет), то делаем так: Создаём обработчик ТабКонтрол -> TCN_SELCHANGING void COurDlg::OnSelchanging***(NMHDR* pNMHDR, LRESULT* pResult)
{
int l_OldPageNum = m_TabCtrl.GetCurSel();
//если разрешить менять страницу то
*pResult = 0;
//если запретить менять страницу то
*pResult = 1;
}Всё. Радуемся жизни :)
| |||
|
|
FAQ составлен по материалам Форума на Исходниках.Ру. Copyright © 2002 by Sources.ru. All rights reserved. |