Академический Документы
Профессиональный Документы
Культура Документы
ЛЕКЦИЯ 13
ЗАКЛАДКИ ______________________________________________________________________________ 1
Свойства закладки ______________________________________________________________________ 1
Функции класса CTabCtrl _________________________________________________________________ 2
Создание закладки______________________________________________________________________ 2
Добавление корешка ____________________________________________________________________ 3
Тестирование обработчика изменения активного корешка _____________________________________ 4
Создание страниц закладки ______________________________________________________________ 4
Открытие немодальных дочерних диалогов _________________________________________________ 5
Вычисление положения и размеров страниц ________________________________________________ 6
Отображение страниц закладки ___________________________________________________________ 6
ЛИСТЫ СВОЙСТВ _______________________________________________________________________ 6
Обмен данными с листами свойств ________________________________________________________ 8
ЗАКЛАДКИ
Часто в окне диалога нужно поместить гораздо больше элементов управления, чем оно может вме-
стить. Чтобы решить эту проблему, используются закладки. Они напоминают обычные закладки в книжке.
Кроме того, закладки группируют эти элементы, разделяя их, например, по темам.
Для реализации набора закладок используется класс CTabCtrl. Иерархия классов относительно
CTabCtrl показана на рисунке
CObject
CCmdTaget
CWnd
CTabCtrl
Элемент управления закладка (TAB) позволяет выводить страницы на экран, если пользователь
щелкнул на ее корешке. Можно создать закладку, корешки которой имеют вид кнопок. Чаще всего заклад-
ки используются вместе с листами свойств и создаются автоматически. Каждый корешок закладки может
иметь надпись, значок и 32-битное значение, определяемое приложением.
Свойства закладки
Если закладка создается с помощью редактора диалоговых окон, то на странице свойств Styles дос-
тупны следующие стили:
Multiline корешки закладки будут отображаться в несколько рядов;
Alignment определяет ширину корешков на закладке;
Right Justify (по умолчанию), ширина корешков увеличена чтобы полностью заполнить ряд;
Fixed Width все корешки будут иметь одинаковую ширину;
Ragged Right ширина корешков не увеличивается для полного заполнения ряда;
Buttons корешки будут иметь вид кнопок;
Создание закладки
Закладку можно создать во время выполнения программы. Закладка создаётся в два шага. Сначала
объявляется экземпляр класса с помощью конструктора без параметров CTabCtrl ( ). Удобнее всего это
сделать в интерфейсе класса текущего диалогового окна.
Для создания собственно элемента управления используется функция, которая создает элемент
управления “закладка“ и присоединяет его к объекту класса CTabCtrl. Эту функцию удобно вызывать при
инициализации текущего диалогового окна.
BOOL Create ( DWORD dwStyle , const RECT & rect , CWnd* pParentWnd , UINT nID ) ;
dwStyle стиль закладки;
rect задает расположение и размеры закладки;
pParentWnd задает родительское окно;
nID идентификатор закладки.
Стиль закладки dwStyle может быть суммой нескольких флагов:
Добавление корешка
Добавить корешки в закладку можно только во время выполнения программы. Для этой цели служат
четыре перегруженные функции, определённые в классе CTabCtrl:
BOOL InsertItem ( int nItem , LPCTSTR lpszItem ) ;
BOOL InsertItem ( int nItem , LPCTSTR lpszItem , int nImage ) ;
BOOL InsertItem ( int nItem , TCITEM* pTabCtrlItem ) ;
BOOL InsertItem ( UINT nMask , int nItem , LPCTSTR lpszItem , int nImage , LPARAM lParam ) ;
Функции возвращают ноль, если создан новый корешок закладки и –1 в противном случае. Параметры
функций имеют следующее назначение:
nItem индекс нового корешка;
lpszItem указатель на строку названия корешка;
nImage индекс пиктограммы, который хранится в связанном элементе управления типа
CImageList.
lParam определенные приложением данные, связанные с закладкой.
pTabCtrlItem указатель на структуру TCITEM, которая определяет атрибуты корешка;
nMask определяет, какие атрибуты структуры TCITEM используются. Может быть нулем или
комбинацией следующих значений:
TCIF_TEXT используется член структуры pszText;
TCIF_IMAGE используется член структуры iImage;
TCIF_PARAM используется член структуры lParam;
TCIF_STATE используется член структуры dwState;
TCIF_RTLREADING текст pszText читается справа налево.
Созданные корешки будут пронумерованы последовательно, начиная с нуля. Нумерация выполняет-
ся с учётом относительных значений параметра nItem. Корешок, созданный первым, будет активным.
Рассмотрим пример добавления корешков.
создаём проект под именем Demo;
добавляем в диалоговое окно IDD_DEMO_DIALOG элемент управления типа Tab Control с име-
нем IDC_TAB;
добавляем в тело функции OnSelchangeTab ( ), команды, которые определяют номер активного ко-
решка;
void CDemoDlg :: OnSelchangeTab ( NMHDR* pNMHDR , LRESULT* pResult )
{
CString S ;
S.Format ("%i", m_tab.GetCurSel ( ) ) ;
MessageBox ("Номер активного корешка "+ S ) ;
*pResult = 0 ;
}
ЛИСТЫ СВОЙСТВ
Листы свойств позволяют автоматически связать шаблон блока диалога с конкретной страницей за-
кладки. Эти диалоги будут автоматически отображаться, когда пользователь щелкает на закладках. Листы
в диалоговом окне Components and Controls Gallery Откройте папку Visual C++ Components,
выберите в ней элемент PropertySheet и нажмите кнопку Insert ;
укажите тип будущего листа свойств;
выберите класс, который будет иметь доступ к листу свойств (как правило, это класс диалогового
окна из которого осуществляется вызов листа свойств);
Мастер добавляет подключение заголовочного файла в классе, который использует класс страницы
свойств:
// TabulDlg.cpp : implementation file
•••
#include "MyPropertySheet.h"
Мастер добавляет подключение заголовочных файлов страниц к классу страницы свойств:
// MyPropertySheet.h : header file
•••
#include "MyPropertyPage1.h"
Мастер создаёт объекты страниц как члены класса СMyPropertySheet:
class CMyPropertySheet : public CPropertySheet
{
•••
public:
CMyPropertyPage1 m_Page1 ;
CMyPropertyPage2 m_Page2 ;
•••
};
В конструкторе класса окна свойств мастер вызывает функции AddPage ( ) для добавления вкладок в
окно свойств:
CMyPropertySheet :: CMyPropertySheet ( CWnd* pWndParent )
: CPropertySheet ( IDS_PROPSHT_CAPTION , pWndParent )
{
AddPage ( &m_Page1 ) ;
AddPage ( &m_Page2 ) ;
}
Если пользователь закрыл окно свойств с помощью кнопки OK, то введённые данные передаются в
главное диалоговое окно.
Для решения этой задачи нужно добавить в главное диалоговое окно элементы управления и с по-
мощью ClassWizard создать ассоциированные переменные категории Value.
// TabulDlg.h : header file
class CTabulDlg : public CDialog
{
•••
public:
BOOL m_flag ; // объявляет переменную член-класса
CString m_text ; // объявляет переменную член-класса
};
// TabulDlg.cpp : implementation file
CTabulDlg :: CTabulDlg ( CWnd* pParent /*=NULL*/) : CDialog ( CTabulDlg :: IDD , pParent )
{
•••
m_flag = FALSE ; // инициализирует переменную член-класса
m_text = _T ("") ; // инициализирует переменную член-класса
}
void CTabulDlg :: DoDataExchange ( CDataExchange* pDX )
{
•••
DDX_Check ( pDX , IDC_FLAG , m_flag ) ; // обмен данными между переменной m_flag
// и элементом управления IDC_TEXT
DDX_Text ( pDX , IDC_TEXT , m_text ) ; // обмен данными между переменной m_text
// и элементом управления IDC_TEXT
}
Добавляем на страницы свойств аналогичные элементы управления. К сожалению, мастеру
ClassWizard классы страниц свойств недоступны. Поэтому необходимые строки можно создать путём ко-
пирования и небольшого редактирования.
Добавляем в класс CMyPropertyPage1 переменную член-класса m_text:
// MyPropertyPage1.h : header file
class CMyPropertyPage1 : public CPropertyPage
{
•••
public:
CString m_text ; // объявляет переменную член-класса
};
Добавляем в класс CMyPropertyPage2 переменную член-класса m_flag:
// MyPropertyPage1.h : header file
class CMyPropertyPage2 : public CPropertyPage
{
•••
public:
BOOL m_flag ; // объявляет переменную член-класса
};
Инициализируем переменную-член класса m_text в конструкторе класса CMyPropertyPage1:
// MyPropertyPage1.cpp : implementation file
CMyPropertyPage1 :: CMyPropertyPage1( ) : CPropertyPage ( CMyPropertyPage1 :: IDD )