Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Уроки по программированию. Visual C++, MFC, VB, ActiveX


Служба Рассылок Subscribe.Ru

Visual C++. MFC. Уроки по программированию с сайта http://progs.biz

Рассылка №30

Visual C++. MFC. Урок 22. Диалог в качестве главного окна.
Visual C++. MFC. Урок 23. Функции DDX.
Visual C++. MFC. Урок 24. Функции DDV.

Полные версии уроков (с картинками) можно найти по адресам
Урок 22. Диалог в качестве главного окна.
Урок 23. Функции DDX.
Урок 24. Функции DDV.

Visual C++. MFC. Урок 22. Диалог в качестве главного окна

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

Для начала сделаем несколько стандартных шагов, а именно сделаем приложение типа Win32 Application с именем Dialog_based.

Добавим в него файл Dialog_based.cpp. Не забудем изменить настойки проекта на использование MFC (Project->Settings, далее вкладка General).

Теперь добавляем ресурс диалогового окна (Insert->Resource->Dialog, далее кнопка New). В диалоговом окне ничего менять не будем - пусть пока там будут только две кнопки - OK и Cancel (Добавлять будем в последующих уроках).

Нажмите далее на кнопку Save All и для ресурса нашего диалога введите имя Resource.rc.

Теперь мы должны добавить файлы нашего диалога в проект (Project->Add to Project->Files, далее выбираем resource.h и resource.rc, нажимаем на OK). В нашем проекте должна появится вкладка Resource, а на вкладке FileView появятся два присоединенных файла.

Далее добавляем следующий код:

#include "afxwin.h" //для использования CDialog
#include "resource.h"
class CMyDlg : public CDialog{ //наш класс - потомок CDialog
public:
    CMyDlg(CWnd* pParent=NULL);
};
//создаем диалог по нашему шаблону
CMyDlg::CMyDlg(CWnd* pParent):CDialog(IDD_DIALOG1, pParent){
}

class CMyApp : public CWinApp{
public:
    virtual BOOL InitInstance();
};
BOOL CMyApp::InitInstance(){
    CMyDlg dlg;
    m_pMainWnd = &dlg;
    dlg.DoModal(); //показываем диалог
    return TRUE;
}
CMyApp theApp;

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

Наверх

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(); //показываем диалог
    ...

Запускаем программу и она показывает те значения в контролзах, которые мы и ожидаем.

Даваете теперь обсудим наш код более подробно. Мы ввели в наш класс 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 с некоторым элементом управления.

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

Наверх

Visual C++. MFC. Урок 24. Функции DDV

На этом занятии мы с вами рассмотрим функции DDV_... . Их, как и функций DDX_, достаточно много (мало того, вы сами можете определять свои собственные). Служат эти функции для проверки введенных пользователем данных. Типичный пример использования такой функции - это проверка, что введенное пользователем число лежит в определенном диапазоне.

Для конкретного примера возьмем программу, созданную на предыдущих двух уроках. Найдите в классе CMyDlg реализацию метода DoDataExchange и добавьте следующую строку:

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

Синтаксис у добавленной нами функции такой: первый параметр pDX (типа CDataExchange*) - это контекст обмена. Он нужен для функций DDX_ и DDV_ (например, он хранит информацию о том, куда движутся данные - от элементов управления к соответствующим переменным или обратно). Второй параметр - это переменная, связанная с нашим элеменом управления (именно на нее и накладываются некоторые ограничения). Третий и последующие параметры (если они есть) - это сами ограничения. В нашем случае мы добавили ограничение на максимальное число вводимых символов в нашем edit'е (три символа).

Вот еще несколько примеров функций DDV_ (у всех их них по четыре параметра):

DDV_MinMaxLong - для проверки, что некое число типа long лежит в некоторых пределах,

DDV_MinMaxInt - для проверки, что некое число типа int лежит в некоторых пределах,

DDV_MinMaxFloat - для проверки, что некое число типа float лежит в некоторых пределах.

Небольшое замечание по месту вызова DDV_ функций. Их рекомендуется вызывать сразу после соответствующей функции DDX_ (как в нашем примере: сначала мы вызвали функцию обмена DDX_Text(pDX, IDC_EDIT1, m_sData); для нашего edit'а и переменной m_sData, и сразу за этим функцию проверки DDV_MaxChars(pDX, m_sData, 3); для этой же переменной m_sData).

У всех функций DDV_ существует одно ограничение - проверка корректности данных осуществляется только после того, как кользователь нажимает на OK, а не в процессе набора. И это не слишком хорошо.

Наверх

Copyright Алексеев Игорь, 2002

Copyright cайт progs.biz, 2002



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное