
- •1. Признаки сложных систем. Сложность, присущая программному обеспечению.
- •2. Компоненты объектно-ориентированного подхода.
- •3. Объекты и классы с точки зрения объектно-ориентированного проектирования.
- •4. Модели и диаграммы, используемые в объектно-ориентированном подходе.
- •5. Техника отладки.
- •6. Работа с многофайловыми проектами. Использование включаемых файлов.
- •9. Простое наследование. Контроль доступа к атрибутам класса.
- •10. Виртуальные функции (вф) и абстрактные классы.
- •11. Множественное и виртуальное наследование.Множественное наследование
- •12 Перегрузка операций
- •13. Шаблоны функций, макросы, inline-функции.
- •14. Шаблоны классов.
- •15. Обработка исключительных ситуаций, структурная обработка исключений.
- •16. Пространства имён. Кратко о механизме пространства имен
- •Зачем нужен механизм пространства имен?
- •Имитация средствами языка Си
- •Правило составления имени
- •Недостатки
- •17 Строки и потоки.
- •18.Стандартная библиотека: Контейнеры
- •19 Реализация устойчивости объектов средствами mfc.
- •20. Структура Windows-приложения WinApi
- •21. Структура Windows-приложения, использующего библиотеку mfc
- •Документы и их представление
- •22. Обработка сообщений
- •23. Контекст устройства
- •24.Объекты gdi
- •25.Использование контекста отображения в памяти.
- •26.Режимы отображения.
- •27.Работа с меню. Обработка сообщений.
- •28.Работа с диалогами. Обработка сообщений.
- •29. Работа с полями ввода и кнопками.
- •30. Работа со списками и выпадающими списками. Работа со списком
- •Работа с комбинированном списком
- •Инициализация
- •Операции со строками
- •31. Классы CimageList и CtreeCtrl. Класс cImageList
- •Изменение содержимого списка
- •32. Классы CimageList и ClistCtrl. Класс cImageList
- •Изменение содержимого списка
- •Создание просмотра списка
- •Работа со столбцами
- •Функции для работы со списком в целом
- •Рабочие области просмотра списка
- •Поиск и сортировка записей
- •33. Классы CprogressCtrl, cRichEdit Ctrl, CsliderCtrl, cSpinButton Ctrl.
- •34. Классы cPropertySheet и cPropertyPage.
- •35. Передача информации в диалог и обратно.
- •36. Работа со стандартными диалогами.
- •37.Обработка сообщений от клавиатуры и мыши(wm_char,wm_keYxxx,wm_xButtoNxxx,
- •38 Таймеры, использование времени простоя программы и локального цикла обработки сообщений.
- •39. Библиотеки динамической компоновки. Явная и неявная загрузка dll.
- •Согласование экспортируемых элементов с импортируемыми
34. Классы cPropertySheet и cPropertyPage.
Набор свойств представляет собой особый вид диалогового окна, применяемый для модификации свойств как самого приложения, так и каких-то внешних объектов. Набор свойств содержит три основные части:
Блок диалога, внутри кот размещаются все остальные элементы набора свойств.
Одна или несколько страниц свойств.
Вкладки, расположенные вверху каждой страницы.
Использовать набор свойств удобно в тех случаях, когда имеются группы некоторых параметров, кот можно изменять. Он позволяет собрать большое количество информации в небольшие группы, выводимые на экран поочерёдно, что значительно упрощает работу.
Создание набора свойств.
Библиотека 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 (Справка).