http://tikitak.narod.ru ---- Главная страница сайта
Шаг 24 - Несколько видов для документа
Создание проекта
Этот проект демонстрирует наиболее эффектную сторону технологии документ-вид.
Используем предыдущие проект.
Создаем код
Добавляем описание для класса разделителя
#include "afxwin.h"
#include "afxext.h"
................
Создаем еще один класс просмотра
class CNewView : public CView
{
protected:
CNewView();
DECLARE_DYNCREATE(CNewView)
public:
void OnDraw(CDC* pDC);
CMyDoc* GetDocument();
};
CMyDoc* CNewView::GetDocument()
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
return (CMyDoc*)m_pDocument;
}
void CNewView::OnDraw(CDC* pDC)
{
CMyDoc* tempDoc=GetDocument();
pDC->SetTextColor(RGB(255,0,0));
pDC->TextOut(10,10,tempDoc->GetDate());
}
IMPLEMENT_DYNCREATE(CNewView, CView)
CNewView::CNewView()
{
}
Добавляем описания класса и процура для создаия раздедлителя.
class CMainFrame : public CFrameWnd
{
........
public:
virtual BOOL OnCreateClient( LPCREATESTRUCT lpcs,
CCreateContext* pContext );
private:
CSplitterWnd m_wndSplitter;
};
Реализация
BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT lpcs, CCreateContext* pContext )
{
ASSERT(m_wndSplitter.CreateStatic(this,1,2));
ASSERT(m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMyView),
CSize(100,50),pContext));
ASSERT(m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CNewView),
CSize(100,50),pContext));
SetActiveView((CView*)m_wndSplitter.GetPane(0,1));
return TRUE;
}
Описание
Описания класса разделителя нет в afxwin.h. Поэтому мы и подключили afxext.h где он есть. Логично?
Создали второй класс просмотра он совершенно аналогичен CMyView за исключением функции рисования. В ней текст выводится красным цветом.
Для использования обьявляем в классе рамки окна, обьект класса разделитель
CSplitterWnd m_wndSplitter;
OnCreateClient функция ответственна за создание клиента рамки окна, т.е. внутреннего наполения рамки. Вот мы и устанавливаем наполнения как создаем разделитель m_wndSplitter.CreateStatic(this,1,2), который вставляется в рамку (this) и состоит из двух частей 1,2.
К каждой части превязываем просмотр m_wndSplitter.CreateView, указывая класс просмотра , размер и т.д.
В самом конце устанавливаем номер активной панели и сообщаем MFC о успешности нашей работы.
Соберайте и запускайте. Две панели с текстом разного цвета. Выберите пунк меню About и текст поменяется сразу в двух панелях.
А теперь фантазию надо применить. Где это используеться. В Excel точно для просмотра частей таблицы, можно графику просматривать с разными масштабами и т.д.
Шпаргалка
Включить дополнения
#include "afxext.h"
Включить описание класса разделителя в класс рамки окна
class CMainFrame : public CFrameWnd
{
........
CSplitterWnd m_wndSplitter;
};
Создать классы видов сколько вы хотите.
Переопределить функцию OnCreateClient
class CMainFrame : public CFrameWnd
{
public:
virtual BOOL OnCreateClient( LPCREATESTRUCT lpcs,
CCreateContext* pContext );
...........
};
И реализовать разделители
BOOL CMainFrame::OnCreateClient( LPCREATESTRUCT lpcs, CCreateContext* pContext )
{
ASSERT(m_wndSplitter.CreateStatic(this,1,2));
ASSERT(m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMyView),
CSize(100,50),pContext));
..............
SetActiveView((CView*)m_wndSplitter.GetPane(0,1));
return TRUE;
}
Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|