http://tikitak.narod.ru ---- Главная страница сайта
Шаг 21 - Минимальный проект докумен-вид
Создание проекта
Лучше создать новый проект Win32 с использованием MFC. Можете оставить старый, но для этого необходимо удалить всё. Вообщем рекомендую создать новый с именем Apps. Не забудьте подключить MFC, как статическую библиотеку.
AppWizard Создает код, который интенсивно обращается к ресурсам. Обращение к ним происходит на основе имен. И если мы его эмулируем, то должны пользоваться теми же именами.
В проект должно быть три файла - CPP,RC,Resource.h. Последний создается сам, при создании файла RC. Я рекомедную его включить через Add File to Project после создания файла ресурсов.
Создаем файл ресурсов и в нем меню с идентификатором IDR_MAINFRAME и строковым ресурсом AFX_IDS_UNTITLED, он испозуется для задания имени приложения в левом верхнем углу. Если его не будет, то при выполнении вы получите сообщение об ошибке.
В реализации MFC есть код
void CSingleDocTemplate::SetDefaultTitle(CDocument* pDocument)
{
CString strDocName;
if (!GetDocString(strDocName, CDocTemplate::docName) ||
strDocName.IsEmpty())
{
VERIFY(strDocName.LoadString(AFX_IDS_UNTITLED));
}
pDocument->SetTitle(strDocName);
}
Это проверка установки имени документа по умолчанию на основе строкового ресурса AFX_IDS_UNTITLED.
CFrameWnd* CDocTemplate::CreateNewFrame(CDocument* pDoc, CFrameWnd* pOther)
{
if (pDoc != NULL)
ASSERT_VALID(pDoc);
ASSERT(m_nIDResource != 0);// Здесь передается число и
//если этого ресурса нет то ошибка
При создании рамки окна проверяется наличие ресуса с именем IDR_MAINFRAME
Создаем код
#include "afxwin.h"
#include "resource.h" // идентификаторов подключение ресурсов
class CMyView : public CView // класс просмотр
{
protected:
CMyView();
DECLARE_DYNCREATE(CMyView)
public:
virtual void OnDraw(CDC* pDC);
};
void CMyView::OnDraw(CDC* pDC) // она для отрисовки просмотра
{
}
IMPLEMENT_DYNCREATE(CMyView, CView)
CMyView::CMyView()
{
}
class CMainFrame : public CFrameWnd // класс рамки окна
{
protected:
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)
public:
};
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
CMainFrame::CMainFrame()
{
}
class CMyDoc : public CDocument // класс документа
{
protected:
CMyDoc();
DECLARE_DYNCREATE(CMyDoc)
public:
};
IMPLEMENT_DYNCREATE(CMyDoc, CDocument)
CMyDoc::CMyDoc()
{
}
class CStep2App : public CWinApp
{
public:
CStep2App();
virtual BOOL InitInstance();
};
BOOL CStep2App::InitInstance()
{
CSingleDocTemplate* pDocTemplate; // новый шаблон
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME, // идентификатор меню
RUNTIME_CLASS(CMyDoc), // документ
RUNTIME_CLASS(CMainFrame), // рамка окна
RUNTIME_CLASS(CMyView)); // просмотр
AddDocTemplate(pDocTemplate); // добавить шаблон
CCommandLineInfo cmdInfo; // Класс команд
ParseCommandLine(cmdInfo); // разбор командной строки
if (!ProcessShellCommand(cmdInfo)) // запуск команд на выполнение
return FALSE;
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
CStep2App::CStep2App()
{
}
CStep2App theApp;
Описание
Идеалогия программирования в MFC заключается в концепции документ вид. Идея здесь в следующем. У вас есть класс отвечающий за состояние памяти, им пользуются классы отвечающие за отображение. Например у вас есть данные с координатами деталей, а вы хотите просматривать проекции. Можно создать несколько классов просмотров для проекций.
Для шаблона документа CSingleDocTemplate необходим идентификатор меню и указатели на три класса. Это шаблон для приложений SDI, т.е. с одним документом в окне.
Класс просмотра CView. Класс документа CDocument. Класс рамки окна CFrameWnd. Созданный шаблон добавляется функцией AddDocTemplate, а вообще шаблонов может быть несколько!!!.
Следующие функции запускают на выполнение ряд команд. Создать новый документ и т.д.
Если что-то непонятно, это не страшно в следующих шагах положение изменится. Я считаю, что лучше раз испытать, чем слушать, и верояно на примерах понятнее.
Мы с Вами создали код очень близкий к коду AppWizard. И к нему мы будем приближаться.
Что будет происходить? При запуске будет сгенирирован шаблон на основе классов рамки,вида,документа. И при запуске процессор команд выполнит функцию Новый документ. После этого окно будет показано.
Шпаргалка
Создать классы документа , вида , рамки окна.
class CMyDoc : public CDocument
.........
class CMyView : public CView
..........
class CMainFrame : public CFrameWnd
...................
Создать и добавить шаблон документа
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CMyView));
AddDocTemplate(pDocTemplate);
Запустить интерпритатор команд для создания документа
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if (!ProcessShellCommand(cmdInfo))
return FALSE;
Не забыть про ресурсы
IDR_MAINFRAME
AFX_IDS_UNTITLED
Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|