
// BKView.cpp : реализация класса CBKView
//

#include "stdafx.h"
// SHARED_HANDLERS можно определить в обработчиках фильтров просмотра реализации проекта ATL, эскизов
// и поиска; позволяет совместно использовать код документа в данным проекте.
#ifndef SHARED_HANDLERS
#include "BK.h"
#endif

#include "BKDoc.h"
#include "BKView.h"
#include "MainFrm.h"
#include "Screen.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CBKView

IMPLEMENT_DYNCREATE(CBKView, CView)

BEGIN_MESSAGE_MAP(CBKView, CView)
	// Стандартные команды печати
	ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CBKView::OnFilePrintPreview)
	ON_WM_CONTEXTMENU()
	ON_WM_RBUTTONUP()
	ON_WM_CREATE()
	ON_WM_SIZE()
	ON_WM_SETFOCUS()
	ON_WM_LBUTTONDOWN()
	ON_WM_ERASEBKGND()
END_MESSAGE_MAP()

// создание/уничтожение CBKView

CBKView::CBKView() :
	m_pscreen(NULL)
{
	m_rgnRes.CreateRectRgn(0, 0, 0, 0);
	m_br.CreateSysColorBrush(COLOR_BTNFACE);
}

CBKView::~CBKView()
{
	SAFE_DELETE(m_pscreen);
}

BOOL CBKView::PreCreateWindow(CREATESTRUCT &cs)
{
	// TODO: изменить класс Window или стили посредством изменения
	//  CREATESTRUCT cs
	cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
	cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_SAVEBITS,
	                                   ::LoadCursor(NULL, IDC_ARROW), HBRUSH(COLOR_WINDOW + 1), NULL);
	return CView::PreCreateWindow(cs);
}

// рисование CBKView

void CBKView::OnDraw(CDC * /*pDC*/)
{
	CBKDoc *pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	if (!pDoc)
	{
		return;
	}

	if (IsWindowVisible())
	{
		m_pscreen->DrawScreen(TRUE);
	}
}


// печать CBKView

void CBKView::OnFilePrintPreview()
{
#ifndef SHARED_HANDLERS
	AFXPrintPreview(this);
#endif
}

BOOL CBKView::OnPreparePrinting(CPrintInfo *pInfo)
{
	// подготовка по умолчанию
	return DoPreparePrinting(pInfo);
}

void CBKView::OnBeginPrinting(CDC * /*pDC*/, CPrintInfo * /*pInfo*/)
{
	// TODO: добавьте дополнительную инициализацию перед печатью
}

void CBKView::OnEndPrinting(CDC * /*pDC*/, CPrintInfo * /*pInfo*/)
{
	// TODO: добавьте очистку после печати
}

void CBKView::OnRButtonUp(UINT /* nFlags */, CPoint point)
{
	ClientToScreen(&point);
	OnContextMenu(this, point);
}

int CBKView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
	{
		return -1;
	}

	m_pscreen = new CScreen(g_Config.m_nScreenRenderType);

	if (m_pscreen == NULL)
	{
		return -1;
	}

	if (!m_pscreen->Create(NULL, _T("BKScreen"), WS_VISIBLE | WS_CHILD, CRect(0, 0, CScreen::BK_SCREEN_WIDTH, CScreen::BK_SCREEN_HEIGHT), this, 0))
	{
		TRACE0("Не удалось создать панель Screen View\n");
		return -1;      // не удалось создать
	}

	CMainFrame *pMF = reinterpret_cast<CMainFrame *>(GetParentFrame());

	if (pMF)
	{
		pMF->SetScreen(m_pscreen);
	}

	m_pscreen->AdjustLayout();
	return 0;
}

void CBKView::OnSize(UINT nType, int cx, int cy)
{
	CView::OnSize(nType, cx, cy);
	m_pscreen->AdjustLayout();
}

void CBKView::OnContextMenu(CWnd * /* pWnd */, CPoint point)
{
#ifndef SHARED_HANDLERS
	theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);
#endif
}


// диагностика CBKView

#ifdef _DEBUG
void CBKView::AssertValid() const
{
	CView::AssertValid();
}

void CBKView::Dump(CDumpContext &dc) const
{
	CView::Dump(dc);
}

CBKDoc *CBKView::GetDocument() const // встроена неотлаженная версия
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CBKDoc)));
	return (CBKDoc *)m_pDocument;
}
#endif //_DEBUG


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

void CBKView::OnSetFocus(CWnd *pOldWnd)
{
	CView::OnSetFocus(pOldWnd);
	m_pscreen->SetFocus();
	AfxGetMainWnd()->SetFocus();
}

void CBKView::OnLButtonDown(UINT nFlags, CPoint point)
{
	m_pscreen->SetFocus();
	AfxGetMainWnd()->SetFocus();
	CView::OnLButtonDown(nFlags, point);
}



BOOL CBKView::OnEraseBkgnd(CDC *pDC)
{
	CRect rcScreen;
	m_pscreen->GetClientRect(&rcScreen);
	m_pscreen->ClientToScreen(&rcScreen);
	ScreenToClient(&rcScreen);
	CRect rcClient;
	GetClientRect(&rcClient);
	CRgn rgnScreen;
	rgnScreen.CreateRectRgnIndirect(&rcScreen);
	CRgn rgnClient;
	rgnClient.CreateRectRgnIndirect(&rcClient);
	m_rgnRes.CombineRgn(&rgnClient, &rgnScreen, RGN_DIFF);
	pDC->SelectClipRgn(&m_rgnRes);
	CBrush *pOld = pDC->SelectObject(&m_br);
	pDC->PatBlt(0, 0, rcClient.Width(), rcClient.Height(), PATCOPY);
	pDC->SelectObject(pOld);
	return TRUE;
}
