// SprView.cpp: файл реализации
//

#include "stdafx.h"
#include "SprView.h"


// CSprView

IMPLEMENT_DYNAMIC(CSprView, CScrollView)

CSprView::CSprView(BYTE *buffer, size_t size) :
	m_pBuffer(buffer),
	m_nBufSize(size),
	m_pScreen(NULL),
	m_cx(0),
	m_cy(0),
	m_scale(1)
{
}

CSprView::~CSprView()
{
	if (m_pScreen)
	{
		delete m_pScreen;
	}
}

BEGIN_MESSAGE_MAP(CSprView, CScrollView)
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_WM_DESTROY()
END_MESSAGE_MAP()



// обработчики сообщений CSprView

void CSprView::OnDestroy()
{
	if (m_pScreen)
	{
		m_pScreen->DestroyWindow();
	}

	CScrollView::OnDestroy();
}

int CSprView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CScrollView::OnCreate(lpCreateStruct) == -1)
	{
		return -1;
	}

	SetScrollSizes(MM_TEXT, CSize(m_cx, m_cy));
	EnableScrollBarCtrl(SB_HORZ, FALSE);
	m_pScreen = new CSprScr(m_pBuffer, m_nBufSize);

	if (m_pScreen)
	{
		m_pScreen->SetScale(m_scale);

		if (!m_pScreen->Create(NULL, _T("BKScreen"), WS_VISIBLE | WS_CHILD, CRect(0, 0, m_cx, m_cy), this, 0))
		{
			TRACE0("Не удалось создать экран\n");
			return -1; // не удалось создать
		}
	}

	return 0;
}

BOOL CSprView::PreCreateWindow(CREATESTRUCT &cs)
{
	// TODO: добавьте специализированный код или вызов базового класса
	cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
	m_cx = cs.cx;
	m_cy = cs.cy;
	return CScrollView::PreCreateWindow(cs);
}

void CSprView::OnSize(UINT nType, int cx, int cy)
{
	CScrollView::OnSize(nType, cx, cy);
	m_cx = cx;
	m_cy = cy;
	int s_cx = m_cx / m_scale;
	s_cx &= ~7;

	if (s_cx == 0)
	{
		s_cx = 8;
		m_cx = s_cx * m_scale;
	}

	int nTotalPixels = (int)m_nBufSize * 8;
	int s_cy = nTotalPixels / s_cx;

	while (nTotalPixels > s_cx * s_cy)
	{
		s_cy++;
	}

	m_pScreen->AdjustLayout(s_cx * m_scale, s_cy * m_scale, GetScrollPos(SB_VERT));
	SetScrollSizes(MM_TEXT, CSize(s_cx * m_scale, s_cy * m_scale));
	EnableScrollBarCtrl(SB_HORZ, FALSE);
}

void CSprView::OnDraw(CDC *pDC)
{
	if (m_pScreen)
	{
		m_pScreen->DrawScreen();
	}
}

void CSprView::SetScale(int scale)
{
	if (m_scale != scale)
	{
		m_scale = scale;

		if (m_pScreen)
		{
			m_pScreen->SetScale(scale);
		}
	}
}

