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

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


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

Visual Basic. Примеры. Уроки по программированию с сайта http://progs.biz

Рассылка №31

Visual C++. MFC. Урок 25. Передаем данные по ссылке.
Visual C++. MFC. Урок 26. Понятие об архитектуре Документ-Вид.

Полные версии уроков (с картинками) можно найти по адресам
Урок 25. Передаем данные по ссылке.
Урок 26. Понятие об архитектуре Документ-Вид.

Visual C++. MFC. Урок 25. Передаем данные по ссылке

В уроке 19 мы с вами посмотрели, как передаются данные в диалоговое окно и из него. Напомним приблизительную схему - заводим пару переменных (одну в классе диалогового окна и другую, наример, в классе гланого окна). После этого вызываем диалог с помощью DoModal, передавая данные перед и после этого вызова:

    ...
    CSomeDlg dlg;
    dlg.m_SomeData=m_SomeData;
    dlg.DoModal();
    m_SomeData=dlg.m_SomeData;
    ...

Но этот способ далеко не всегда самый лучщий. Дело в том, что передаваемые данные могут оказаться весьма и весьма большими, и перегонять их туда-сюда не слишком хорошо. В этом случае лучше передать их по ссылке, что и будет продемонстрировано в этом уроке.

Создайте проект основанный на диалоговом окне. Для этого проще всего воспользоваться AppWizard'ом (для создания EXE).

На первом шаге мастера в качестве типа приложения выберите тип Single Document, и уберите галочку для поддержки архитектуры Документ-Вид (зачем нам разные усложнения).

Далее до шага 4 оставляем все параметры по умолчанию. На шаге 4 уберите лишние галочки для панели инструментов и для строки состояния (Docking toolbar и Initial status bar), после чего можно сразу нажать на Finish.

После создания заготовки переходим к содержательной части нашего кода.

Создаем ресурс для нового диалогового окна. Для этого нажимаем Ctrl+R, выбираем среди ресурсов Dialog, нажимаем на кнопочку New. В редакторе диалога добавьте на него Edit.

Вызываем далее ClassWizard (Ctrl+W), в появившемся диалоговом окне выбираем радиокнопку Создать новый класс.

В качестве имени класса задаем CDlg, после чего закрываем окошко New Class и ClassWizard. Далее с помощью редактора меню добавляем новое меню (назовем его Dialog и добавим в меню File), и в его обработчик (созданный с помощью ClassWizard) вставляем следующий код:

void CMainFrame::OnFileDialog()
{
    // TODO: Add your command handler code here
    CDlg dlg(this);
    dlg.DoModal();
}

Не забудьте в начале этого файла добавить нужный include, чтобы компилятор не ругался, что он не знает, что такое CDlg:

...
#include "Dlg.h"
#include "MainFrm.h"
 ...

Обратите внимание, что это весь необходимый код для передачи данных в диалоговое окно и из него. Мы ничего не передаем ни до вызова DoModal(), ни после него. Также обратите внимание, что мы конструируем экземпляр нашего класса CDlg с параметром this. Тем самым мы передаем в dlg указатель на класс окна-рамки. Разумеется такой конструктор с параметром типа CMainFrame * должен существовать в классе CDlg. Добавьте его. Его реализация будет такой:

CDlg::CDlg(CMainFrame *pMainFrame):CDialog (IDD_DIALOG1, pMainFrame)
{
    m_pMainFrame=pMainFrame;
}

Обратите внимание, что для данного конструктора мы вызываем в том числе и конструктор базового класса CDialog.

Так как наш конструктор использует указатель на родительский класс, то его надо добавить (в заголовочный файл класса CDlg, разумеется):

...
#include "MainFrm.h" //Надо подключить
 ...
class CDlg : public CDialog
{
    ...
public:
    CDlg (CMainFrame* pMainFrame);
    CDlg(CWnd* pParent = NULL);   // standard constructor
    CMainFrame *m_pMainFrame;// Указатель на главное окно приложения
    ...

Теперь займемся данными. Добавьте в класс окна-рамки CMainFrame следующую переменную (в ней как раз и хранится большой объем данных, для которых мы не хотим делать копии в классе CDlg):

    ...
public:
    CString m_sBigData;
    ...

В конструкторе класса CMainFrame что-нибудь запишите в эту переменную:

CMainFrame::CMainFrame()
{
 // TODO: add member initialization code here
 m_sBigData="Большие данные";
}

Теперь займемся непосредственно обменом. Для этого добавьте в метод DoDataExchange класса CDlg вызов DDX_Text(...):

void CDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CDlg)
        // NOTE: the ClassWizard will add DDX and DDV calls here
    //}}AFX_DATA_MAP
    DDX_Text(pDX, IDC_EDIT1, m_pMainFrame->m_sBigData);
}

Что мы тут делаем? Мы осуществляем обмен между полем IDC_EDIT1 и переменной m_sBigData из класса окна-рамки, на которую указывает m_pMainFrame.

Запускайте программу и заходите в наше меню. В edit'е появится строка, взятая из окна рамки.

Если в нем напечатать что-нибудь другое, нажать на OK и затем вновь вызвать наше диалоговое окно, то будет уже новое значение.

Таким образом наша ссылка работает!

Наверх

Visual C++. MFC. Урок 26. Понятие об архитектуре Документ-Вид

Архитектура Документ-Вид означает приблизительно следующее. У вас есть один класс, который отвечает за данные, и второй класс, который отвечает за представление этих данных на экране. Таким образом эти два класса разделяют обязанности, и каждый отвечает за свою собственную часть работы. При этом у одного документа может быть несколько видов. Класс документа отвечает за такие вещи, как хранение данных, за сохранение их на диске и чтение с диска и др., класс же вида за представление данных на экране (прорисовка, обновление и т. п.).

Пример номер один - Word. Вы можете просматривать ваш файл в разных режимах (обычном, режиме структуры и т. п.). И документ при этом у вас тот же самый, только его виды будут различаться.

Пример номер два. Программа - часы. Она просто показывает время. Но при этом собственно данные (текущее время и т. п.) лучше хранить отдельно от представления их на экране (например, потому, что ваши часы вы можете показывать в разных видах - в виде часов со стрелками, в виде электронных часов с цифрами и т. п.).

Пример номер три. Представьте себе, что в документе вы имеете дело с окружностью. На экране вы можете представить ее разными способами - или в виде собственно окружности, или в виде формулы, или еще как-нибудь. Документ при этом у вас будет один, а видов у него может быть несколько.

Когда вы начинаете делать свое приложение с использованием AppWizard, то на шаге 1 мастера вы задаете, будет ли или нет использоваться архитектура Документ-Вид (это не относится к приложениям, основанным на диалоге).

В вашей программе класс документа - это потомок класса CDocument, а класс вида проиходит от класса CView непосредственно или через другие классы. Предка для вашего класса Вида вы можете выбрать на шаге 6 AppWizard'а.

Отметим, то CView - это оконный класс (потомок класса CWnd), а CDocument - нет.

Наверх

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

Copyright cайт progs.biz, 2002



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

В избранное