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

Уроки по Visual C++ (MFC, платформа .NET)


Информационный Канал Subscribe.Ru

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

Рассылка №33

Visual C++. MFC. Урок 30. Архитектура Документ-Вид. Первая программа.

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

Visual C++. MFC. Урок 30. Архитектура Документ-Вид. Первая программа

В этом уроке мы с вами создадим первую программу на основе архитектуры Документ-Вид. Для этого нам понадобятся три класса - класс Вида (это будет потомок класса MFC CView), класс Документа (потомок CDocument) и класс окна-рамки (потомок CFrameWnd). После создания всех трех классов мы объединим их в методе InitInstance класса приложения.

Начинаем писать код. Создайте новый пустой проект типа Win32 Application. Не забудьте подсоединить библиотеку MFC (см. урок 2). Далее создайте меню. Его идентификатор можете оставить без изменений (IDR_MENU1) - сейчас это не важно. Подсоедините меню к нашему проекту (если забыли, то см. урок 14). Далее начинаем собственно писать код.

Пишем в окне кода три класса (Документа, Вида и окна-рамки):

#include <afxwin.h>
#include "resource.h"

//Класс Вида
class CMyView: public CView{
protected:
    CMyView(){};
    DECLARE_DYNCREATE(CMyView)
public:
    virtual void OnDraw(CDC *pDC);
};
IMPLEMENT_DYNCREATE(CMyView, CView)
void CMyView::OnDraw(CDC *pDC){
}
//Конец класса вида

//Класс окна-рамки
class CMyWnd: public CFrameWnd{
public:
    CMyWnd(){}
    DECLARE_DYNCREATE(CMyWnd)
};
IMPLEMENT_DYNCREATE(CMyWnd, CFrameWnd)
//Конец окна-рамки

//Класс документа
class CMyDoc: public CDocument{
protected:
    CMyDoc(){};
    DECLARE_DYNCREATE(CMyDoc)
public:
};
IMPLEMENT_DYNCREATE(CMyDoc, CDocument)
//Конец окна документа

Как вы видите, в этих классах ничего особенно интересного нет - в каждом есть конструктор (пустой). Кроме того в классе Вида мы добавляем виртуальную функцию OnDraw (с пустым телом).

Обратите также внимание на макросы DECLARE_DYNCREATE(...) и IMPLEMENT_DYNCREATE(..., ...). Мы их пишем для каждого класса. Они нужны для возможности создания объектов класса динамически во время выполнения программы. В частности, их надо вставить, если мы используем макрос RUNTIME_CLASS (а его мы будем использовать далее в этом уроке). Макрос DECLARE_DYNCREATE(...) берет в качестве параметра имя класса и помещается внутри него, макрос IMPLEMENT_DYNCREATE(..., ...) имеет два параметра - имя класса и его родителя и помещается в месте реализации класса (обычно в файле *.h, но мы весь код поместили в один файл).

Пишем код дальше. Добавляем еще один класс - потомок класса CWinApp и создаем его экземпляр (этот класс надо вставить после остальных):

class CMyApp: public CWinApp{
public:
    virtual BOOL InitInstance();
};
CMyApp theApp;

В этом классе нам надо написать реализацию виртуального метода InitInstance(). Для этого вставьте следующий код:

BOOL CMyApp::InitInstance(){
    CSingleDocTemplate *pDocTemplate;
    pDocTemplate=new CSingleDocTemplate(
        IDR_MENU1,
        RUNTIME_CLASS(CMyDoc),
        RUNTIME_CLASS(CMyWnd),
        RUNTIME_CLASS(CMyView)
        );
    AddDocTemplate(pDocTemplate);
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);
    if (!ProcessShellCommand(cmdInfo))
        return FALSE;
    m_pMainWnd->ShowWindow(SW_SHOW);
    return TRUE;
}
CMyApp theApp;

Давайте обсудим этот код (он самый существенный в этом уроке).

В строке

    ...
    CSingleDocTemplate *pDocTemplate;
    ...

мы создаем указатель на класс CSingleDocTemplate. Этот класс преднаначен для создания шаблонов документа (не путать с шаблонами языка C++ - это разные вещи). Документы эти принадлежат к SDI-приложениям (для MDI-приложений используется класс CMultiDocTemplate). Далее в строчках

    ...
    pDocTemplate=new CSingleDocTemplate(
        IDR_MENU1,
        RUNTIME_CLASS(CMyDoc),
        RUNTIME_CLASS(CMyWnd),
        RUNTIME_CLASS(CMyView)
        );
        ...

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

Далее в строке

    ...
    AddDocTemplate(pDocTemplate);
    ...

мы вызываем метод AddDocTemplate класса CWinApp для добавления созданного шаблона документа в нашем классе приложения.

В следующийх строчках

    ...
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);
    if (!ProcessShellCommand(cmdInfo))
        return FALSE;
    ...

мы извлекаем параметры командной строки (хотя у нашей программы таких параметров просто нет). Если не удается обработать параметры командной строки, то мы просто выходим.

И, наконец, в последних строчках

    ...
    m_pMainWnd->ShowWindow(SW_SHOW);
    return TRUE;
    ...

мы показываем наше окно и возвращаем результат (TRUE).

Теперь можете запускать программу и любоваться - мы создали первое приложение, основанное на архитектуре Документ-Вид.

Наверх

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

Copyright cайт progs.biz, 2002



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

В избранное