Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC Лекции PDF / VC 13 Лек Закладки.pdf
Скачиваний:
36
Добавлен:
15.02.2015
Размер:
420.76 Кб
Скачать

Лекция 13

Закладки

6

m_page2.ShowWindow ( SW_NORMAL ) ;

// отображает страницу по умолчанию

 

return TRUE ;

 

 

}

 

 

Вычисление положения и размеров страниц

Элемент управления “закладка” содержит корешки, границу и клиентскую область. Очевидно, что дочерние диалоги должны отображаться точно в клиентской области закладки, чтобы не закрывать другие графические элементы закладки. Вычисление размеров и положения клиентской области не является тривиальной задачей, поскольку закладка может иметь несколько рядов корешков произвольного размера, а корешки могут располагаться возле любой стороны закладки. Эту рутинную задачу решает функция AdjustRect ( ) (дословный перевод: соответствующий прямоугольник), прототип которой имеет вид:

void AdjustRect ( BOOL bLarger , LPRECT lpRect ) ;

Функции преобразовывает область закладки в клиентскую область и обратно. Параметры функций имеют следующее назначение:

bLarger

определяет направление преобразования. Если параметр равен TRUE, то функция по-

 

лучает клиентскую область и возвращает область закладки. Если параметр равен

lpRect

FALSE, то функция получает область закладки и возвращает клиентскую область.

указатель на прямоугольник, который получает заданных прямоугольник и возвращает

 

вычисленный;

Для удобства все действия, необходимые для вычисления клиентской области мы поместили в функ- цию-член класса GetPageRect ( ), которая получает ссылку на объект “закладка” и возвращает размер и положение клиентской области. Тело функции имеет вид:

CRect CDemoDlg :: GetPageRect ( CTabCtrl &T ) // получает ссылку на объект “закладка”

{

WINDOWPLACEMENT Pos ;

// состояние окна закладки

T.GetWindowPlacement ( &Pos ) ;

// копирует состояние окна в переменную Pos

CRect Win = Pos.rcNormalPosition ;

// получает размер и положение закладки

T.AdjustRect ( FALSE , Win ) ;

// вычисляет клиентскую область

return Win ;

// возвращает размер и положение клиентской области

}

Отображение страниц закладки

Отобразить выбранную страницу удобнее всего при каждом изменении активного корешка с помощью обработчика сообщения TCN_SELCHANGE – функции OnSelchangeTab ( ). В тело этой функции мы добавляем следующие операции:

скрываем все страницы; определяем индекс выбранного корешка;

отображаем соответствующую страницу. Эти действия реализует следующий код:

void CDemoDlg :: OnSelchangeTab ( NMHDR* pNMHDR , LRESULT* pResult )

{

m_page1.ShowWindow ( SW_HIDE ) ;

// скрывает все страницы

m_page2.ShowWindow ( SW_HIDE ) ;

 

m_page3.ShowWindow ( SW_HIDE ) ;

 

switch ( m_tab.GetCurSel ( ))

// определяет индекс выбранного корешка

{

 

// отображает соответствующую страницу

case 0:

m_page1.ShowWindow ( SW_SHOW ) ;

break

case 1:

m_page2.ShowWindow ( SW_SHOW ) ;

break ;

case 2:

m_page3.ShowWindow ( SW_SHOW ) ;

break ;

}

 

 

*pResult = 0;

}

ЛИСТЫ СВОЙСТВ

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

Выжол Ю.А.

Программирование на Visual C++

Лекция 13

Закладки

7

свойств представляют собой особый вид диалогового окна. Они чаще применяются для указания свойств приложения или каких-либо объектов.

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

Для добавления элемента PropertySheet из галереи компонентов

выберите пункт меню Project Add To Project Components and Controls...

в диалоговом окне Components and Controls Gallery Откройте папку Visual C++ Components,

выберите в ней элемент PropertySheet и нажмите кнопку Insert ; укажите тип будущего листа свойств;

укажите модальный диалог или немодальный;

выберите класс, который будет иметь доступ к листу свойств (как правило, это класс диалогового окна из которого осуществляется вызов листа свойств);

укажите количество страниц в листе свойств;

укажите имена класса страницы свойств и имена классов страниц;

Выжол Ю.А.

Программирование на Visual C++

Лекция 13

Закладки

8

Мастер добавляет подключение заголовочного файла в классе, который использует класс страницы свойств:

//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 ) ;

}

Обмен данными с листами свойств

Для открытия окна с листами свойств мастер добавляет в класс диалогового окна CTabulDlg функ- цию-член класса OnProperties ( ), реализация которой имеет следующий вид:

void CTabulDlg :: OnProperties ( )

 

{

 

CMyPropertySheet propSheet ;

// создаёт объект листов свойств

propSheet.DoModal ( ) ;

// открывает диалоговое окно с листами свойств

}

 

Для того чтобы вызвать эту функцию нам нужно подключить её к какому-либо элементу управления, например к кнопке. Добавляем кнопку IDC_PROP в главное диалоговое окно. Выполняем обработку щелчка на кнопке IDC_PROP – добавляем или редактируем команду вызова функции OnProperties ( ) при щелчке на кнопке IDC_PROP в карте сообщений:

BEGIN_MESSAGE_MAP ( CTabulDlg , CDialog )

• • •

ON_BN_CLICKED ( IDC_PROP , OnProperties ) END_MESSAGE_MAP()

Теперь решим следующую задачу: главное диалоговое окно содержит текстовое поле и флажок:

Выжол Ю.А.

Программирование на Visual C++

Лекция 13

Закладки

9

При нажатии кнопки Properties открывается диалоговое окно со страницами свойств, которые также содержат текстовое поле и флажок:

Если пользователь закрыл окно свойств с помощью кнопки 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 )

Выжол Ю.А. Программирование на Visual C++

Лекция 13

Закладки

10

{

 

 

m_text = _T ("Текст") ;

// инициализирует переменную член-класса

 

• • •

 

 

}

 

 

Инициализируем переменную-член класса m_flag в конструкторе класса CMyPropertyPage2:

 

// MyPropertyPage1.cpp : implementation file

 

 

CMyPropertyPage2 :: CMyPropertyPage2( ) : CPropertyPage ( CMyPropertyPage2 :: IDD )

 

{

 

 

m_flag = TRUE ;

// инициализирует переменную член-класса

 

• • •

 

 

}

 

 

Для осуществления автоматического обмена данными между элементом управления IDC_TEXT и переменной m_text членом класса CMyPropertyPage1 добавляем вызов функции DDX_Text ( ).

// MyPropertyPage1.cpp : implementation file

void CMyPropertyPage1 :: DoDataExchange ( CDataExchange* pDX )

{

CDialog :: DoDataExchange ( pDX ) ;

 

DDX_Text ( pDX , IDC_TEXT , m_text ) ;

// обмен данными между переменной m_text

• • •

// и элементом управления IDC_TEXT

}

Для осуществления автоматического обмена данными между элементом управления IDC_FLAG и переменной m_flag членом класса CMyPropertyPage2 добавляем вызов функции DDX_Check ( ).

// MyPropertyPage1.cpp : implementation file

void CMyPropertyPage2 :: DoDataExchange ( CDataExchange* pDX )

{

CDialog :: DoDataExchange ( pDX ) ;

 

DDX_Check( pDX , IDC_FLAG , m_flag ) ;

// обмен данными между переменной m_flag

• • •

// и элементом управления IDC_FLAG

}

Изменяем тело обработчика щелчка на кнопке IDC_PROP. Теперь функция не только открывает диалоговое окно с листами свойств, но и считывает значения из элементов управления, расположенных на странице свойств.

// TabulDlg.cpp : implementation file void CTabulDlg :: OnProperties ( )

{

CMyPropertySheet propSheet ;

// создаёт объект страницы свойств

if ( propSheet.DoModal ( ) == IDOK )

// открывает диалоговое окно с листами свойств

{

// если пользователь закрыл страницу свойств с помощью кнопки OK

 

m_text = propSheet.m_Page1.m_text ;

// передаёт текст, введённый на первой странице

 

m_flag = propSheet.m_Page2.m_flag ;

// передаёт значение флажка со второй страницы

}

UpdateData ( FALSE ) ;

// передаёт данные из переменных-членов класса

 

// в ассоциированные элементы управления

}

Выжол Ю.А.

Программирование на Visual C++