Прежде чем рассказывать про класс CWinDataExchange<>, скажу несколько слов об общих принципах реализации дополнительной функциональности в WTL.
Обычно дополнительные возможности WTL реализуются в отдельных классах. Чтобы получить доступ к этим возможностям, необходимо произвести свой класс от всех классов WTL, содержащих нужную нам функциональность. Далее каждый из базовых классов конфигурируется с помощью соответствующей карты (map), которая составляется из специально предусмотренных для этой цели макросов. Обычно карта начинается макросом BEGIN_XXX_MAPи заканчивается макросом END_XXX_MAP(XXX обозначает некоторый идентификатор, разъясняющий назначение карты). Между ними располагаются все остальные макросы карты.
Некоторые механизмы WTL, подключённые к нашему классу, требуют также начальной инициализации, которую можно выполнить, например, в обработчике сообщения WM_INITDIALOG.
Настроив нужные нам механизмы WTL, мы можем использовать их, вызывая или переопределяя предусмотренные для этой цели методы.
Вернёмся к механизму DDX. Чтобы использовать его, включите в список базовых классов вашего диалога (или другого окна, содержащего контролы) класс CWinDataExchange<>(описан в файле atlddx.h ). В качестве параметра шаблона задаётся имя вашего производного класса. Например:
class CMyDialog : public CDialogImpl, public CWinDataExchange{
…
};
Следующий шаг – включить в public-секцию вашего класса карту DDX. Каждая строчка в этой карте связывает идентификатор контрола с некоторой переменной в вашей программе. Обычно это переменная-член класса, но она может быть и глобальной/статической. В обмене могут участвовать числовые или текстовые данные с ограничениями или без них. Список макросов, из которых строится карта DDX, приведён в таблице 1.
Макрос |
Описание |
BEGIN_DDX_MAP(thisClass) |
Начало карты DDX. thisClass– имя класса, в котором содержится карта. |
DDX_TEXT(nID, var) |
Связывает строковую переменную varс контролом nID(здесь и далее nID– это идентификатор контрола). Переменная varможет иметь тип TCHAR*, BSTR, CComBSTRили CString. Обмен данными осуществляется при помощи функций SetWindowTextи GetWindowText. Чаще всего макрос используется для статических контролов и полей ввода, хотя может применяться и с другими окнами. |
DDX_TEXT_LEN(nID, var, len) |
Аналогичен предыдущему, но длина строки ограничивается значением len. Попытка передать строку, длина которой превышает len, приведёт к ошибке валидации (об ошибках немного позже). |
DDX_INT(nID, var) |
Связывает целочисленную переменную varс контролом nID. |
DDX_INT_RANGE(nID, var, min, max) |
Аналогичен предыдущему, но передаваемое значение должно лежать в диапазоне от minдо max. Невыполнение этого условия приведёт к ошибке валидации. |
DDX_UINT(nID, var) |
Связывает целочисленную беззнаковую переменную varс контролом nID. |
DDX_UINT_RANGE(nID, var, min, max) |
Аналогичен предыдущему, но передаваемое значение должно лежать в диапазоне от minдо max. Невыполнение этого условия приведёт к ошибке валидации. |
DDX_FLOAT(nID, var) |
Связывает переменную с плавающей точкой varс контролом nID. varможет иметь тип floatили double. Макрос DDX_FLOATбудет доступен, только если вы определите макрос _ATL_USE_DDX_FLOATперед включением заголовочного файла atlddx.h . |
DDX_FLOAT_RANGE(nID, var, min, max) |
Аналогичен предыдущему, но передаваемое значение должно лежать в диапазоне от minдо max. Невыполнение этого условия приведёт к ошибке валидации. |
DDX_CONTROL(nID, obj) |
Связывает объект objс контролом nID. Для связывания используется метод obj.SubclassWindow, поэтому объект должен принадлежать классу CWindowImplBaseT<>или производному от него. |
DDX_CHECK(nID, var) |
Привязывает переменную varтипа intк флагу checked кнопки nID. Для обмена данными используются сообщения BBM_SETCHECKи BM_GETCHECK. |
DDX_RADIO(nID, var) |
Связывает переменную varтипа intс группой переключателей. Контрол nIDдолжен быть первым в группе. |
END_DDX_MAP() |
Этот макрос завершает карту DDX. Не имеет параметров. |
Рассмотрим пример карты DDX для диалога, который позволяет вводить имя, адрес и номер телефона.
Читать дальше