
- •Управление обменом и проверкой данных
- •Функции класса cWnd для манипулирования элементами управления диалогового окна
- •Связывание методов класса диалогового окна с элементами управления
- •Использование шрифтов в диалоговом окне
- •Некоторые стандартные шрифты Windows
- •Некоторые константы выравнивания текста
- •Задание 2. Создание класса диалогового окна и связывание его методов и атрибутов с элементами управления
- •Задание 3. Определение обработчиков сообщений, генерируемых элементами управления
- •Обработчики сообщения bn_clicked приложения FontDemo
- •Задание 4. Отображение диалогового окна и данных в его элементах управления
- •Задание 5. Отображение текста в окне представления в соответствии с выбранными в диалоговом окне атрибутами
С элементами управления диалогового окна связываются переменные-члены класса диалогового окна. Как осуществляется обмен данными между ними рассмотрено в следующем параграфе.
Управление обменом и проверкой данных
Если диалоговое окно закрывается при щелчке на кнопку OK, то происходит передача данных из элементов управления диалогового окна в связанные с ними переменные класса диалогового окна. Когда диалоговое окно открывается, то из переменных класса диалогового окна данные переносятся в управляющие элементы. Для реализации этих действий используется механизм DDX/DDV (Dialog data exchange/ Dialog data validation — Обмен данными диалога/Проверка правильности данных). Автоматическая передача и проверка данных осуществляется с помощью глобальных функций с префиксами DDX и DDV. При вызове функций, выполняющих обмен данными, т.е. имеющих префикс DDX, им передаются такие аргументы: указатель на объект класса CDataExchange, идентификатор элемента управления и идентификатор переменной-члена класса диалогового окна. Каждая из этих функция включает в свое имя тип элемента управления. Некоторые функции перегружаются и в качестве параметра используют разные типы данных, которыми могут обмениваться диалоговое окно и соответствующий класс. Примеры некоторых прототипов функций приводятся ниже.
void AFXAPI DDX_Check(CDataExchange* pDX, int nIDC, int& value); void AFXAPI DDX_Control(CDataExchange* pDX, int nIDC, CWnd& rControl ); void AFXAPI DDX_Radio(CDataExchange* pDX, int nIDC, int& value); void AFXAPI DDX_Text(CDataExchange* pDX,int nIDC,CString& value); void AFXAPI DDX_Text(CDataExchange* pDX, int nIDC, int& value);
Функции, имя которых начинается с префикса DDV, выполняют проверку заданных ограничений на вводимые данные. Если в диалоговом окне Add Member Variable Wizard указать диапазон граничных значений переменной, связанной с элементом управления, то в исходный код будет добавлена соответствующая функция проверки данных. Прототипы некоторых функций проверки правильности данных показаны ниже.
void AFXAPI DDV_MaxChars(CDataExchange* pDX,CString const& value, int nChars );
void AFXAPI DDV_MinMaxInt(CDataExchange* pDX, int value, int minVal, int maxVal );
void AFXAPI DDV_MinMaxFloat( CDataExchange* pDX, float value, float minVal, float maxVal );
Если используется DDX механизм, то начальные значения переменных-членов класса диалогового окна, связанных с элементами управления, устанавливаются в функции CDialog::OnInitDialog(), переопределенной в классе диалогового окна. Перед отображением диалогового окна MFC автоматически передает значения переменных элементам управления. Для этого функция CDialog::OnInitDialog() вызывает метод CWnd::UpdateData() для инициализации элементов управления диалогового окна. Этот же механизм передает значения от элементов управления переменным-членам класса диалогового окна, когда пользователь щелкает на кнопку OK. Функция CWnd::UpdateData() передает данные в двух направлениях, благодаря аргументу, переданному ей. Функция объявлена следующим образом:
BOOL CWnd::UpdateData( BOOL bSaveAndValidate = TRUE );
Параметром функции является переменная-член класса CDataExchange. В класс CDataExchange включен элемент данных BOOL m_bSaveAndValidate, значение которого TRUE означает, что механизм обмена данными DDX использует передачу данных из управляющих элементов диалогового окна в переменные класса диалогового окна. Значение m_bSaveAndValidate = FALSE используется в случае инициализации значений элементов управления из переменных класса диалогового окна. Таким образом, чтобы обновить значения элементов управления с отображением соответствующих изменений в диалоговом окне, вызывается функция с аргументом FALSE.
BOOL CWnd::UpdateData(FALSE);
Сохранение значений элементов управления диалогового окна в переменных соответствующего класса выполняется при вызове функции с аргументом TRUE:
BOOL CWnd::UpdateData(TRUE);
Чтобы выполнить обмен данными функция CWnd::UpdateData() вызывает функцию DoDataExchange() класса диалогового окна, которой в качестве аргумента передается указатель на объект класса CDataExchange, поддерживающий обмен данными (DDX) и проверку (DDV) данных диалога. Прототип функции такой:
virtual void CWnd::DoDataExchange(CDataExchange* pDX);
Функция DoDataExchange() класса диалогового окна, вызывая функции с префиксами DDX и DDV, передает данные из элементов управления в переменные-члены класса диалогового окна и наоборот.
MFC-классы для элементов управления
MFC предоставляет классы, позволяющие манипулировать элементами управления различных типов (табл.6.3). Большинство этих классов порождаются от класса CWnd.
Т а б л и ц а 6.3
MFC-классы для манипулирования элементами управления
MFC-класс |
Тип и описание элемента управления |
CAnimateCtrl |
Анимация |
CButton |
Кнопки, флажки, переключатели, рамки |
CBitmapButton |
Кнопки, отображающие растровые рисунки |
CComboBox |
Поле со списком |
CComboBoxEx |
Расширенное поле со списком |
CDateTimeCtrl |
Элемент Дата/Время |
CEdit |
Поле |
CHeaderCtrl |
Заголовок — окно, размещаемое над столбцами таблицы и содержащее заголовки столбцов с настраиваемой шириной |
CHotKeyCtrl |
Горячая клавиша |
CIPAddressControl |
IP-адрес |
CListBox |
Список |
CCheckListBox |
Список с флажками. Каждый пункт содержит флажок. Например, программа Setup в Visual C++ использует списки с флажками для предоставления пользователю возможности выбора инсталлируемых компонентов |
CDragListBox |
Перемещаемый список. Позволяет пользователю перемещать отдельные пункты списка для их переупорядочения |
CListCtrl |
Окно списка |
CMonthCalCtrl |
Календарь по месяцам |
COleControl |
Элементы управления ActiveX — многократно используемые компоненты программного обеспечения. |
ProgressCtrl |
Индикатор |
CReBarCtrl |
Переключаемая панель. |
CRichEditCtrl |
Расширенное поле |
CScrollBar |
Полосы прокрутки: вертикальная или горизонтальная |
CSliderCtrl |
Регулятор |
CSpinButtonCtrl |
Счетчик |
CStatic |
Надписи, рисунки и рамки |
CStatusBarCtrl |
Строка состояния. Использование класса CStatusBarCtrl — альтернатива способу создания строк состояния |
CTabCtrl |
Набор вкладок. Использование класса CTabCtrl — альтернатива способу создания диалоговых окон с вкладками в программах MFC (далее в этой главе) |
Окончание табл. 6.3
MFC-класс |
Тип и описание элемента управления |
CToolbarCtrl |
Панель инструментов. Использование класса CToolbarCtrl — альтернатива способу создания панелей инструментов в программах MFC |
CTooltipCtrl |
Всплывающая подсказка. При создании панели инструментов MFC автоматически реализует всплывающие подсказки |
CTreeCtrl |
Дерево |
Функции-члены этих классов можно применять для получения информации или выполнения операций над элементом управления в диалоговом окне. Так как каждый из классов управления порождается прямо или косвенно от класса CWnd, то в число вызываемых функций-членов входят также функции, определенные в классе CWnd. В табл. 6.4 приведены функции, которые можно использовать для манипулирования элементами управления.
Т а б л и ц а 6.4