| « Поставить закладку » « Сделать стартовой » | |||
|
|||
|
Глава 15. Наборы свойств
Глава 15.
Набор свойств представляет собой особый вид диалогового окна, применяемый для модификации свойств как самого приложения, так и каких-то внешних объектов. Набор свойств содержит три основные части:
Рис. 15.1. Окно Options оболочки Visual C++ 6.0 В качестве примера набора свойств можно привести блок диалога просмотра и изменения параметров оболочки Visual C++ 6.0 (рис. 15.1). Использовать набор свойств весьма удобно в тех случаях, когда имеются группы некоторых параметров, которые можно изменять. Он позволяет собрать большое количество информации в небольшие группы, выводимые на экран поочередно, что значительно облегчает и упрощает работу. Наборы свойств могут применяться не только для отображения свойств объектов, но и для группирования сходных по назначению или по используемым параметрам действий. Например, приложение MS Word 97 таким образом группирует действия для поиска, замены и перехода (рис. 15.2).
Рис. 15.2. Окно "Найти и заменить" приложения MS Word 97
Библиотека MFC предоставляет специальные классы для создания набора свойств и обеспечения работы с ним: CPropertySheet и СPropertySheetEx позволяют создать набор свойств, a CPropertyPage и CPropertyPageEx предназначены для создания включаемых в набор страниц свойств. Несколько особняком стоит класс CTabCtrl, используемый для создания вкладок и работы с ними. Дело 'В том, что в общем случае нет необходимости напрямую работать с вкладками в наборе свойств, достаточно лишь задать текст, который нужно поместить на них, а все остальное сделает библиотека. Однако возможность доступа к объектам данного класса все же имеется, и его функции применяются в основном для создания вкладок, отличающихся от создаваемых по умолчанию. Примечание Классы CPropertySheetEx и CPropertyPageEx доступны только в Visual C++ 6.0. Проще всего создать набор свойств, воспользовавшись средством добавления в проект различных программных компонентов. Для этого выберите команду InsertComponent, а затем вставьте в проект набор свойств с требуемыми характеристиками (рис. 15.3).
Рис. 15.3. Окно выбора добавляемых в проект программных компонентов При этом требуется проделать следующее:
Если впоследствии понадобится добавить новые страницы свойств, то следует воспользоваться механизмом, изложенным ниже.
Создание объекта "набор свойств" Следующим шагом будет создание объекта класса СPropertySheet в тексте программы. Обычно такой объект создается в обработчике команды, осуществляющей вывод на экран набора свойств.
ИЛИ
Конструктор класса имеет несколько реализаций:
Если не нужно добавлять в набор свойств дополнительные элементы управления (например, окно предварительного просмотра) или выводить на экран немодальный набор свойств, то создавать класс, производный от класса CpropertySheet, вообще не требуется. Примечание Немодальный набор свойств по умолчанию не содержит кнопок, и в большинстве случаев в него потребуется добавить элементы управления для того, чтобы его можно было в дальнейшем по крайней мере закрыть.
По умолчанию набор свойств выделяет окно для размещения страниц свойств с вкладками, для модальных наборов свойств в этом окне также размещаются кнопки OK, Cancel (Отмена) и Apply (Применить). Допускается добавлять и другие необходимые для работы элементы управления, например, дополнительное окно просмотра, в котором будут выводиться изображения, находящиеся в выбираемых пользователем файлах. Дополнительные элементы управления можно вводить в обработчике OnCreate, однако лучше это делать в функции OnlnitDialog, т. к. на момент вызова этой функции уже созданы окна страниц свойств, доступ к которым также может понадобиться. Вставка дополнительных элементов управления в набор свойств обычно требует увеличения размеров его диалогового окна. Для этого после вызова функции базового класса OnCreate или OnlnitDialog необходимо вызвать функцию CWnd::GetWindowRect для получения значений размеров текущего окна набора свойств, задать требуемые размеры и вызвать функцию CWnd::MoveWindow или CWnd::SetWindowPos для изменения размеров окна, в котором выводится набор свойств.
Наиболее удобный способ обеспечения доступа к страницам свойств внутри набора свойств является встраивание объектов класса CPropertyPage в класс, производный от СPropertySheet. Такой подход отличается от разработки модальных наборов свойств, когда объект-владелец набора свойств создает объекты CPropertyPage, а затем передает их набору свойств, вызывая функцию CProperty'Sheet::AddPage. На этом этапе следует сделать еще одно важное замечание: если нужно создать несколько объектов класса CPropertySheet, например, массив наборов свойств, то следует воспользоваться не конструктором СPropertySheet, а функцией Construct.
ИЛИ
Ниже приведен пример, иллюстрирующий применение этой функции:
Следующим важным шагом на пути создания набора свойств будет выполнение следующих операций для каждой добавляемой в набор свойств страницы:
Обычно функция, в которой создается объект CPropertySheet, на этом же шаге также создает и объекты класса CPropertyPage. Однако если создается производный от CPropertySheet класс, то можно встроить объекты класса CPropertyPage в объект класса CPropertySheet и вызвать из конструктора производного от CPropertySheet класса функцию CPropertySheet::AddPage для каждой страницы свойств. Функция AddPage добавляет страницу свойств в набор свойств, однако не создает окно для этой страницы. Следовательно, для добавления страницы можно не ждать создания окна набора свойств, а вызвать функцию AddPage непосредственно из конструктора.
Для вывода на экран набора свойств необходимо вызвать одну из функций: CPropertySheet::DoModal или CPropertySheet::Create.
Создание модального окна свойств Создание набора свойств в виде модального блока диалога осуществляется вызовом функции DoModai.
После завершения работы функции окна и все страницы, связанные с набором свойств, удаляются. Сами объекты остаются существовать. Как правило, данные от объектов CPropertyPage считываются после того, как функция DoModal вернула значение IDOK.
Создание немодального окна набора свойств Обычно создаваемая страница свойств является модальной. Так же. как и модальный диалог, пользователь должен закрыть окно модального набора свойств прежде, чем он сможет работать с другими объектами данного приложения (окнами, меню и т. п.). Однако существуют случаи, когда необходимо создать немодальный набор свойств, который позволяет, не закрыв его, перейти к работе с другими объектами приложения. Немодальный набор свойств формируется вызовом функции CPropertySheet::Create.
Функцию СProperty Sheet::Create можно вызывать как из конструктора, так и после того, как объект набора свойств уже создан. Функция возвращает управление непосредственно после создания набора свойств. Для уничтожения набора свойств следует использовать функцию CWnd::.DestroyWindow. При создании немодального набора свойств придется выполнить несколько дополнительных операций. Одной из них является обеспечение обмена данными между набором свойств и внешними объектами в то время, когда окно набора свойств открыто. Эта задача целиком совпадает с аналогичной задачей для обычных немодальных блоков диалога. В данном случае такой обмен проще реализовать, создав производный от CPropertySheet класс. Одним из методов обеспечения обмена является определение указателя из набора свойств на внешний объект. Далее следует определить функцию в производном от CPropertySheet классе, которая будет отслеживать изменения данных набора свойств всякий раз, когда фокус ввода передается от одного внешнего объекта к другому. Такая функция вызывается, естественно, не объектом набора свойств, а самим приложением и осуществляет сброс текущих данных каждой страницы для отображения свойств текущего внешнего объекта, для чего она должна иметь доступ к объектам CPropertyPage, определенным в классе CPropertySheet. Примечание Если вы, как и я, воспользовались услугами Galery Components, то всю эту работу за вас проделает мастер, и полученные в последних разделах сведения понадобятся только в случае, когда вы захотите расширить возможности созданного набора свойств.
Кроме вывода на экран набора свойств, следует обеспечить также обмен данными между страницами свойств и объектом-владельцем набора свойств. Как и при работе со всеми блоками диалога, процесс обмена между набором свойств и приложением играет очень важную роль (что, впрочем, неудивительно, ведь набор свойств и служит для того, чтобы задавать значения или параметры, необходимые для работы приложения). Обмен данными с набором свойств реально является обменом данными с его отдельными страницами. Процедура обмена при этом ничем не отличается от обмена в обычном блоке диалога в силу того, что объект класса CPropertyPage является просто специализированным объектом класса CDialog. При этом используются средства обмена данными диалога (Dialog Data Exchange, DDX), которые позволяют осуществлять обмен между элементами управления блока диалога и переменными объекта-владельца блока диалога. Важное различие в обмене данными между обычным блоком диалога и набором свойств заключается в том, что набор свойств имеет в своем составе несколько страниц, для каждой из которых необходимо обеспечить обмен данными.
Следует остановиться еще на одной важной детали — обработке нажатия кнопки Apply (Применить). Набор свойств имеет одну важную способность, отсутствующую у обычных блоков диалога, а именно — позволяет пользователям изменять задаваемые на странице свойств параметры во внешнем объекте до того, как окно с набором свойств будет закрыто. Это осушествляется с помощью кнопки Apply, нажатие которой приводит к изменению у объекта всех параметров всех страниц (а не только текущей активной страницы) в наборе свойств. По умолчанию эта кнопка недоступна. Необходимо самостоятельно написать код программы, делающий ее доступной для использования в требуемый момент работы с набором свойств. Следует также написать код, реализующий выполнение необходимых действий при нажатии этой кнопки. Если не требуется предоставлять пользователю описанную возможность, то в общем случае нет необходимости удалять саму кнопку. Ее можно просто оставить недоступной для того, чтобы сохранить общность с другими приложениями Windows. Чтобы объявить об изменении параметров в странице свойств и сделать кнопку Apply доступной, следует вызвать функцию CPropertyPage::SetModified со значением ее единственного параметра, равным TRUE. Если какая-либо из страниц свойств содержит изменения, которые еще не применены к объекту, то, даже если текущая страница таких свойств не содержит, кнопка Apply все равно будет доступна. Это значит, что достаточно вызвать функцию SetModified хотя бы для одной из страниц. Функцию SetModified следует вызывать всякий раз, когда пользователь внес какие-либо изменения в параметры. Одним из способов обнаружения этого действия является обработка уведомляющих сообщений от элементов управления страницы свойств, таких, например, как EN_CHANGE или BN_CLICKED. При нажатии кнопки Apply набор свойств должен сообщить своему владельцу или какому-то другому внешнему объекту приложения о том, что необходимо модифицировать текущие параметры в наборе свойств. Одновременно кнопка становится недоступной, для чего нужно вызвать функцию SetModified со значением параметра, равным FALSE. Причем сделать это необходимо для каждой из страниц свойств, для которых функция SetModified вызывалась ранее со значением параметра, равным TRUE, иначе будет считаться, что операция по обновлению не была совершена. Обратите внимание, что только Windows хранит информацию о состоянии страницы. Так что при небольшом количестве страниц свойств можно смело вызвать функцию SetModified со значением параметра, равным FALSE, для всех страниц набора свойств, чтобы гарантировать результат. Обработчик команды Apply описывается следующим кодом:
Запретить отображение кнопки Apply очень просто:
Далее мы приводим очень краткий обзор классов CPropertySheet и СProperty Page, используемых для создания набора свойств, а также новых — CPropertySheetEx и CPropertyPageEx, реализующих некоторые дополнительные возможности.
Несомненный интерес представляют функции, которые предназначены для выполнения операций над набором свойств. Для добавления страниц в набор свойств служит функция, о которой уже не раз упоминалось выше:
Если функция вызывается после вывода набора свойств на экран, то в строку вкладок будет добавлена вкладка новой страницы. Чтобы удалить страницу из набора свойств, следует воспользоваться одним из вариантов следующей функции:
ИЛИ
В ходе работы с набором свойств может появиться необходимость определить какие-либо из его атрибутов или изменить их. Для этого в классе CPropertySheet реализованы следующие функции: GetActiveIndex, GetPage, GetPagelndex, GetPageCount, GetActive Page, SetActivePage, SetTitle. Следует отдельно отметить функцию, позволяющую получить доступ к вкладкам набора свойств:
Для завершения работы набора свойств служит функция:
Функция EndDialog вызывается библиотекой, когда окно набора свойств закрывается нажатием кнопок OK, Cancel или иным способом — нажатием клавиши <Esc> или нажатием кнопки закрытия окна в правой части заголовка, а также в случае, если будет нажата кнопка Close (Закрыть). Самим эту функцию можно вызывать в том случае, когда происходит событие, требующее закрытия набора свойств.
Изменение параметров отображения В заключение описания класса CPropertySheet приведем пример изменения стилей и параметров отображения набора свойств. На рис. 15.4 представлен набор свойств с установленными по умолчанию параметрами вывода. Для изменения некоторых флагов (параметров вывода) следует изменить конструктор класса, базирующегося на классе CPropertySheet. Если набор свойств был добавлен в качестве программного компонента, то такой класс будет создан в обязательном порядке. В противном случае аналогичные действия следует провести сразу же после создания объекта в набор свойств, перед вызовом функции CPropertySheet::DoModal или CPropertySheet::Create.
Рис. 15.4. Набор свойств со значениями параметров вывода, заданными по умолчанию Вот как можно, например, удалить кнопку Apply из окна набора свойств:
Как видите, для настройки набора свойств используется компонент класса m_psh:
PSH_DEFAULT
PSH_HASHELP
PSH_HEADER
PSH_MODELESS
PSH_NOAPPLYNOW
PSH_PROPSHEETPAGE
PSH_PROPTITLE
PSH_STRETCHWATERMARK
PSH_USECALLBACK
PSH_USEHBMHEADER
PSH_USEHBMWATERMARK
PSH_USEHICON
PSH_USEHPLWATERMARK
PSH_USEICONID
PSH_USEPAGELANG
PSH_USEPSTARTPAGE
PSH_WATERMARK
PSH_WIZARD
PSH_WIZARDCONTEXTHELP
PSH_WIZARDHASFINISH
PSH_RTLREADING
Примечание Все флаги, которые требуют наличия установленного флага PSH_ WIZARD97, не поддерживаются в классе CPropertySheet. Для работы с этим стилем в библиотеке реализован новый класс — CPropertySheetEx.
Для изменения способа отображения вкладок следует использовать функцию OnlnitDialog.
Как видите, в данном случае не обойтись без создания своего собственного класса. Однако есть более правильный способ (введенный в последней версии библиотеки MFC), при котором изменение стиля вывода вкладок осуществляется кодом библиотеки.
Эту функцию следует вызывать при создании набора свойств, но до вывода его на экран. BOOL CMyPropertySheet::OnlnitDialog()
Результат использования функции EnableStackedTabs приведен на рис. 15.5.
Рис. 15.5. Набор свойств после изменения некоторых значений параметров вывода В последней версии библиотеки MFC добавлен новый класс набора свойств CPropertySheetEx, который предоставляет поддержку для расширенной структуры PROPSHEETHEADER, введенной в Windows 98 и Windows NT Эта структура была описана раньше, и вы, конечно же, обратили внимание на дополнительные поля и соответствующие флаги для поддержки битового массива для отображения фона. Вторым классом, используемым для создания включаемых в набор свойств страниц, является класс СPropertyPage.
Настройка страниц набора свойств Выше мы говорили, что объекты класса CPropertyPage представляют собой отдельные страницы, входящие в набор свойств. Прежде всего должен быть создан сам объект CPropertySheet, а затем необходимо создать объекты класса С PropertyPage для каждой вставляемой в набор свойств страницы и добавить созданные страницы в набор свойств функцией СPropertySheet::AddPage Теперь можно вывести набор свойств на экран с помощью функций LPropertySheet::DoModal - для модального или CPropertySheet::Create - для немодального набора свойств. Как и в случае класса CPropertySheet, для знакомства с возможными параметрами страницы свойств сначала рассмотрим переменную, в которой хранятся основные параметры страницы:
Эту структуру можно использовать для изменения параметров страницы уже после ее создания, но до того, как она выведена на экран
Класс CPropertyPage имеет три версии конструктора:
И
В случае, если создается массив страниц свойств, вместо конструктора используется функция Construct.
Выше уже описывалась обработка нажатия кнопки Apply (Применить) в наборе свойств. Для этого предназначена следующая пара функций:
Кнопка Apply станет доступной, если вызвана функция SetModified со значением параметра, равным TRUE. При значении FALSE кнопка станет недоступна только в том случае, если все другие страницы набора свойств не содержат измененных и не модифицированных у объекта параметров.
Если страница выбрана пользователем и становится активной (получает фокус ввода), то библиотека вызывает функцию OnSetActive:
Данную функцию нужно переопределить, если требуется выполнить какие-либо операции во время активизации страницы. Если данная функция переопределяется, то сначала нужно вызвать из нее реализацию функции по умолчанию, а затем выполнять требуемые действия. Если текущая страница набора свойств становится неактивной, библиотека вызывает функцию:
После успешного завершения функции OnKillActive библиотека вызывает функцию:
При нажатии кнопок ОК или Apply вызывается функция:
При нажатии кнопки Cancel библиотека вызывает следующую группу функций:
Как я уже неоднократно упоминал, в библиотеку MFC добавлены несколько новых классов, в число которых входит и CPropertyPageEx, расширяющий возможности работы со страницами свойств. Этот новый класс библиотеки MFC предоставляет поддержку для расширенной структуры PROPSHEETPAGE, введенной в Windows 98 и Windows NT и содержащей дополнительные флаги и компоненты для работы с широкой областью заголовка, приспособленной для размещения как самого заголовка, так и подзаголовка.
Мастер (Wizard) представляет собой набор свойств с последовательным набором страниц, которые пользователь может переключать (перемещение при этом идет на одну страницу вперед или назад). Мастера широко применяются в программах, например, для установки нового оборудования или создания факсимильного сообщения. Набор свойств в режиме мастера не имеет вкладок в верхней части страниц, и на экран в текущий момент времени выводится только одна страница свойств. В отличие от обычного набора свойств, мастер не имеет кнопок ОК и Apply (Применить), а содержит кнопки Back (Назад), Next (Далее) (рис. 15.6) или Finish (Готово), Cancel (Отмена) и Help (Справка).
Рис. 15.6. Типичное окно мастера
Для создания мастера нужно следовать шагам создания обычного набора свойств, но прежде, чем вызывать функцию CPropertySheet::DoModal, следует вызвать функцию SetWizardMode:
Чтобы сделать доступными требуемые кнопки мастера, нужно вызвать функцию:
Чтобы сделать доступной кнопку Finish или скрыть кнопки Back и Next в тот момент, когда пользователь, работая с мастером, достигнет последней страницы, нужно вызвать функцию SetFinishText.
Класс CPropertyPage содержит следующие переопределяемые функции, используемые при создании мастера:
Если необходим переход более чем на одну страницу, то возвращается соответствующий идентификатор диалогового окна. Другим способом перехода к нужной странице является возможность задания в качестве текущей той, которая находится перед или после нужной, при помощи функции CPropertySheetr::SetActivePage.
Вот, собственно, и все, что я хотел рассказать о наборах свойств и мастерах. С примерами использования и работы с наборами свойств мы познакомимся в следующей главе, где предметом изучения станут элементы управления. Рубрика: MFC
Вышел MySQL 5.1.30, первый стабильный рели....
После публикации 29 тестовых версий анонсирован первый стабильный релиз MySQL 5.1, пригодный для промышленной эксплуатации и обеспечивающий увеличение производительности для "тяжелых" SQL запросов, по сравнению с MySQL 5.0, примерно на 15-20%. Главные новшества появившиеся в MySQL 5.1:
Подробнее... |
Рубрика: MySQL
| Добавлено: 28.11.2008
Тестирование параллельных программ.
Тестирование параллельного программного обеспечения представляет собой более сложную задачу по сравнению с тестированием последовательной программы. Программист должен знать о подводных камнях при тестировании параллельного кода, имеющихся методологиях и инструментарии.
Подробнее... |
Рубрика: Тестирование
| Добавлено: 28.11.2008
Архитектура AMD64 (EM64T).
Аннотация. В статье кратко рассматривается архитектура AMD64 компании AMD и ее реализация EM64T компании Intel. Описаны особенности архитектуры, ее возможности, достоинства и недостатки.
Подробнее... |
Рубрика: Архитектура AMD
| Добавлено: 27.11.2008
Остальные статьи: |
Цитата дня (все,добавить):
|
Realcoding.NET
© 2003-2008 |
Контакты |
Реклама на сайте
|