Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
41
Добавлен:
16.02.2016
Размер:
26.09 Mб
Скачать

5 Приложения-диалоги и элементы управления

В этой главе будет рассмотрено, как создавать и использовать диалоговые окна.

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

Для того чтобы использовать диалоговое окно, необходимо:

• создать шаблон диалогового окна в редакторе ресурсов диалога;

• создать класс, производный от CDialog, и связать его с созданным шаблоном диалогового окна;

• запрограммировать обработчик сообщений, открывающий диалоговое окно, или непосредственно выполнить соответствующий метод.

Редактор ресурсов диалога

Для того чтобы запустить редактор ресурсов диалога, можно:

• выполнить двойной щелчок мышью на любом шаблоне диалогового окна на вкладке ресурсов в окне проекта;

• создать новый шаблон диалогового окна, выполнив пункт меню Insert|Resource... (рис. 5.1).

При вызове редактора ресурсов диалогового окна Visual C++ отображает шаблон разрабатываемого диалогового окна в окне ресурсов. Добавление элементов в окно ресурсов выполняется с помощью панели инструментов Dialog, настройка элементов управления выполняется через окно свойств Property (отдельное для каждого элемента управления) и панель инструментов WizardBar. На рис. 5.2 отображено окно ресурсов MyDlg.rc -IDD_MYDLG_DIALOG, а также панели инструментов Dialig и WizardBar.

Рис. 5.1. Окно добавления ресурсов

Рис. 5.2. Окно редактора ресурсов

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

Рис. 5.3. Вкладка General окна свойств для шаблона диалога

Рис. 5.4. Вкладка Styles окна свойств для шаблона диалога

Вкладка Style позволяет определять один из следующих стилей окна (из списка Style):

• Overlapped - окно верхнего уровня, имеющее заголовок и рамку окна;

• Popup (по умолчанию) - рорuр-окно;

• Child - дочернее окно.

Рамка окна определяется одним из следующих значений (из списка Border): None; Thin; Resizing; Dialog Frame (по умолчанию).

Элементы управления

В шаблон диалога можно встроить любой элемент управления, расположенный на панели инструментов Controls (рис. 5.5).

Рис. 5.5. Панель элементов управления

Панель элементов управления Controls содержит кнопки для следующих элементов управления (слева направо):

Каждый элемент управления имеет свой набор атрибутов, называемых также свойствами элемента управления.

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

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

Поведение элемента управления определяется его методами.

Напомним, что, так как все элементы управления реализуются классами, производными от CWnd, они являются оконными объектами. И как для всех оконных объектов, процесс создания включает в себя два этапа:

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

• связывание его с объектом или переменной.

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

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

Использование элементов управления

Различные элементы управления, встраиваемые в диалоговые окна, можно подразделить на общие и OCX (или ActiveX, OLE) элементы управления. Библиотека MFC поддерживает как те, так и другие элементы управления, инкапсулируя их свойства и поведение в соответствующих классах. Элементы управления могут быть встроены в различные окна, создаваемые на основе шаблонов диалога. Для этого следует:

1. Создать в редакторе ресурсов диалога шаблон диалога (и определить его ID).

2. Разместить в этом шаблоне диалога элементы управления.

3. В класс, производный от CDialog и предназначенный для работы с данным шаблоном диалога, добавить:

• переменную (объект) для каждого элемента управления и соответственно связанную с ним (например, посредством DDX-методов),

• переопределить методы - обработчики сообщений в классе диалогового окна (см. далее в этой главе раздел "Обработчики сообщений для элементов управления").

4. Переопределить метод OnlnitDialog, добавив в него требуемую инициализацию элементов управления.

Рассмотрим более подробно использование каждого элемента управления.

Окно редактирования (Edit Box)

Окно редактирования представляет собой однострочное или многострочное поле ввода. Инициализация элемента управления Edit Box выполняется программным путем. В зависимости от того, каким образом установлена связь между элементом управления и приложением, существуют различные способы использования этого элемента управления. Если элемент управления связан с объектом класса CEdit, то для работы с ним можно применять все методы этого класса.

На рис. 5.6 и 5.7 представлены вкладки окна Edit Properties, позволяющие настраивать свойства элемента управления окно редактирования на этапе проектирования.

Рис. 5.6. Вкладка General окна свойств Edit Properties

Рис. 5.7. Вкладка Styles окна свойств Edit Properties

Для создания многострочного окна редактирования следует включить переключатель Multiline. Для установки разбиения на строки с использованием мягкого конца строки следует установить свойство Auto HScroll. При мягком конце строки, в отличие от жесткого конца строки, окно редактирования отображает разделение на строки, не вставляя непосредственно в сам текст символов конца строки и перевода каретки.

Для того чтобы разрешить вставку в окне редактирования новых строк, следует включить переключатель Want return.

При двойном щелчке мыши на элементе управления окно редактирования Visual C++ открывает окно, отображающее список событий (рис. 5.8), которые можно использовать для данного элемента управления.

Рис. 5.8. Окно, содержащее список событий

На левой панели этого окна расположен список всех доступных событий для элемента, выделенного на панели Class or object to handle.

Для того чтобы автоматически добавить в программу определение метода для обработки выделенного события, следует щелкнуть на командной кнопке Add Handler. При щелчке на командной кнопке Add and Edit происходит автоматическое добавление определения метода для обработки события и переход в окно редактирования программного кода этого метода.

Статический текст (Static Box)

Статический текст, иногда также называемый меткой, предназначается для отображения различных надписей. Пользователь не может непосредственно редактировать этот элемент управления. Содержание элемента управления Static Box определяется на этапе проектирования свойством Caption (рис. 5.9) и в дальнейшем может изменяться только программным путем.

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

Выполнить связывание элемента управления статический текст с переменной типа CString или объектом класса CStatic можно, вызвав ClassWizard.

Рис. 5.9. Вкладка General окна свойств Text Properties

На рис. 5.10 и 5.11 представлены вкладки окна Text Properties, позволяющие настраивать свойства элемента управления статический текст на этапе проектирования.

Рис. 5.10. Вкладка Styles окна свойств Text Properties

Раскрывающийся список Align text позволяет указать выравнивание текста в элементе управления: Left (по умолчанию), Center, Right.

Переключатель Center Vertically определяет выравнивание текста по вертикали: по умолчанию свойство имеет значение FALSE.

Если переключатель No prefix включен, то символ & отображается; в противном случае он предшествует подчеркиваемому символу (указывающему клавишу-акселератор).

Если переключатель Notify включен, то при щелчке или двойном щелчке мыши на данном элементе управления родительскому окну будет послано сообщение. Значение этого свойства по умолчанию равно False.

Переключатель Sunken позволяет отображать вокруг элемента управления вдавленную рамку. Значение этого свойства по умолчанию равно False.

Переключатель Border создает вокруг элемента управления рамку.

Рис. 5.11. Вкладка Extended Styles окна свойств Text Properties

Переключатель Transparent определяет, является ли фон элемента прозрачным.

Переключатель No parent notify определяет, будет ли дочерним окном посылаться сообщение WM_PARENTNOTIFY своему родительскому окну.

Рисунок (Picture)

Элемент управления рисунок позволяет отобразить в диалоговом окне закрашенный прямоугольник, пиктограмму или изображение (bitmap).

Этот элемент управления может быть связан с объектом класса CStatic.

На рис. 5.12 представлена вкладка окна Picture Properties, позволяющая настраивать свойства элемента управления рисунок на этапе проектирования.

Рис. 5.12. Вкладка General окна свойств Picture Properties

Переключатель Group - первый элемент управления группы элементов, внутри которой пользователь может переходить от одного элемента к другому при помощи клавиш-стрелок.

Раскрывающийся список Туре позволяет определить тип отображаемого статического графического элемента: • Frame (по умолчанию) - прямоугольная рамка. Цвет рамки определяется

из раскрывающегося списка Color;

• Rectangle - закрашенная прямоугольная область. Цвет прямоугольника определяется из раскрывающегося списка Color;

• Icon - пиктограмма;

• Bitmap - изображение;

• Enhanced Metafile - метафайл.

Раскрывающийся список Image позволяет выбрать идентификатор отображаемой пиктограммы или изображения.

Кнопка (Button)

Элемент управления кнопка, называемый также командная кнопка, как правило, используется для вызова сообщения BN_CLICKED.

На рис. 5.13 и 5.14 представлены вкладки окна Properties, позволяющие настраивать свойства элемента управления командная кнопка на этапе проектирования.

Переключатель Default button позволяет указать командную кнопку, устанавливаемую как кнопка по умолчанию. Эта кнопка при первоначальном отображении окна имеет внутри темную пунктирную рамку и нажатие пользователем клавиши Enter интерпретируется как щелчок по данной кнопке.

Рис. 5.13. Вкладка General окна свойств Push button Properties

Рис. 5.14. Вкладка Styles окна свойств Push button Properties

Переключатель Owner draw используется для создания кнопок с настраиваемым появлением (использующих переопределяемый разработчиком метод OnDrawItem класса CWnd). Отметим, что также можно создать производный класс от CButton и переопределить методы CButton::Drawltem и CButton::OnDraw.

Переключатель Icon позволяет указать, что вместо текста будет отображена пиктограмма (стиль BS_ICON). При создании кнопки стиля BS_ICON ей посылается сообщение BM_SETIMAGE со следующими значениями параметров: wParam равен IMAGE_ICON, lParam определяет отображаемую для кнопки пиктограмму.

Переключатель Bitmap позволяет указать, что вместо текста будет отображено изображение (стиль BS_BITMAP). При создании кнопки стиля BS_BITMAP ей посылается сообщение BM_SETIMAGE со следующими значениями параметров: wParam равен IMAGE_BITMAP, lParam определяет отображаемое изображение.

Переключатель Multi-line используется в том случае, если текст слишком длинный, чтобы уместиться на кнопке в одну строку.

Если переключатель Notify включен, то при щелчке или двойном щелчке мыши на кнопке родительское окно будет получать уведомление.

Переключатель (Check Box)

Переключатель, иногда называемый флажком, может иметь два или три состояния: включенное, выключенное или неопределенное (не обязательно).

Переключатель можно связать как с переменной типа BOOL, так и с объектом класса CButton.

На рис. 5.15 и 5.16 представлены вкладки окна Check Box Properties, позволяющие настраивать свойства элемента управления переключатель на этапе проектирования.

Рис. 5.15. Вкладка General окна свойств Check Box Properties

Рис. 5.16. Вкладка Styles окна свойств Check Box Properties

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

Переключатель Tri-state используется для создания элемента управления переключатель, имеющего три состояния. Одновременно с состояниями включен или выключен используется состояние не определен, в котором переключатель выглядит "посеревшим".

Если включен переключатель Push-like, то создается элемент управления переключатель, отображаемый как командная кнопка: при нажатии переключатель имеет вид вдавленной кнопки, а при ненажатом состоянии -выпуклой кнопки.

Переключатель Flat создает плоскую кнопку.

Радиокнопка (Radio Button)

Элемент управления радиокнопка аналогичен переключателю, но не может иметь неопределенного состояния. Также при объединении нескольких радиокнопок в группу только одна из них может иметь включенное состояние.

Радиокнопку можно связать как с переменной типа BOOL, так и с объектом класса CButton.

На рис. 5.17 и 5.18 представлены вкладки окна Radio Button Properties, позволяющие настраивать свойства элемента управления радиокнопка на этапе проектирования.

Рис. 5.17. Вкладка General окна свойств Radio Button Properties

Рис. 5.18. Вкладка Styles окна свойств Radio Button Properties

Рамка группы кнопок (Group Box)

Рамка группы кнопок, как правило, используется для объединения в группу нескольких переключателей или радиокнопок. Причем в первом случае состояния переключателей, объединенных в группу, не зависят друг от друга. Состояния радиокнопок, объединенных в группу, взаимозависимы: только одна радиокнопка может иметь включенное состояние. Отметим, что при объединении радиокнопок в группу у первой следует включить переключатель Group в окне свойств Group Box Properties.

На рис. 5.19 представлена вкладка окна Properties, позволяющая настраивать свойства элемента управления рамка группы кнопок на этапе проектирования.

Рис. 5.19. Вкладка General окна свойств Group Box Properties

Окно списка (List Box)

Элемент управления окно списка используется для работы со списком. Окно списка может быть реализовано как список с единичным или с множественным выбором. Формирование элементов списка, их добавление и удаление может быть выполнено только программным путем.

Окно списка можно связать как с переменной типа CString, так и с объектом класса CListBox.

На рис. 5.20 и 5.21 представлены вкладки окна list Box Properties, позволяющие настраивать свойства элемента управления окно списка на этапе проектирования.

Рис. 5.20. Вкладка General окна свойств List Box Properties

Рис. 5.21. Вкладка Styles окна свойств List Box Properties

Свойство Selection позволяет устанавливать тип списка:

• Single (по умолчанию) - пользователь может выделить только один элемент списка;

• Multiple - пользователь может одновременно выделить несколько элементов списка. Выделение элементов (или снятие выделения) осуществляется при щелчке или двойном щелчке мыши. Одновременно для изменения выделения могут быть использованы клавиши Shift и Ctrl;

• Extended - пользователь может одновременно выделить несколько элементов списка. Выделение элементов (или снятие выделения) осуществляется перемещением мыши при нажатой кнопке. Одновременно с мышью для изменения выделения могут быть использованы клавиши Shift и Ctrl;

• None - пользователь не может выделить ни одного элемента списка. Свойство Owner draw устанавливает стиль, позволяющий определить,

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

• No (по умолчанию) - отключает стиль самоотображения (owner-draw). Элементы списка являются строками;

• Fixed - определяет, что за перерисовку содержания окна списка отвечает владелец окна списка и элементы окна списка имеют одинаковую высоту. При создании окна списка вызывается метод CWnd::OnMeasureItem, а при изменении - метод CWnd::OnDrawItem;

• Variable - определяет, что за перерисовку содержания окна списка отвечает владелец окна списка и элементы окна списка имеют различную высоту. При создании окна списка для каждого элемента вызывается метод CWnd::OnMeasureItem. При изменении окна списка вызывается метод CWnd::OnDrawItem.

Переключатель Has strings позволяет указать, что список стиля owner-draw содержит элементы, состоящие из строк. Для получения текста, содержащегося в элементе такого списка, можно использовать сообщение LB_GETTEXT.

Переключатель Multi-column используется для создания многоколонных списков. Ширина столбца списка задается при обработке сообщения LB_SETCOLUMNWIDTH.

No redraw определяет, что окно списка не будет отображать сделанных изменений. Для изменения этого свойства следует вызвать метод CWnd::SetRedraw или послать сообщение WM_SETREDRAW.

Если переключатель Want key input включен, то владелец окна списка, находящегося в фокусе, при нажатии пользователем любой клавиши получает сообщения WM_VKEYTOITEM (для стиля Has Strings) или WM_CHARTOITEM. Это позволяет приложению обрабатывать для окна) списка ввод пользователя с клавиатуры.

No integral height устанавливает, что Windows не будет изменять указанный размер окна списка таким образом, чтобы не показывать элемент списка, не умещающийся полностью.

Список (List Control)

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

Элемент управления список можно связать с объектом класса ClistCtrl.

На рис. 5.22 представлена вкладка окна list Control Properties, позволяющая настраивать свойства элемента управления список на этапе проектирования.

Рис. 5.22. Вкладка Styles окна свойств List Control Properties

Комбинированный список (Combo Box)

Элемент управления комбинированный список, называемый также комбинированным окном списка, состоит из поля ввода и окна списка. Элементы комбинированного списка можно задавать на этапе проектирования. В зависимости от стиля элементы комбинированного списка можно или нельзя редактировать.

На рис. 5.23 представлена вкладка окна Combo Box Properties, позволяющая настраивать свойства элемента управления комбинированный список на этапе проектирования.

Рис. 5.23. Вкладка General окна свойств Combo Box Properties

Комбинированный список может иметь три различных стиля, определяемых свойством Туре:

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

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

• Drop List - комбинированный список отображается в свернутом состоянии со стрелкой справа, позволяющей распахнуть окно списка; содержание поля ввода нельзя редактировать.

Элемент прокрутки (Spin)

Элемент прокрутки, как правило, используется совместно с окном редактирования и предназначается для пошагового увеличения или уменьшения значения. Этот элемент управления можно связать с объектом класса CSpinButtonCtrl.

На рис. 5.24 представлена вкладка окна Spin Properties, позволяющая настраивать свойства элемента управления элемент прокрутки на этапе проектирования.

Рис. 5.24. Вкладка Styles окна свойств Spin Properties

Древовидная структура (Tree)

Элемент управления древовидная структура, иногда также называемый деревом, реализует работу с данными, представляемыми в виде древовидной иерархической структуры. "Ветви" дерева можно сворачивать или разворачивать при щелчке на кнопках + и -.

Создание и изменение древовидной структуры выполняется программным путем. Этот элемент управления можно связать с объектом классу CTreeCtrl и затем использовать для него все методы этого класса.

На рис. 5.25 представлена вкладка окна Tree Control Properties, позволяющая настраивать свойства элемента управления древовидная структура на этапе проектирования.

Рис. 5.25. Вкладка Styles окна свойств Tree Control Properties

Вкладка (Tab)

Элемент управления вкладка (рис. 5.26) позволяет создать диалоговую форму со вкладками. Каждая вкладка представляет собой отображение самостоятельного диалога в рамках одного диалогового окна.

Рис. 5.26. Элемент управления вкладка (Tab)

Элемент управления вкладка может быть связан с объектом класса CTabCtrl.

На рис. 5.27 представлена вкладка окна Tab Control Properties, позволяющая настраивать свойства элемента управления вкладка на этапе проектирования.

Рис. 5.27. Вкладка Styles окна свойств Tab Control Properties

Раскрывающийся список Focus позволяет установить одно из следующих значений:

• Default - для перемещения фокуса по вкладкам можно использовать ввод с клавиатуры;

• On Button Down - вкладка получает фокус при щелчке на заголовке вкладки;

• Never - вкладка не может получить фокус при щелчке на заголовке вкладки.

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

Переключатель Tool tips устанавливает режим, при котором для каждого заголовка вкладки создается всплывающая подсказка (tip).

Переключатель Multiline устанавливает режим многострочного отображения заголовков вкладок.

Переключатель Owner draw fixed определяет, будут ли вкладки в элементе управления отображаться родительским окном (значение по умолчанию - FALSE).

Шкала индикации (Progress)

Элемент управления шкала индикации используется для наглядного отображения изменяемой характеристики: по мере увеличения характеристики (завершения процесса) шкала индикации постепенно закрашивается слева направо. На рис. 5.28 представлено отображение элемента управления шкала индикации.

Рис. 5.28. Элемент управления шкала индикации (Progress)

Для работы с этим элементом управления используются методы класса CProgressCtrl.

Маркер (Slider)

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

Рис. 5.29. Элемент управления маркер (Slider)

Для работы с этим элементом управления используются методы класса CSliderCtrl.

Для использования маркера следует вызвать методы, выполняющие его инициализацию (SetRange и SetPos класса CSliderCtrl), и запрограммировать метод обработки сообщения WM_HSCROLL. Как правило, обработка сообщения состоит в определении новой позиции маркера (метод GetPos) и отображении ее в другом элементе управления (например, в окне редактирования или статическом тексте).

Для определения метода обработки сообщения можно:

• вызвать ClassWizard и использовать вкладку MessageMaps;

• выполнить пункт Events контекстного меню элемента управления;

• использовать панель инструментария WizardBar.

Доступ к элементам управления

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

Приведем четыре способа доступа к элементам управления:

• элемент управления связывается с некоторой переменной;

• элемент управления связывается с объектом соответствующего класса и для работы с ним используются методы этого класса;

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

• объявляется переменная, инициируемая указателем на элемент управления. Указатель на элемент управления можно получить вызовом метода

CWnd::GetDlgItem с указанием в качестве параметра идентификатора элемента управления. Пример:

// инициализация указателем CSpinCtrl* pMySpin = (CSpinCtrl*) GetDlgItem(ID_MySpin); // Конструкция pMySpin-> Metod() позволяет вызывать любые методы класса // доступ по идентификатору SetDlgItemText(ID_MyStatic, strl);

Связывание элементов управления с переменными класса

Для связывания элемента управления с переменной или объектом соответствующего класса можно использовать вкладку MemberVariables (рис. 5.30) в ClassWizard.

Рис. 5.30. Вкладка MemberVariables

Для создания новой переменной, с которой будет устанавливаться связь, следует из раскрывающегося списка Class Name выбрать имя класса и щелкнуть на командной кнопке Add Variable. Visual C++ отобразит диалоговое окно Add Member Variable (рис. 5.31), в котором необходимо указать имя создаваемой переменной и выбрать категорию Value или Control. Для категории Value дополнительно следует выбрать тип переменной связи.

Рис. 5.31. Диалоговое окно для создания переменной

Категория определяет способ использования создаваемой переменной:

• если выбрана категория Control, то связь будет осуществляться с объектом соответствующего класса;

• для категории Value устанавливается связь с переменной и обмен данными выполняется DDX-методами, автоматически добавляемыми в переопределяемый метод DoDataExchange. Метод DoDataExchange вызывается методом UpdateData, указывающим в качестве параметра направление обмена данными: из переменной в элемент управления или наоборот.

Для получения доступа к элементу управления следует: • создать переменную, в которую или из которой можно заносить значение элемента управления; • переопределить метод DoDataExchange, описав в нем вызов методов DDX (и возможно, DDV), связующих переменную приложения с элементом управления (ClassWizard автоматически добавляет в переопределяемый метод DoDataExchange вызов DDX и DDV методов).

Обработчики сообщений для элементов управления

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

Рис. 5.32. Диалоговое окно со списком сообщений

Для переопределения метода, обрабатывающего какое-либо из событий, указанных на панели New Windows messages/events, следует нажать командную кнопку Add Hander (добавляет описание метода) или Add and Edit (добавляет описание метода и переходит в окно кода программы). Например, при добавлении метода обработки события EN_CHANGE ClassWizard автоматически откроет окно программного кода - файл MyDlgDlg.cpp и создаст в нем следующее определение метода:

void CMyDlgDlg::OnChangeEdit3()

{ // TODO: If this is a RICHEDIT control, the control will not // send this notification unless you override the CDialog::OnInitDialog()

// function to send the EM_SETEVENTMASK message to the control // with the ENMCHANGE flag ORed into the lParam mask.

// TODO: Место для добавления кода обработки события

Для того чтобы родительское окно, содержащее элемент управления, обрабатывало поступающие от элемента управления сообщения, следует в таблицу сообщений родительского окна для каждого обрабатываемого сообщения добавить метод, имеющий следующую форму: ON_Message (id, memberFxn).

Параметр id является идентификатором дочернего окна (элемента управления), a memberFxn определяет метод класса родительского окна, выполняющий обработку сообщения; Message является идентификатором обрабатываемого сообщения.

Методы, обрабатывающие сообщения, имеют следующий синтаксис: afx_msg void memberFxn ();

Также элементами управления инициируются сообщения WM_COMMAND и WM_NOTIFY. Для обработки всех таких сообщений в классе диалогового окна следует переопределить соответственно виртуальные методы CWnd::OnCommand или CWnd::OnNotify. Библиотека MFC содержит макрос ON_CONTROL, позволяющий непосредственно указать тип сообщения, элемент управления и метод - обработчик.

Для обработки сообщения следует переопределить метод - обработчик сообщения. Для этого необходимо: • указать вызов метода - обработчика сообщения в таблице сообщений;

• в соответствующем файле исходного кода описать переопределяемый метод.

Эти действия могут быть выполнены автоматически, если для переопределения метода, обрабатывающего какое-либо из сообщений, вызвать диалоговое окно New Windows messages and Event Handers и выбрать на панели New Windows messages/events название сообщения, а затем нажать командную кнопку Add Hander (для добавления описания метода) или Add and Edit (для добавления описания метода и перехода в окно кода программы.

Создание и применение диалоговых окон

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

При создании шаблона диалога ему присваивается идентификатор ресурса (идентификатор диалогового окна). Шаблон диалога определяет используемые элементы управления, их свойства и расположение. Поведение диалогового окна определяется в классе окна диалога (производном от CDialog).

Любое диалоговое окно конструируется на основе класса, производного от CDialog. Этот класс создается с помощью ClassWizard. Связь создаваемого класса и шаблона диалога определяется указанием используемого идентификатора ресурса (рис. 5.33).

Рис. 5.33. Создание нового класса, производного от CDialog

При создании нового класса ClassWizard автоматически создает два файла: заголовочный файл (с расширением .Н) и файл кода (с расширением .СРР).

Созданный шаблон класса содержит (в нашем примере это шаблон класса CMyDlgDlg): • конструктор класса:

// CMyDlgDlg dialog

CMyDlgDlg::CMyDlgDlg(CWnd* pParent /*=NULL*/) : CDialog(CMyDlgDlg::IDD, pParent)

//{{AFX_DATA_INIT(CMyDlgDlg)

m_el = _T("");

//}}AFX_DATA_INIT

m_hlcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

• переопределяемый метод DoDataExchange:

void CMyDlgDlg::DoDataExchange(CDataExchange* pDX)

CDialog:: DoDataExchange(pDX); //{{AFX_DATA_MAP(CMyDlgDlg)

DDX_Text(pDX, IDC_EDIT3, m_el); - - // Связь с переменной m_el //}}AFX_DATA_MAP }

• раздел для переменных класса;

• таблицу обрабатываемых сообщений:

BEGIN_MESSAGE_MAP(CMyDlgDlg, CDialog)

//{{AFX_MSG_MAP(CMyDlgDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_EN_CHANGE(IDC_EDIT1, OnChangeEditl)

ON_EN_CHANGE(IDC_EDIT3,OnChangeEdit3)

//}}AFX_MSG_MAP END_MESSAGE_MAP();

• раздел для методов - обработчиков сообщений:

// CMyDlgDlg message handlers (методы обработки сообщений)

BOOL CMyDlgDlg::OnInitDialog()

{

CDialog: :OnInitDialog();

// TODO: Место для добавления кода инициализации

void CMyDlgDlg::OnPaint()

{

CDialog: :OnPaint(); }

void CMyDlgDlg::OnChangeEditl() // Обработка сообщения от { } // элемента управления editl

void CMyDlgDlg: :OnChangeEdit3() {}

Определение метода DoDataExchange автоматически дополняется ClassWizard соответствующими DDX и DDV методами для каждого элемента управления, связываемого с переменной класса. Эти методы осуществляют обмен данными между переменными приложения и элементами управления диалогового окна, а также обеспечивают достоверность передаваемых данных.

Visual C++ позволяет создавать диалоговые окна двух типов:

• модальное диалоговое окно;

• обычное (немодальное) диалоговое окно.

Для вызова модального диалогового окна используется конструктор с параметром, указывающим идентификатор ресурса диалога и метод DoModal, а для обычного диалогового окна - конструктор без параметров и метод Create с параметром, указывающим идентификатор ресурса диалога.

Для завершения модального диалога достаточно вызвать метод EndDialog, а для разрушения обычного диалогового окна вызывается метод DestroyWindow. Отметим, однако, что эти методы разрушают диалоговое окно, пристыкованное к соответствующему оконному объекту, но не разрушают сам оконный объект.

Классы диалоговых окон библиотеки MFC

CDialog

Класс CDialog является базовым классом, используемым для отображения на экране диалоговых окон, называемых также диалогами. Есть два типа диалоговых окон:

• модальное - должно быть закрыто пользователем до продолжения выполнения приложения;

• немодальное - разрешается одновременная работа в других окнах.

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

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

В производном классе также, как правило, создаются переменные-члены класса, связываемые с элементами управления. Такие переменные используются для сохранения значений, вводимых в элементы управления пользователем, и изменения этих значений. Условно можно сказать, что элемент управления - это некоторое Windows-окно, а переменная - это объект, связываемый с данным окном. ClassWizard позволяет создавать в соответствии с используемым элементом управления различные типы связующих переменных (объектов) и определять для них диапазон допустимых значений.

Для создания диалоговых окон можно использовать методы DoModal (для модального диалога) и Create (для немодального диалога).

Также можно создать шаблон диалога, используя структуру DLGTEMPLATE, а затем после создания объекта диалога вызвать методы Createlndirect или InitModallndirect и DoModal.

Модальное диалоговое окно автоматически закрывается при щелчке пользователя на кнопках ОК или Cancel или когда вызван метод EndDialog.

Для обмена значениями с элементом управления используется метод CWnd::UpdateData. Этот метод вызывается и при щелчке пользователя на кнопке ОК (если применяется непереопределенный обработчик сообщений) и при инициализации элементов управления методом OnlnitDialog.

Метод OnlnitDialog вызывается после создания всех элементов управления диалогового окна, но перед их отображением.

Для определения фона диалоговых окон используется метод CWinApp::SetDialogBkColor.

Отметим, что при работе с немодальными диалоговыми окнами следует использовать вызов функции DestroyWindow для удаления окна. Вызов метода CDiaIog::OnCancel влечет вызов EndDialog и только скрывает окно, не удаляя его.

Для создания диалогового окна следует: • разработать в редакторе диалога шаблон диалогового окна, включить в него все требуемые элементы управления, настроить их свойства;

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

Для модального диалога

Для немодального диалога

вызов конструктора с параметром, указывающим ID

вызов конструктора без параметра шаблона диалога

вызов метода DoModal

вызов метода Create с параметром, указывающим ID шаблона диалога

• переопределить метод OnlnitDialog, включив в него вызов метода базового класса и необходимые действия по инициализации диалогового окна

Члены класса

CDialog (LPCTSTR ipszTemplateName, CWnd* pParentWnd = NULL);

CDialog (UINT nIDTemplate, CWnd* pParentWnd = NULL);

CDialog ();

Конструкторы класса CDialog.

Параметры:

IpszTemplateName - строка, содержащая имя ресурса шаблона диалога. nIDTemplate - значение ID ресурса шаблона диалога. По умолчанию редактор ресурсов присваивает шаблонам диалога идентификаторы, начинающиеся с префикса IDD_.

pParentWnd - указатель на родительское окно или окно собственник (типа CWnd), которому принадлежит этот диалог. Значение NULL указывает, что родительским окном является главное окно приложения.

Конструктор без параметров применяется для создания модального окна диалога на основе шаблона, расположенного в памяти. При этом используется метод InitModallndirect.

Для создания модального диалога после вызова конструктора следует вызвать метод DoModal.

Создание немодального диалога выполняется за два шага: сначала вызывается конструктор, а затем метод Create (или Createlndirect). BOOL Create (LPCTSTR IpszTemplateName, CWnd* pParentWnd = NULL); BOOL Create (UINT nIDTemplate, CWnd* pParentWnd = NULL);

При успешном завершении создания диалогового окна и инициализации эти методы возвращают ненулевое значение.

Для того чтобы создаваемое диалоговое окно появилось при создании родительского окна, следует в шаблоне диалога указать стиль WS_VISIBLE. В противном случае для отображения окна надо будет вызывать метод ShowWindow.

Для разрушения диалогового окна, созданного методом Create, следует вызывать метод CWnd::DestroyWindow.

virtual int DoModal ();

Метод используется для создания модального диалогового окна.

При щелчке пользователя на командных кнопках ОК или Cancel вызываются методы - обработчики сообщений ОпОК или OnCancel соответственно. По умолчанию метод ОпОК будет проверять правильность введенных данных, обновлять переменные приложения, связанные с имеющимися элементами управления, и закрывать диалоговое окно, возвращая значение IDOK. Метод OnCancel по умолчанию будет закрывать диалоговое окно, возвращая значение IDCANCEL. Эти методы могут быть переопределены для добавления каких-либо других действий.

void MapDialogRect (LPRECT lpRect) const;

Метод позволяет преобразовать размер окна в экранные единицы измерения (пиксели), результат заносится в структуру, указываемую параметром IpRect. Получаемая структура описывает прямоугольник окна в пикселях, и это может быть использовано как для создания диалогового окна, так и для размещения в нем различных элементов управления. void NextDIgCtrl () const;

Метод перемещает фокус на следующий элемент управления диалогового окна (а с последнего элемента управления - на первый). void PrevDlgCtrl () const;

Метод перемещает фокус на предыдущий элемент управления диалогового окна (а с первого элемента управления - на последний). void GotoDIgCtrl (CWnd* pWndCtrl);

Метод перемещает фокус на указываемый параметром pWndCtrl элемент управления.

Для того чтобы получить значение параметра pWndCtrl, можно вызвать метод CWnd::GetDlgItem.

void SetDeflD (UINT nlD);

Метод изменяет командную кнопку, используемую по умолчанию. Параметры:

nID - ID командной кнопки, которая будет использоваться по умолчанию, когда пользователь нажмет клавишу Enter.

DWORD GetDefID () const;

Метод возвращает 32-разрядное значение (DWORD). В том случае если определен ID кнопки по умолчанию, то старшее слово содержит значение DC_HASDEFID, а младшее - ID командной кнопки. В противном случае возвращается нулевое значение.

Как правило, командной кнопкой по умолчанию является кнопка ОК.

void SetHelpID (UINT nlDR);

Метод определяет контекстно зависимый идентификатор ID справки для диалогового окна.

void EndDialog (int nResult);

Метод используется для закрытия модального диалогового окна.

virtual BOOL OnlnitDialog ();

Этот метод вызывается для обработки сообщения WM_INITDIALOG, которое инициируется при выполнении методов Create, Createlndirect или DoModal.

При переопределении этого метода первоначально следует вызвать метод OnlnitDialog базового класса, а затем добавить описание дополнительных действий и при успешном завершении вернуть значение TRUE.

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

virtual void OnSetFont (CFont* pFont);

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

virtual void OnOK ();

Метод - обработчик сообщений, вызываемый при щелчке пользователя на командной кнопке ОК (с идентификатором IDOK).

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

Отметим, что при использовании метода ОпОК для немодального окна диалога метод должен быть переопределен и в него следует включить вызов метода DestroyWindow. Вызов метода базового класса инициирует только вызов EndDialog, который завершает работу диалогового окна, но не удаляет сам объект - диалоговое окно.

virtual void OnCancel ();

Метод - обработчик сообщений, вызываемый при щелчке пользователя на командной кнопке Cancel (с идентификатором IDCANCEL).

Классы оконных элементов управления библиотеки MFC

Библиотека MFC предоставляет ряд классов, реализующих различные элементы управления. В этом разделе мы будем рассматривать классы элементов управления, производные от CWnd, и таким образом представляющие собой некоторые оконные объекты. Будем называть такие элементы управления оконными элементами управления. Базовым классом для всех классов оконных элементов управления является класс CWnd.

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

В библиотеке MFC содержатся следующие классы оконных элементов управления:

• CAnimateCtrl

• CButton

• CBitmapButton

• CComboBox

• CEdit

• CHeaderCtrl

• CHotKeyCtrl

• CListBox

• CCheckListBox

• CDragListBox

• CListCtrl

• COleControl

• CProgressCtrl

• CRichEditCtrl

• CScrollBar

• CSliderCtrl

• CSpinButtonCtrl

• CStatic

• CStatusBarCtrl

• CTabCtrl

• CToolBarCtrl

• CToolTipCtrl

• CTreeCtrl.

В этом разделе мы рассмотрим наиболее общие и используемые классы.

Класс CanimateCtrl

Класс CAnimateCtrl предоставляет функции управления анимацией в среде Windows. Элемент управления, создаваемый как экземпляр данного класса, доступен только для Windows 95 и Windows NT (версии 3.51 и более поздних).

Элемент управления, созданный как экземпляр данного класса, будем называть объектом анимации. Такой объект представляет собой обычное окно, в котором отображается некоторый клип, являющийся файлом в формате AVI (Audio Video Interleaved). AVI-файл содержит последовательный набор битовых изображений.

Объекты анимации могут показывать только простые AVI-клипы.

Функции-члены класса CAnimateCtrl

CAnimateCtrl::CAnimateCtrl - является конструктором класса и создает

объект типа CAnimateCtrl; CAnimateCtrl: :Create - создает элемент управления анимации для

объекта CAnimateCtrl; CAnimateCtrl:: Open - открывает AVI-клип из файла или ресурса

и отображает первый кадр;

CAnimateCtrl::Play - показывает AVI-клип (без звука); CAnimateCtrl::Seek - показывает из AVI-клипа выбранный кадр; CAnimateCtrl::Stop - останавливает просмотр AVI-клипа; CAnimateCtrl::Close - закрывает ранее открытый AVI-клип.

CAnimateCtrl ();

Конструктор объекта CAnimateCtrl. Перед тем как выполнить любую операцию над объектом, необходимо вызвать метод Create.

BOOL Close ();

При успешном завершении метода возвращается ненулевое значение, и 0 - в противном случае.

BOOL Create (DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nlD);

При успешном завершении метода возвращается ненулевое значение, и 0 - в противном случае.

Параметры:

dwStyle - определяет стиль элемента управления анимация. Например: WS_CHILD, WS_VISIBLE, WS_DISABLED.

rect - определяет размер и расположение элемента анимация. Этот параметр может быть определен или как объект класса CRect, или как структура RECT.

Структура RECT задает координаты верхнего левого и нижнего правого угла прямоугольника и имеет следующее определение:

typedef struct tagRECT {

LONG left; // х-координата верхнего левого угла

LONG top; // у-координата верхнего левого угла

LONG right;

LONG bottom; } RECT;

pParentWnd - определяет родительское окно для элемента управления анимация. Как правило, таким окном является или окно класса CDialog, или производного от него класса. Отметим, что этот параметр не может иметь значение NULL.

nID - определяет идентификатор ID элемента управления.

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

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

Можно использовать следующие стили элемента управления анимация: ACS_CENTER Указывает, что при открытии AVI-клипа размер и

расположение элемента управления анимация не будут изменены в соответствии с размером изображения в AVI-клипе. ACS_TRANSPARENT Отображение AVI-клипа с использованием прозрачного фонового цвета.

ACS_AUTOPLAY Автоматический запуск AVI-клипа сразу после открытия, а также автоматический повтор его по завершению. Стили окна:

WS_BORDER Создание окна с рамкой.

WS_CAPTION Создание окна с заголовком (нельзя исполь-

зовать одновременно со стилем WS_DLGFRAME).

WS_CHILD Создание дочернего окна (нельзя использо-

вать одновременно со стилем WS_POPUP).

WS_CLIPCHILDREN Исключает область, занятую дочерним ок-

ном, при выводе в родительское окно.

WS_CLIPSIBLINGS Используется совместно со стилем

WS_CHILD для отрисовки в дочернем окне областей клипа, перекрываемых другими окнами.

WS_DISABLED Создает окно, являющееся недоступным.

WS_DLGFRAME Создает окно с двойной рамкой, но без заго-

ловка.

WS_GROUP Позволяет объединять элементы управления

в группы.

WS_HSCROLL Создает окно*с горизонтальной полосой про-

крутки.

WS_MAXIMIZE Создает окно максимального размера.

WS_MAXIMIZEBOX Создает окно с кнопкой развертывания окна.

WS_MINIMIZE Создает первоначально свернутое окно

(может использоваться только со стилем WS_OVERLAPPED).

WS_MINIMIZEBOX Создает окно с кнопкой свертывания.

WS_OVERLAPPED Создает перекрывающееся окно (которое,

как правило, имеет заголовок и рамку).

WS_OVERLAPPEDWINDOW Создает перекрывающееся окно, имеющее

стили: WSJ)VERLAPPED, WS_CAPTION, WS_SYSMENU, WSJTHICKFRAME, WS_MINIMIZEBOX, WS_MAXIMIZEBOX.

WS_POPUP Создает popup-окно (нельзя использовать

совместно со стилем WS_CHILD).

WS_POPUPWINDOW Создает popup-окно, имеющее стили:

WS_BORDER, WS_POPUP, WS_SYSMENU.

WS_SYSMENU Создает окно с кнопкой системного меню

(можно использовать только для окон, имеющих строку заголовка).

WS_TABSTOP Определяет элементы управления, переход к

которым может быть выполнен по клавише Tab.

WS_THICKFRAME Создает окно с рамкой, используемой для

изменения размера окна.

\VS_VISIBLE Создает первоначально неотображаемое ок-

но.

WS_VSCROLL Создает окно с вертикальной полосой про-

крутки.

BOOL Open (LPCTSTR IpszFileName); BOOL Open (UINT nlD);

При успешном завершении метода возвращается ненулевое значение, и 0 - в противном случае.

Параметры:

IpszFileName - объект типа CString или указатель на строку (ограниченную 0-символом) содержат или имя AVI-файла, или имя AVI-pecypca. При значении параметра, равном NULL, система закроет, если есть, ранее открытый для данного элемента управления AVI-клип. пID - идентификатор AVI-pecypca.

Этот метод вызывается для открытия AVI-клипа и отображения первого его кадра.

Для того чтобы запуск клипа выполнялся автоматически, сразу после открытия файла следует установить стиль ACS_AUTOPLAY.

BOOL Play (UINT nFrom, UINT nTo, UINT nRep);

При успешном завершении метода возвращается ненулевое значение, и 0 - в противном случае. Параметры:

nFrom - индекс первого отображаемого кадра. Все кадры нумеруются начиная с нуля. Максимально допустимый номер кадра равен 65536. пТо - индекс последнего отображаемого кадра.

nRep - количество повторений AVI-клипа. Значение -1 указывает на неопределенное количество повторов.

BOOL Seek (UINT nTo);

При успешном завершении метода возвращается ненулевое значение, и 0 - в противном случае. Параметры:

пТо - индекс отображаемого кадра. При значении 0 будет показан первый кадр, а при значении -1 - последний кадр AVI-клипа.

Этот метод позволяет статически показывать отдельные кадры из AVI-клипа.

BOOL Stop ();

Останавливает отображение AVI-клипа.

При успешном завершении метода возвращается ненулевое значение, и 0 - в противном случае.

Класс Cbutton

Класс CButton реализует элемент управления кнопка. Кнопки могут быть трех типов:

• переключатель, иногда также называемый флажком (check box);

• радиокнопка (radio button);

• командная кнопка (pushbutton).

Тип кнопки определяется ее стилем, указываемым при создании кнопки (метод Create). Из данного класса наследуется класс CBitmapButton, реализующий кнопки с изображениями вместо текста.

Создать кнопку можно как с использованием редактора ресурсов, так и непосредственно программным путем.

Обработка сообщений

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

• ON_BN_DOUBLECLICKED.

Отметим, что если объект CButton создается расположенным в диалоговом окне, то он автоматически разрушается при закрытии пользователем этого диалогового окна. Если же объект был создан динамически вызовом метода new, то для его разрушения следует вызвать метод delete.

Методы класса CButton CButton ();

Конструктор объекта CButton.

BOOL Create (LPCTSTR ipszCaption, DWORD dwStyle, const RECT& red, CWnd* pParentWnd, UINT nID);

Метод создает Windows-кнопку для объекта CButton и при успешном завершении возвращает ненулевое значение.

Параметры:

IpszCaption - заголовок кнопки.

dwStyle - стиль кнопки (указывается допустимой комбинацией флажков стиля кнопки).

rect - объект CRect или структура RECT, определяющие размер и положение кнопки.

pParentWnd - указатель родительского окна (может быть объект класса CDialog).

nID - ID кнопки.

Создание кнопки, как и любого оконного объекта, выполняется за два шага: сначала вызывается конструктор, создающий объект кнопка, а затем вызывается метод Create, создающий Windows-кнопку и пристыковывающий к ней оконный объект.

Кнопке могут быть присвоены следующие флажки стиля (оконного объекта):

WS_CHILD - (устанавливается всегда); WS_VISIBLE; WSJDISABLED;

WS_GROUP - (используется для образования групп кнопок: устанавливается для первой кнопки группы);

WSJTABSTOP - (устанавливается для включения кнопки в табулированный порядок).

НВITМАР GetBitmap () const;

Метод возвращает дескриптор битового изображения, определенного для кнопки методом SetBitmap, или NULL, если кнопке не было назначено никакого изображения.

UINT GetButtonStyle () const;

Метод возвращает стиль (только BS_) данной кнопки CButton. int GetCheck () const;

Метод определяет состояние кнопки (переключателя или радиокнопки), созданной как BS_AUTOCHECKBOX, BS_AUTORADIOBUTTON, BS_AUTO3STATE, BS_CHECKBOX, BS_RADIOBUTTON, BS_3STATE, и возвращает одно из следующих значений:

0 - кнопка не включена (не отмечена);

1 - кнопка включена (отмечена);

2 - кнопка находится в неопределенном состоянии (только для кнопок,

имеющих флажки стиля BS_3STATE или BS_AUTO3STATE). Отметим, что для командных кнопок метод возвращает значение 0. HCURSOR GetCursor ();

Метод возвращает курсор, определенный ранее для данной кнопки методом SetCursor.

HICOIN Getlcon () const;

Метод возвращает пиктограмму, установленную ранее для данной кнопки методом Setlcon.

UINT GetState () const;

Метод определяет текущее состояние кнопки. Возвращаемое значение формируется как комбинация набора значений, выделяемых с помощью следующих масок: 0x0003 - определяет состояние кнопки - переключателя или радиокнопки:

0 - кнопка не включена (не отмечена);

1 - кнопка отмечена;

2 - состояние кнопки не определено;

0x0004 - определяет состояние выделения кнопки: при значении 0 - кнопка не нажата (пользователь щелкнул на ней левой кнопкой мыши и держит ее); 0x0008 - определяет фокус: при значении 1, кнопка находится в фокусе. HBITMAP SetBitmap (HBITMAP hBitmap);

Метод устанавливает растровое изображение, отображаемое на данной кнопке.

Параметры: hBitmap - растровое изображение.

Отметим, что если определяемое растровое изображение больше размера кнопки, то оно будет обрезано. Для выравнивания изображения относительно кнопки можно установить для кнопки следующие флажки:

BS_TOP

BS_LEFT

BS_RIGHT

BS_CENTER

BS_BOTTOM

BS_VCENTER

Отметим, что данный метод устанавливает одно изображение для всех состояний объекта CButton. В отличие от него объект CBitmapButton имеет для каждой кнопки четыре изображения.

void SetButtonStyle (UINT nStyle, BOOL bRedraw = TRUE);

Метод изменяет стиль кнопки.

Параметры:

nStyle - новый стиль кнопки.

bRedraw - параметр, определяющий, следует ли перерисовывать данную кнопку: при ненулевом значении кнопка перерисовывается (по умолчанию).

void SetCheck (int nCheck);

Метод устанавливает новое состояние кнопки - переключателя или радиокнопки.

Параметры: nCheck - новое состояние, определяемое одним из следующих значений:

0 - кнопка не отмечена;

1 - кнопка отмечена;

2 - кнопка находится в неопределенном состоянии (только для кнопок, имеющих стиль BS_3STATE или BS_AUTO3STATE).

HCURSOR SetCursor (HCURSOR hCursor);

Метод устанавливает для кнопки новый курсор и при успешном завершении возвращает дескриптор предыдущего курсора.

Размещение курсора над кнопкой управляется следующими флажками кнопки: BS_TOP, BS_LEFT, BS_RIGHT, BS_CENTER, BS_BOTTOM, BS_VCENTER.

HICON Setlcon (HICON hlcon);

Метод устанавливает новую пиктограмму, отображаемую для данной кнопки при ее нажатии.

void SetState (BOOL bHighlight);

Метод устанавливает новое состояние выделения кнопки (нажата или нет).

Класс CcomboBox

Класс CComboBox реализует функционирование комбинированного окна, иногда также называемого комбинированным окном списка.

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

Выбранный элемент списка отображается в окне редактирования или в окне статического элемента управления.

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

Стиль

Состояние окна списка

Используемый элемент управления

Simple

Отображается всегда

Edit

Drop-down

Отображается при распахивании окна списка

Edit

Drop-down list

Отображается при распахивании окна Списка

Static

Мы не будем здесь и в дальнейшем останавливаться на процессе создания описываемого элемента управления, так как подробно описали процедуру формирования оконного объекта в разделе "Класс CWnd".

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

ON_CBN_CLOSEUP - окно списка или комбинированное окно закрываются (посылается только комбинированному окну, имеющему распахнутое состояние, т. е. окно не должно иметь стиль CBS_SIMPLE);

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

ON_CBN_DROPDOWN - распахивание окна списка комбинированного окна; ON_CBN_EDITCHANGE - пользователь изменил текст в окне редактирования комбинированного окна (в отличие от сообщения CBN_EDITUPDATE обрабатываемое сообщение посылается после того, как Windows обновит экран);

ON_CBN_EDITUPDATE - обрабатываемое сообщение посылается при изменении текста окна редактирования и до его отображения; ON_CBN_ERRSPACE - не хватает памяти;

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

ON_CBN_SELENDOK - пользователь выделил элемент списка и затем нажал или клавишу Enter, или клавишу Down Arrow; ON_CBN_KILLFOCUS - комбинированное окно теряет фокус ввода; ON_CBN_SELCHANGE - изменение выбранного элемента окна списка посредством или щелчка мышью в окне списка, или перемещением выбранного элемента с помощью клавиш со стрелками; ON_CBN_SETFOCUS - комбинированное окно получает фокус ввода.

Методы класса CComboBox int AddString (LPCTSTR ipszString);

Метод добавляет указанную строку к элементам окна списка комбинированного окна и при успешном завершении возвращает индекс добавленного элемента (начиная с нуля). При неудачном завершении метод возвращает значения CB_ERR или CB_ERRSPACE.

Место добавления строки в окно списка определяется стилем окна списка: стиль CBS_SORT поддерживает список в отсортированном состоянии и добавление происходит в соответствующее место; если этот стиль не установлен, то добавление выполняется в конец списка.

CComboBox ();

Конструктор объекта CComboBox. void Clear ();

Метод удаляет текущее выделение в окне редактирования комбинированного окна. Отметим, что удаляемое выделение не сохраняется в буфере промежуточного хранения; в отличие от выполнения метода Cut.

virtual int Compareltem (LPCOMPAREITEMSTRUCT ipCompareltemStruct);

Метод возвращает значение, указывающее относительную позицию двух; элементов списка, заданных структурой COMPAREITEMSTRUCT.

Возвращаемое значение определяется следующим образом: - 1 - элемент 1 при сортировке располагается до элемента 2;

0 - элемент 1 и элемент 2 при сортировке располагаются одинаково;

1 - элемент 1 при сортировке располагается после элемента 2. Отметим, что если вы создали самоотображаемое окно списка со стилем

LBS_SORT, то этот метод должен быть переопределен. По умолчанию метод не выполняет никаких действий.

Структура COMPAREITEMSTRUCT определяется следующим образом: typedef struct tagCOMPARElTEMSTRUCT { UINT CtlType; UINT CtllD; HWND hwndltem; UINT itemlDl; DWORD itemDatal; UINT itemID2; DWORD itemData2; } COMPAREITEMSTRUCT;

void Copy ();

Метод копирует текущее выделение в окне редактирования комбинированного окна в буфер промежуточного хранения в формате CF_TEXT.

BOOL Create (DWORD dwStyle, const RECT& reel, CWnd* pParentWnd, UINT nID);

Метод создает комбинированное окно Windows и пристыковывает его к объекту CComboBox (созданного конструктором). При успешном завершении метод возвращает ненулевое значение.

Параметры:

dwStyle - стиль комбинированного окна. rect - расположение и размер. pParentWnd - родительское окно. nID - ID комбинированного окна.

При выполнении данного метода Windows посылает комбинированному окну сообщения WM_NCCREATE, WM_CREATE, WM_NCCALCSIZE и WM_GETMINMAXINFO.

По умолчанию эти сообщения обрабатываются соответствующими методами класса CWnd: OnNcCreate, OnCreate, OnNcCalcSize, OnGetMinMaxInfo.

Комбинированному окну могут быть назначены следующие флажки стиля оконного объекта: WS_CHILD (устанавливается всегда)

WS_VISIBLE WS_DISABLED WS_VSCROLL WS_HSCROLL

WS_GROUP (устанавливается для первого элемента группы) WS_TABSTOP (определяет включение элемента управления в табулированный порядок).

void Cut ();

Метод вырезает текущее выделение из окна редактирования комбинированного окна и помещает его в буфер промежуточного хранения (в формате CF_TEXT).

virtual void Deleteltem (LPDELETEITEMSTRUCT ipDeleteltemStruct);

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

int DeleteString (UINT nIndex);

Метод удаляет строку с указанным индексом из окна списка комбинированного окна и возвращает оставшееся в списке количество элементов

(равное или большее нуля). Если параметр содержит неверное значение индекса, то метод возвращает значение CB_ERR.

int Dir (UINT attr, LPCTSTR ipszWildCard);

Метод добавляет список имен файлов или дисков в окно списка комбинированного окна. При успешном выполнении метод возвращает количество добавленных элементов. В случае ошибки метод возвращает значение CB_ERR или CB_ERRSPACE.

Параметры:

attr - комбинация следующих значений:

DDL_READWRITE (файлы, доступные и на чтение и на запись); DDL_READONLY (файлы, доступные только на чтение); DDL_HIDDEN (скрытые файлы, не отображаемые в списке файлов каталога); DDL_SYSTEM (системные файлы);

DDL_DIRECTORY (параметр IpszWildCard специфицирует имена каталогов); DDL_ARCHIVE; DDL_DRIVES (параметр IpszWildCard специфицирует имена логических

дисков);

DDL_EXCLUSIVE (флажок, определяющий, что в список будут включены только файлы указанных типов; при отсутствии флажка в формируемый список добавляются также "обычные" файлы). IpszWildCard - строка, содержащая маску спецификации имени файла/каталога (например: *.*).

virtual void Drawltem (LPDRAWITEMSTRUCT ipDrawItemStruct);

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

int FindString (int nStartAfter, LPCTSTR ipszString) const;

Метод находит (но не выделяет) первое вхождение указанного префикса строки в окне списка комбинированного окна. Если строка найдена, то метод возвращает ее индекс; в противном случае возвращается значения CB_ERR.

Параметры:

nStartAfter - индекс строки, начиная с которой выполняется поиск. Список просматривается циклически: при достижении конца списка поиск продолжается с начала и до строки с указанным индексом. Если этот параметр равен -1, то все элементы окна списка просматриваются с начала.

IpszString - строка, содержащая искомый префикс.

int FindStringExact (int nlndexStart, LPCTSTR ipszFind) const;

Метод находит (но не выделяет) первое вхождение указанной строки в окне списка комбинированного окна. Если строка найдена, то метод возвращает ее индекс; в противном случае возвращается значение CB_ERR.

int GetCount () const;

Метод возвращает количество элементов в окне списка комбинированного окна, а при возникновении ошибки - значение CB_ERR.

int GetCurSel () const;

Метод возвращает индекс выделенного элемента окна списка комбинированного окна. Если выделенного элемента нет, то метод возвращает значение CB_ERR.

void GetDroppedControlRect (LPRECT Ipreci) const;

Метод получает экранные координаты распахнутого окна списка комбинированного окна.

Параметры:

Iprect - структура RECT, в которую заносятся получаемые координаты. BOOL GetDroppedState () const;

Метод определяет состояние окна списка комбинированного окна. Если окно списка распахнуто (видимо), то метод возвращает ненулевое значение.

int GetDroppedWidth () const;

При успешном завершении метод возвращает минимально допустимую ширину окна списка (в пикселях). При возникновении ошибки возвращается значение CB_ERR.

Отметим, что этот метод используется только для комбинированных окон стиля CBS_DROPDOWN или CBS_DROPDOWNLIST.

По умолчанию это значение равно нулю.

DWORD GetEditSel () const;

Метод определяет начальную и конечную позицию текущего выделения в окне редактирования комбинированного окна.

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

При ошибке метод возвращает значение CB_ERR.

BOOL GetExtendedUI () const;

Метод определяет, какой интерфейс используется данным комбинированным окном. При использовании расширенного пользовательского интерфейса

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

Расширенный пользовательский интерфейс может быть определен в том случае, если при щелчке мышью на статическом элементе управления только для комбинированного окна стиля CBS_DROPDOWNLIST отображается окно списка; также окно списка отображается при нажатии клавиши Down Arrow.

UINT GetHorizontalExtent () const;

Метод определяет ширину горизонтально прокручиваемого списка (в пикселях).

DWORD GetltemData (hit nlndex) const;

Метод возвращает 32-разрядное значение, ассоциируемое с элементом списка (это значение может быть установлено методом SetltemData). При возникновении ошибки возвращается значение CB_ERR.

Параметры:

nlndex - индекс элемента окна списка комбинированного окна. void* GetltemDataPtr (int nlndex) const;

Метод возвращает как указатель 32-разрядное значение, ассоциируемое с элементом списка.

int GetltemHeight (int nlndex) const;

Метод возвращает высоту указанного компонента комбинированного окна (в пикселях). При возникновении ошибки возвращается значение CB_ERR.

Параметры:

nlndex - определяет компонент комбинированного окна: при значении -1 определяется высота окна редактирования (или окна статического элемента управления); при установленном стиле CBS_OWNERDRAWVARIABLE определяется высота элемента окна списка, чей индекс равен nlndex; в ocтальных случаях этот параметр должен быть равен нулю.

int GetLBText (int nlndex, LPTSTR ipszText) const; void GetLBText (int nlndex, CString& rString) const;

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

Параметры:

nlndex - индекс элемента окна списка. IpszText - указатель на буфер, в который копируется строка из окна списка.

rString - ссылка на объект CString. int GetLBTextLen (int nlndex) const;

Метод возвращает длину строки в окне списка комбинированного окна. При возникновении ошибки возвращается значение СВ_ЕRR.

Параметры:

nlndex - индекс элемента окна списка, содержащего строку. LCID GetLocale () const;

Метод определяет значение идентификатора места (страны) строки в комбинированном окне.

Соседние файлы в папке VC++Баженова