C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Урок 23. Функции DDX / Уроки MFC / Visual C++

Visual C++. MFC
Урок 23. Функции DDX

На прошлом уроке мы с вами создали диалоговое окно. В нем никаких элементов не было. Добавьте в него пару элементов - Edit и CheckBox. Идентификаторы для них оставьте по умолчанию (IDC_EDIT1 и IDC_CHECK1). После этого добавьте в класс CMyDlg пару переменных и методы для чтения и записи этих переменных:

class CMyDlg : public CDialog{ //наш класс - потомок CDialog
public:
    CMyDlg(CWnd* pParent=NULL);
    // функция обмена данными
    virtual void DoDataExchange(CDataExchange* pDX);
    void SetStr(CString  sData);  // установить строку
    CString GetStr();  // получить строку
    void SetCheck(BOOL bCheck);  // установить CheckBox
    BOOL GetCheck();  // получить CheckBox
protected:
    CString m_sData;    //строковая переменная
    BOOL m_bCheck;  //переменная - переключатель
};

Напишите реализацию методов для чтения и записи:

void CMyDlg::SetCheck(BOOL bCheck){
    m_bCheck=bCheck;
}
BOOL CMyDlg::GetCheck(){
    return m_bCheck;
}
void CMyDlg::SetStr(CString  sData){
    m_sData=sData;
}
CString CMyDlg::GetStr(){
    return m_sData;
}

Теперь займемся реализацией метода DoDataExchange:

void CMyDlg::DoDataExchange(CDataExchange* pDX){
    //обязательно вызываем родительский метод
    CDialog::DoDataExchange(pDX);
    //обмениваем данные с Edit'ом
    DDX_Text(pDX, IDC_EDIT1, m_sData);
    //обмениваем данные с CheckBox'ом
    DDX_Check(pDX, IDC_CHECK1, m_bCheck);
}

И, наконец, изменяем метод InitInstance:

BOOL CMyApp::InitInstance(){
    CMyDlg dlg;
    m_pMainWnd = &dlg;
    dlg.SetStr("123"); //задаем строку
    dlg.SetCheck(TRUE); //задаем переменную-переключатель
    dlg.DoModal(); //показываем диалог
    ...

Теперь запущенная программа должна выглядеть так:

Диалог New

Таким образом наша программа показывает те значения в контролзах, которые мы и ожидаем.

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

void CMyDlg::DoDataExchange(CDataExchange* pDX){
    //обязательно вызываем родительский метод
    CDialog::DoDataExchange(pDX);
    ...
}

Сюда мы должны вставить вызовы функций DDX_... для всех наших элементов управления. Это мы делаем в строках

    ...
    //обмениваем данные с Edit'ом
    DDX_Text(pDX, IDC_EDIT1, m_sData);
    //обмениваем данные с CheckBox'ом
    DDX_Check(pDX, IDC_CHECK1, m_bCheck);
    ...

Этих функций достаточно много. Их имена начинаются на DDX (от слова eXchange). Например,

DDX_Text - для обмена текстовыми данными,

DDX_Check - для обмена данными логического типа,

DDX_Radio - для обмена данными типа int с группой радиокнопок,

DDX_Control - для обмена данными типа CWnd с некоторым элементом управления.

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