Цієї записці описується діалоговому обмін даними (DDX) і діалогове вікно даних архітектури перевірки (DDV). Він також описує, як ви пишете в DDX_ або DDV_ процедури, і як можна розширити використовувати вашої процедури ClassWizard.
Огляд діалогове вікно даних Exchange
Всі функції діалогове вікно даних зробили з C++ код. Немає спеціальних ресурсів або чарівної макроси. Серце механізму є віртуальних функцій, що змінені у кожному класі діалогове вікно, що діалогове вікно обміну даними та перевірки. Він завжди знаходиться в такому вигляді:
недійсним CMyDialog::DoDataExchange (CDataExchange * pDX)
{
nbsp; CDialog::DoDataExchange(pDX); / / базового класу обслуговування
//{{AFX_DATA_MAP(CMyDialog)
<data_exchange_function_call>
//}}AFX_DATA_MAP
}
Коментарі AFX спеціальний формат дозволяє ClassWizard, щоб знайти та змінити код у рамках цієї функції. Код, який не сумісний з ClassWizard повинні бути розміщені поза з спеціальний формат коментарів.
У наведеному вище прикладі, lt; data_exchange_function_call > у вигляді:
DDX_Custom (pDX, nIDC, Сфера)
та ще lt; data_validation_function_call > не є обов'язковим і у вигляді:
DDV_Custom (pDX, поля,...)
Більш ніж однією парою DDX_/DDV_ може бути включена в кожен DoDataExchange функції.
Побачити 'afxdd_.h', список всіх діалогове вікно даних exchange процедур і забезпечені MFC процедур перевірки даних діалогове вікно.
Діалогове вікно даних є просто - члени даних класу CMyDialog . Він не зберігається в типу struct або нічого особливого, що.
Нотатки
Хоча ми називаємо це діалогове вікно "дані", всі функції доступні в будь-який клас, отриманих від CWnd і не обмежується тільки діалогів.
Початкові значення даних наведено у стандартних Конструктор C++, зазвичай у блок з //{{AFX_DATA_INIT і //}}AFX_DATA_INIT коментарів.
CWnd::UpdateData це операція, яка робить Ініціалізація і обробка помилок навколо виклику DoDataExchange.
Ви можете назвати CWnd::UpdateData в будь-який час для обміну даними та перевірки. За замовчуванням UpdateData(TRUE) називається у CDialog::OnOK за промовчанням обробник і UpdateData(FALSE) називається по-замовчуванням CDialog::OnInitDialog.
DDV_ режим негайно повинні слідувати DDX_ режим для цього поля.
Як це працює?
Вам не потрібно зрозуміти наступне, щоб використовувати діалогове вікно даних. Тим не менш, розуміння того, як це працює за лаштунками допоможе вам написати свій власний обміну або перевірки порядку.
Функція-член DoDataExchange так само, як функція Serialize -член - це відповідальність за отримання або встановлення даних до/від зовнішніх форми (в даному випадку контролює в діалозі) / Члени дані в класі. Параметр pDX контекст для цього обміну даними і подібні до параметра CArchive , щоб CObject::Serialize. PDX ( CDataExchange об'єкт) має напрямок прапор, так само, як CArchive має напрямок прапор
Перевірка відбувається тільки коли m_bSaveAndValidate встановлений. Значення m_bSaveAndValidate визначається параметрами BOOL CWnd::UpdateData.
Є три інші цікаві CDataExchange членів:
Розширення користувачем
Є кілька способів, щоб розширити механізму DDX/DDV за замовчуванням. Ти можеш:
CTime
недійсними ПАСКАЛЬ DDX_Time(CD&ataExchange* pDX, int nIDC, CTimeamp; tm)
недійсними ПАСКАЛЬ DDV_TimeFuture(CDataExchange* pDX, CTime tm, BOOL bFuture);
/ / Переконайтеся, що час в минуле або майбутнє
DDV_MinMax (pDX, вік, 0, m_maxAge)
Примітка Словосполучення довільний не можна редагувати на ClassWizard і тому повинні бути переїхали за межами спеціальний формат коментарів (//{{AFX_DATA_MAP(CMyClass)).
Мати DoDialogExchange член функції включають умовні або будь-які інші дійсний C++ заяви з великій валют і викликів функцій перевірки.
//{{AFX_DATA_MAP(CMyClass)
DDX_Check (pDX, IDC_SEX, m_bFemale);
DDX_Text (pDX, IDC_EDIT1, m_age);
//}}AFX_DATA_MAP
Якщо (m_bFemale)
DDV_MinMax (pDX, вік, 0, m_maxFemaleAge);
інше
DDV_MinMax (pDX, вік, 0, m_maxMaleAge)
Примітка Як показано вище, такий код можна редагувати не ClassWizard і слід використовувати лише за межами спеціальний формат коментарів.
ClassWizard підтримка
ClassWizard підтримує деякі налаштування DDX/DDV, дозволяючи вам інтегрувати ваші власні DDX_ і DDV_ процедури в інтерфейсі користувача ClassWizard. Цього є тільки вартість корисно, якщо ви плануєте повторно використовувати певний DDX і DDV процедур, знову і знову в проекті або у багатьох проектах.
Для цього спеціальні записи зроблені в DDX.CLW (попередні версії Visual C++ зберігаються цю інформацію в APSTUDIO.INI) або у вашому проекті.CLW файл. Спеціальні елементи можуть бути введені в розділі [Загальна інформація] вашого проекту.CLW файл або в розділі [ExtraDDX] в DDX.CLW файл у \Program Files\Microsoft візуальних Studio\Visual C + + \bin каталогу. Може знадобитися створити в DDX.CLW файл, якщо він вже не існує. Якщо ви плануєте використовувати користувацькі процедури DDX_/DDV_ тільки в певних проекту, додавати записи до розділу [Загальна інформація] вашого проекту.CLW замість цього файлу. Якщо ви плануєте використовувати процедур багато проектів, додавати записи до розділу [ExtraDDX] DDX.CLW.
Це загальний формат цих спеціальних елементів:
ExtraDDXCount = n
; де n — кількість ExtraDDX? лінії для наслідування
ExtraDDX? = lt; клавіші >; < vb клавіш >; <prompt> <type> <initValue> <DDX_Proc> [; <DDV_Proc> <prompt1> <arg1> [<prompt2> <fmt2>]]
; Де? це номер 1-n зазначенням DDX тип списку, що бути визначено.
Кожне поле розділяються символ ';'. Описані нижче поля і їх призначення.
lt; клавіші & gt;
= перелік окремі символи, що зазначенням, для яких діалоговому контролю дозволено цей тип змінної.
E = редагування
C = прапорець двох держав
c = tri-state прапорець
R = перший перемикач у групі
L =-сортування списку
l = відсортованому списку
M = зі списком (з редагувати елемент).
N = список не відсортовано падіння
n = сортованих зі списку
1 = Якщо вставити DDX повинні бути додані до голови список (за промовчанням додати до хвоста) Це звичайно використовується для DDX процедур, що передачу власності 'Управління'.
lt; автоматичний переклад-клавіш & gt;
це поле використовується тільки в 16-розрядних продукт для VBX елементів керування (VBX не підтримуються в 32-бітної продукт)
lt; запитувати > =
рядок в полі зі списком властивостей (без лапок)
lt; тип > =
один ідентифікатор типу випромінювати заголовка файлу. У нашому прикладі вище, з DDX_Time це буде встановлена на CTime.
lt; автоматичний переклад-клавіш > =
не використовується в цій версії і завжди має бути пустим
lt; initValue > =
початкове значення - 0 або пустий. Якщо пусте, то немає ініціалізації лінії будуть записані в //{{AFX_DATA_INIT розділі виконання файлу. Пустий запис повинен використовуватися для C++ об'єкти (наприклад, CString, CTime і так далі), які мають конструкторів, які гарантують правильну ініціалізації.
lt; DDX_Proc > =
один ідентифікатор для DDX_ процедури. Ім'я функції C++ має починатися з "DDX_", але не включають в себе "DDX_" в lt; DDX_Proc > ідентифікатор. У наведеному вище прикладі ідентифікатор <DDX_Proc> буде час. Коли ClassWizard пише виклику функції для виконання файлу з на {{AFX_DATA_MAP розділ, він додається це ім'я DDX_, таким чином, що прибувають на DDX_Time.
lt; Коментарі > =
коментарі, щоб показати у діалоговому вікні для змінної з цього DDX. Помістити будь-який текст, ви б, як тут, звичайно забезпечують те, що описує операцію у виконанні пару DDX/DDV.
lt; DDV_Proc & gt;
DDV частину запис не є обов'язковим. Не всі DDX процедури мають відповідні процедури DDV. Часто це більш зручний, включають етап перевірки якості складової частини передачі. Це часто випадок, коли ваш DDV режим, не вимагає будь-які параметри, оскільки ClassWizard не підтримує DDV процедур, без будь-яких параметрів.
= один ідентифікатор DDV_ процедури. Ім'я функції C++ має починатися з "DDV_", але не включають в себе "DDX_" в lt; DDX_Proc > ідентифікатор.
після 1 або 2 DDV args:
lt; promptX > =
рядок розмістити вище редагування елемента (з & для прискорювач)
lt; fmtX > =
формат символу для типу arg, одним з
d = int
u = непідписані
D = довгий int (тобто, довго)
U = довго непідписані (тобто DWORD)
f = float
F = подвійний
s = рядок
Приклад Custom DDX
Приклад користувацьких DDX з перевірки можна знайти в MFC передові концепції зразок CHKBOOK. Див DDX_DollarsCents в DOLLCENT.CPP приклад реалізації Користувальницькі звичайним DDX і CHKBOOK.CLW для відповідного приклад ExtraDDXCount і ExtraDDX1 записи в розділі [Загальна інформація] CHKBOOK в.CLW файл.
Технічні примітки за номером |nbsp; Технічні примітки за категоріями