Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры по Леонову, 5семестр.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
503.3 Кб
Скачать

34. Классы cPropertySheet и cPropertyPage.

Набор свойств представляет собой особый вид диалогового окна, применяемый для модификации свойств как самого приложения, так и каких-то внешних объектов. Набор свойств содержит три основные части:

  1. Блок диалога, внутри кот размещаются все остальные элементы набора свойств.

  2. Одна или несколько страниц свойств.

  3. Вкладки, расположенные вверху каждой страницы.

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

Создание набора свойств.

Библиотека MFC предоставляет специальные классы для создания набора свойств и обеспечения работы с ним: CpropertySheet и CpropertySheetEx позволяют создать набор свойств, CpropertyPage и CpropertyPageEx предназначены для создания включаемых в набор страниц свойств. Надо заметить, что все эти классы доступны только в Visual C++ 6.0.

Проще всего создать набор свойств, воспользовавшись средством добавления в проект различных программных компонентов. Для этого выбирают команду Insert/Component, а затем вставляют в проект набор свойств с требуемыми характеристиками.

При этом требуется проделать следующее:

- определить, будет ли добавляемый компонент набором свойств или мастером;

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

- определить, будет ли набор свойств модальным или нет;

- задать класс из набора существующих в проекте классов, который будет иметь функцию создания набора свойств и возможность доступа его элементам;

- задать количество страниц;

- заменить имена создаваемых классов (по желанию).

Если впоследствии понадобится добавить новые страницы свойств, то следует воспользоваться механизмом, изложенным ниже.

Создание объекта "набор свойств"

создание объекта класса С Property Sheet в тексте программы. Обычно такой объект создается в обработчике команды, осуществляющей вывод на экран набора свойств.

CPropertySheet propsheet;

CPropertySheet propsheet("Параметры", pParentWnd);

ИЛИ

CPropertySheet propsheet("Параметры ", GetParent());

Конструктор класса имеет несколько реализаций:

CPropertySheet: : CPropertySheet ()

CPropertySheet: : CPropertySheet (

UINT nIDCaption,

CWnd* pParentWnd = NULL,

UINT iSelectPage = 0)

CPropertySheet: :CPropertySheet (

LPCTSTR pszCaption,

CWnd* pParentWnd = NULL,

UINT iSelectPage = 0)

Параметр nlDCaptionидентификатор заголовка для набора свойств; pParentWndуказатель на родительское окно. Если его значение равно NULL, то родитель­ским окном является главное окно приложения. Параметр iSelectPageиндекс страницы, выводимой первой при отображении набора свойств на экран. По умолчанию выводится первая страница набора свойств. Параметр pszCaptionуказатель на строку, содержащую заголовок для набора свойств (не может быть равным NULL).

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

Примечание

Немодальный набор свойств по умолчанию не содержит кнопок, и в большин­стве случаев в него потребуется добавить элементы управления для того, что­бы его можно было в дальнейшем по крайней мере закрыть.

Настройка окна набора свойств

По умолчанию набор свойств выделяет окно для размещения страниц свойств с вкладками, для модальных наборов свойств в этом окне также размещаются кнопки OK, Cancel (Отмена) и Apply (Применить). Допускается добавлять и другие необходимые для работы элементы управления, например, дополнительное окно просмотра, в котором будут выводиться изо­бражения, находящиеся в выбираемых пользователем файлах. Дополнительные элементы управления можно вводить в обработчике OnCreate, однако лучше это делать в функции OnlnitDialog, т. к. на момент вызова этой функции уже созданы окна страниц свойств, доступ к которым также может понадобиться.

Вставка дополнительных элементов управления в набор свойств обычно требует увеличения размеров его диалогового окна. Для этого после вызова функции базового класса OnCreate или OnlnitDialog необходимо вызвать ункцию CWn::Get WindowRect для получения значений размеров текущего окна набора свойств, задать требуемые размеры и вызвать функцн CWnd::MoveWindow или CWnd::SetWindowPos для изменения размеров окна, в котором выводится набор свойств.

Добавление страниц

Наиболее удобный способ обеспечения доступа к страницам свойств внутри набора свойств является встраивание объектов класса С Property Page в класс производный от CPropertySheet. Такой подход отличается от разработки модальных наборов свойств, когда объект-владелец набора свойств создаёт объекты С Property Page, а затем передает их набору свойств, вызывая функцию С Property Sheet::Add Page.

На этом этапе следует сделать еще одно важное замечание: если нужно создать несколько объектов класса CPropertySheet, например, массив шип наборов свойств, то следует воспользоваться не конструктором CPropertyShw а функцией Construct:

void CPropertySheet::Construct (

UINT nlDCaption,

CWnd* pParentWnd = NULL,

UINT iSeiectPage = 0)

или

void CPropertySheet::Construct (

LPCTSTR pszCaption,

CWnd* pParentWnd = NULL,

UINT iSeiectPage = 0)

Параметры здесь те же, что и у конструктора класса CPropertySheet. Даннув функцию можно вызывать, если ни один из конструкторов с параметрами клас­са CPropertySheet еще не вызывался. В случае создания массива объектов CPropertySheet вызов функции Construct обязателен для каждого элемента мас­сива.

Следующим важным шагом на пути создания набора свойств будет выпол­нение следующих операций для каждой добавляемой в набор свойств страницы:

- создание одного объекта каждого класса, производного от класса CPropertyPage, который ранее был создан с помощью Class Wizard;

- вызов функции СProperty Sheet:: AddPage для каждой страницы, добавляе­мой в набор свойств.

Обычно функция, в которой создается объект CPropertySheet, на этом же шаге также создает и объекты класса CPropertyPage. Однако если создается производный от СProperty Sheet класс, то можно встроить объекты класса CProperty Page в объект класса СProperty Sheet и вызвать из конструктора про­изводного от СProperty Sheet класса функцию СProperty Sheet: :Add Page для каждой страницы свойств. Функция Add Page добавляет страницу свойств в набор свойств, однако не создает окно для этой страницы. Следовательно, для добавления страницы можно не ждать создания окна набора свойств, а вызвать функцию AddPage непосредственно из конструктора.

Создание модального окна свойств

Создание набора свойств в виде модального блока диалога осуществляется вызовом функции DoModal:

virtual int CPropertySheet::DoModal ()

Выводит на экран модальный набор свойств. Функция возвращает значения IDOK или IDCANCEL, а в случае неуспешного завершения - 0. Следует иметь в виду, что если набор свойств создан как мастер, то возвращаются другие зна­чения.

После завершения работы функции окна и все страницы, связанные с набо­ром свойств, удаляются. Сами объекты остаются существовать.

Создание немодального окна набора свойств

Обычно создаваемая страница свойств является модальной. Так же, как и модальный диалог, пользователь должен закрыть окно модального набора свойств прежде, чем он сможет работать с другими объектами данного при­ложения (окнами, меню и т. п.). Однако существуют случаи, когда необхо­димо создать немодальный набор свойств, который позволяет, не закрыв его, перейти к работе с другими объектами приложения. Немодальный набор свойств формируется вызовом функции СProperty Sheet:: Create.

BOOL CPropertySheet::Create (

CWnd* pParentWnd = NULL,

DWORD dwStyle = (DWORD) -1,

DWORD dwExStyle = 0)

Параметр pParentWnd указывает на родительское окно (если равен NULL, то родительским окном является главное окно приложения); dwStyle задает стили окна (по умолчанию— комбинация стилей WS_SYSMENU, WS_POPUP, WS_ CAPTION, DS_MODALFRAME, DS_CONTEXT_HELP и WS_VISIBLE).

Обмен данными

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

Обмен данными с набором свойств реально является обменом данными с его отдельными страницами. Процедура обмена при этом ничем не отлича­ется от обмена в обычном блоке диалога в силу того, что объект класса СProperlyPage является просто специализированным объектом класса CDialog. При этом используются средства обмена данными диалога (Dialog Data Exchange, DDX), которые позволяют осуществлять обмен между эле­ментами управления блока диалога и переменными объекта-владельца блока диалога,

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

Операции над набором свойств

Для добавления страниц в набор свойств служит функция:

void CPropertySheet::AddPage (CPropertyPage* pPage)

Параметр pPage ~ указатель на добавляемую страницу (не может быть равным NULL). Функция добавляет страницу в набор свойств, располагая ее вкладку справа от последней из уже имеющихся. Страницы в наборе свойств будут рас­полагаться в том же порядке, в каком они добавлялись в него. Функция добав­ляет объект класса CPropertyPage в список страниц свойств класса CPropertySheet, но не создает окно для его размещения. Библиотека откладывает создание ок­на для страницы до того момента, пока пользователь не выберет его.

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

void CPropertySheet::RemovePage (CPropertyPage* pPage)

или

void CPropertySheet::RemovePage (int nPage)

Параметр pPage в первой версии — указатель на удаляемую страницу (не может быть равен NULL), а во второй — индекс страницы, которая должна быть удалена (должен лежать в пределах от 0 до значения, на единицу меньшего числа стра­ниц в наборе свойств).

Функция удаляет страницу из набора свойств и уничтожает ассоциированное с ней окно. Сам объект CPropertyPage не удаляется до того момента, пока вла­делец окна CPropertySheet не закроет его.

В ходе работы с набором свойств может появиться необходимость опре­делить какие-либо из его атрибутов или изменить их. Для этого в клас­се CPropertySheet реализованы следующие функции: GetActiveIndex, GetPage, GetPagelndex, GelPageCount, Get Active Page, SetActivePage, SetTitle.

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

CTabCtrl* CPropertySheet::GetTabControl ()

Возвращает указатель на объект класса CTabCtrl.

Вкладки входят в набор свойств неявно и в общем случае нет необходимости работать с ними отдельно, достаточно лишь при создании страницы свойств за­дать текст, который должен будет появиться на вкладке страницы — все осталь­ное за вас сделает библиотека. Но может возникнуть ситуация, когда понадо­бится произвести некоторые дополнительные действия с вкладками набора свойств, например, поместить на вкладки битовые изображения. Тогда можно воспользоваться данной функцией, чтобы затем с помощью функций класса CTabCtrl выполнить необходимые операции.

Для завершения работы набора свойств служит функция:

void CPropertySheet::EndDialog (int nEndlD)

Параметр nEndlD задает значение, которое возвращает как результат своей ра­боты функция DoModal.

Функция EndDialog вызывается библиотекой, когда окно набора свойств за­крывается нажатием кнопок ОК., Cancel или иным способом — нажатием клавиши <Esc> или нажатием кнопки закрытия окна в правой части заго­ловка, а также в случае, если будет нажата кнопка Close (Закрыть). Самим эту функцию можно вызывать в том случае, когда происходит событие, тре­бующее закрытия набора свойств.

Создание страницы свойств

Класс CPropertyPage имеет три версии конструктора:

CPropertyPage::CPropertyPage (),

CPropertyPage::CPropertyPage (

UINT nIDTemplate,

UINT nIDCaption = 0)

И

CPropertyPage::CPropertyPage (

LPCTSTR IpszTemplateName,

UINT nIDCaption = 0)

Параметр nIDTemplateидентификатор шаблона создаваемой страницы; nIDCaptionидентификатор строки, которая будет помещена на вкладку дан­ной страницы (если параметр задан равным 0, то имя будет взято из шаблона диалога для данной страницы); IpszTemplateNameуказатель на строку, со­держащую имя шаблона диалога для данной страницы (не может быть равным NULL).

В случае, если создается массив страниц свойств, вместо конструктора ис­пользуется функция Construct.

Изменение состояния

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

void CPropertyPage::SetModifled (BOOL bChanged = TRUE)

Делает доступной или недоступной кнопку Apply набора свойств в зависимости от того, должны ли быть применимы параметры, задаваемые в странице свойств, к внешнему объекту. Параметр bChanged может иметь значение TRUE, если с момента последнего применения измененных параметров страницы свойств пользователь внес новые изменения, и FALSE, если значения, заданные в стра­нице свойств, уже применены к внешнему объекту или они должны быть проиг­норированы.

Мастера

Мастер (Wizard) представляет собой набор свойств с последовательным на­бором страниц, которые пользователь может переключать (перемещение при этом идет на одну страницу вперед или назад). Мастера широко приме­няются в программах, например, для установки нового оборудования или создания факсимильного сообщения. Нейор свойств в режиме мастера не имеет вкладок в верхней части страниц, и на экран в текущий момент вре­мени выводится только одна страница свойств. В отличие от обычного на­бора свойств, мастер не имеет кнопок (OK и Apply (Применить), а содержит кнопки Back (Назад), Next (Далее) или Finish (Готово), Cancel (Отмена) и Help (Справка).