| Главная | Новости | Статьи | Книги | Ссылки |
В этом разделе рассматривается программа использующая MDI ( интерфейс многих документов )
Мы создадим программу, в которой документом является графическое изображение - круг. В ToolBar будет создана иконка, при нажатие на которою будет вызываться диалоговое окно, позволяющее изменять координаты круга. Местоположение круга можно будет согранять в файл с расширением CIR.
class CMDIDoc : public CDocument {
protected:
// create from serialization only CMDIDoc();
DECLARE_DYNCREATE(CMDIDoc) // Attributes public:
int m_X; // координаты круга по x int m_Y;
// координаты круга по y
// Operations ... ... 4. Объявляем элементы данных класса представления. Их будет тоже два : координаты круга по X и по Y. Для этого открываем файл CMDIView.h и изменяем объявление класса CMDIView следующим образом:
class CMDIView : public CView {
protected:
// create from serialization only CMDIView();
DECLARE_DYNCREATE(CMDIView) // Attributes public:
CMDIDoc* GetDocument();
int m_X; // координаты круга по x
int m_Y; // координаты круга по y
// Operations ... ... Как вы видите, имена переменных могут совпадать( обычно так и делается ).
BOOL CMDIDoc::OnNewDocument() {
if (!CDocument::OnNewDocument()) return FALSE;
m_X = 100; // начальное положение по X=100
m_Y = 100; // начальное положение по Y=100
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
} 6. Инициализируем элементы данных класса представления. Для этого нужно создать функцию-элемент OnInitialUpdate() класса представления: Class neme : CMDIView Object ID : CMDIView Message : OnInitialUpdateи нажмите на кнопку Add Function
void CMDIView::OnInitialUpdate() {
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or
call the base class
CMDIDoc* pDoc = GetDocument();
// получить указатель на документ
// обновить элементы данных представления
// соответствующими значениями документа.
m_X = pDoc->m_X;
m_Y = pDoc->m_Y;
pDoc->SetTitle("ANDY");
// всем документам даётся название ANDY
} 7. Теперь напишем код для вывода круга на экран.
void CMDIView::OnDraw(CDC* pDC) {
CMDIDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->Ellipse(m_X - 20, m_Y - 20, m_X + 20, m_Y + 20);
// рисуем круг диаметром 20
} 8. Напишем код для сохранения и считывания данных из файла.
void CMDIDoc::Serialize(CArchive& ar) {
if (ar.IsStoring()) {
// TODO: add storing code here( это выполняется, если выбрать SAVE )
ar<<m_X; // записываем m_X в выбранный файл
ar<<m_Y; // записываем m_Y в выбранный файл
}
else {
// TODO: add loading code here ( это выполняется, если выбрать OPEN )
ar>>m_X; // считываем значение из выбранного файла в m_X
ar>>m_Y; // считываем значение из выбранного файла в m_Y
}
} 9. Часто бывает нужно изменить некоторые параметры программы, такие как заголовок главного окна или тип файла по умолчанию, который выводится в диалоговых панелях SAVE и OPEN. Для этого нужно выбрать закладку ResourceView и открыть пункт String Table. Вы увидите список переменных проекта( три колонки : ID, Value и Caption ).
void CMDIView::OnMybutton() {
// TODO: Add your command handler code here
CMDIDoc* pDoc = GetDocument(); // получаем указатель на документ
CMyDialog MyD; // создаём переменную класса CMyDialog
MyD.m_DX = MyD.m_DXN = pDoc->m_X; // инициализмруем переменные диалога
MyD.m_DY = MyD.m_DYN = pDoc->m_Y; // MyD.DoModal();
// создаём новый диалог
pDoc->m_X = MyD.m_DXN;
// получаем новые значения
pDoc->m_Y = MyD.m_DYN;
// OnInitialUpdate();
// синхронизируем данные
Invalidate( TRUE );
// перерисовываем экран( вызов OnDraw() )
pDoc->SetModifiedFlag(); // ставим флаг изменения документа
}