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 руб./мес


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




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

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).

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