Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
20
Добавлен:
01.05.2014
Размер:
10.93 Кб
Скачать
// LabView.cpp : implementation of the CLabView class
//

#include "stdafx.h"
#include "Lab.h"

#include "LabDoc.h"
#include "LabView.h"
#include ".\labview.h"

#include <math.h>
#include "blend.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CLabView

IMPLEMENT_DYNCREATE(CLabView, CView)

BEGIN_MESSAGE_MAP(CLabView, CView)
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_COMMAND(ID_POINTS, OnPoints)
	ON_COMMAND(ID_LINES, OnLines)
	ON_COMMAND(ID_TRIANGLES, OnTriangles)
	ON_COMMAND(ID_QUADS, OnQuads)
	ON_COMMAND(ID_POLYGON, OnPolygon)
	ON_WM_SIZE()
	ON_WM_ERASEBKGND()
	ON_COMMAND(ID_SCISSOR_DISABLE, OnScissorDisable)
	ON_COMMAND(ID_SCISSOR_ENABLE, OnScissorEnable)
	ON_UPDATE_COMMAND_UI(ID_SCISSOR_ENABLE, OnUpdateScissorEnable)
	ON_UPDATE_COMMAND_UI(ID_SCISSOR_DISABLE, OnUpdateScissorDisable)
	ON_COMMAND(ID_ALPHA_ENABLE, OnAlphaEnable)
	ON_UPDATE_COMMAND_UI(ID_ALPHA_ENABLE, OnUpdateAlphaEnable)
	ON_COMMAND(ID_ALPHA_DISABLE, OnAlphaDisable)
	ON_UPDATE_COMMAND_UI(ID_ALPHA_DISABLE, OnUpdateAlphaDisable)
	ON_COMMAND(ID_BLEND_DISABLE, OnBlendDisable)
	ON_COMMAND(ID_BLEND_ENABLE, OnBlendEnable)
	ON_UPDATE_COMMAND_UI(ID_BLEND_DISABLE, OnUpdateBlendDisable)
	ON_UPDATE_COMMAND_UI(ID_BLEND_ENABLE, OnUpdateBlendEnable)
END_MESSAGE_MAP()

CLabView::CLabView()
: m_nShape(0)
, bScissor(FALSE)
, bAlpha(FALSE)
, bBlend(FALSE)
{ }

CLabView::~CLabView()
{ }

BOOL CLabView::PreCreateWindow(CREATESTRUCT& cs)
{
	cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN;

	return CView::PreCreateWindow(cs);
}

// CLabView drawing

void CLabView::OnDraw(CDC* pDC)
{
	CLabDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	wglMakeCurrent(pDC->m_hDC, m_hrc);
	
	switch (m_nShape)
	{
	case Black:
		DrawBlack();
		break;
	case Points:
		DrawPoint();
		break;
	case Lines:
		DrawLine();
		break;
	case Triangles:
		DrawTriangle();
		break;
	case Quads:
		DrawQuad();
		break;
	case Polygon:
		DrawPolygon();
		break;
	default:
		break;
	};

	wglMakeCurrent(NULL, NULL);
}

BOOL CLabView::OnEraseBkgnd(CDC* pDC)
{
	return TRUE;
}

// CLabView diagnostics

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

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

CLabDoc* CLabView::GetDocument() const // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLabDoc)));
	return (CLabDoc*)m_pDocument;
}
#endif //_DEBUG

// CLabView message handlers

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

    CClientDC dc(this);
    
	PIXELFORMATDESCRIPTOR pfd;

	memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
	pfd.nSize		= sizeof(PIXELFORMATDESCRIPTOR);
	pfd.nVersion	= 1;
	pfd.dwFlags		= PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
	pfd.iPixelType	= PFD_TYPE_RGBA;
	pfd.cColorBits	= 24;
	pfd.cDepthBits	= 32;
	pfd.iLayerType	= PFD_MAIN_PLANE ;

	int		nPixelFormat	= ChoosePixelFormat(dc.m_hDC, &pfd);

	if (nPixelFormat == 0)
		return -1;

	BOOL	bResult			= SetPixelFormat(dc.m_hDC, nPixelFormat, &pfd);

	if (!bResult)
		return -1;
	
	m_hrc = wglCreateContext(dc.m_hDC);

	if (!m_hrc)
		return -1;

	return 0;
}

void CLabView::OnDestroy()
{
	CView::OnDestroy();

	wglDeleteContext(m_hrc);
}

void CLabView::OnPoints()
{
	m_nShape = Points;
	Invalidate();
}

void CLabView::OnLines()
{
	m_nShape = Lines;
	Invalidate();
}

void CLabView::OnTriangles()
{
	m_nShape = Triangles;
	Invalidate();
}

void CLabView::OnQuads()
{
	m_nShape = Quads;
	Invalidate();
}

void CLabView::OnPolygon()
{
	m_nShape = Polygon;
	Invalidate();
}

void CLabView::OnInitialUpdate()
{
	CView::OnInitialUpdate();

	CClientDC dc(this);

	wglMakeCurrent(dc.m_hDC, m_hrc);
	glClearColor(0.0, 0.0, 0.0, 0.0);
	wglMakeCurrent(NULL, NULL);
}

void CLabView::OnScissorDisable()
{
	bScissor = FALSE;

	CClientDC dc(this);

	wglMakeCurrent(dc.m_hDC, m_hrc);
	glDisable(GL_SCISSOR_TEST);
	Invalidate();
	wglMakeCurrent(NULL, NULL);
}
void CLabView::OnScissorEnable()
{
	bScissor = TRUE;
	
	CClientDC dc(this);

	wglMakeCurrent(dc.m_hDC, m_hrc);
	glEnable(GL_SCISSOR_TEST);
	DrawBlack();
	glScissor(200, 150, 200, 375);
	Invalidate();
	wglMakeCurrent(NULL, NULL);
}

void CLabView::OnAlphaEnable()
{
	bAlpha = TRUE;


	CClientDC dc(this);
	wglMakeCurrent(dc.m_hDC, m_hrc);
	glEnable(GL_ALPHA_TEST);
	glAlphaFunc(GL_LESS, 0.8f);
	Invalidate();
	wglMakeCurrent(NULL, NULL);
}

void CLabView::OnUpdateScissorEnable(CCmdUI *pCmdUI)
{
	if (bScissor)
		pCmdUI->Enable(FALSE);
	else
		pCmdUI->Enable(TRUE);
}

void CLabView::OnUpdateScissorDisable(CCmdUI *pCmdUI)
{
	if (!bScissor)
		pCmdUI->Enable(FALSE);
	else
		pCmdUI->Enable(TRUE);
}

void CLabView::OnSize(UINT nType, int cx, int cy)
{
	CView::OnSize(nType, cx, cy);

	if (cx <= 0 || cy <= 0)
		return;

	CClientDC dc(this);

	BOOL bResult = wglMakeCurrent(dc.m_hDC, m_hrc);

	if (!bResult)
		return;
	
	glViewport(0, 0, cx, cx);

	wglMakeCurrent(NULL, NULL);
}
void CLabView::DrawBlack(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glFlush();
}
void CLabView::DrawPoint(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	
	GLdouble x;
	GLdouble y;
	GLdouble angle;

	glPointSize(2);
	glBegin(GL_POINTS);
		glColor4d(0, 1, 0, 0.4);
		for (int i = 0; i < 250; i++)
		{
			angle = 3.14 * i / 25;
			x	= cos(angle) + cos(angle/5)*2 ;
			y	= sin(angle) - sin(angle/5)*2 ;

			glVertex4d(x , y - 1.7 , 0, 5);
		};				 
	glEnd();

	glFlush();
}

void CLabView::DrawLine(void)
{
//	GLdouble x, y, angle, t = 0.0;
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glBegin(GL_LINES);
		glColor3d(1.0, 11.0, 0.0);
		glVertex2d(-0.6,  -0.2);
		glVertex2d(0.6,  -0.2);
	glEnd();
	
	glEnable(GL_LINE_STIPPLE);
	glLineStipple(3, 0x1C47);
	glBegin(GL_LINES);
		glColor3d(0.0, 0.0, 1.0);
		glVertex2d( -0.6,  0.1);
		glVertex2d( 0.6,  0.1);
	glEnd();
	glDisable(GL_LINE_STIPPLE);

	glLineWidth(3);
	glEnable(GL_LINE_STIPPLE);
	glLineStipple(2, 0x1C47);
	glBegin(GL_LINE_STRIP);
		glColor4d(1.0, 0.0, 1.0, 0.5);
		glVertex2d( -0.6, 0.0);
		glColor4d(0.0, 1.0, 0.0, 0.5);
		glVertex2d(-0.4, -0.1);
		glVertex2d( -0.2, 0.0);
		glColor4d(0.0, 0.0, 1.0, 0.5);
		glVertex2d(0.0, -0.1);
		glColor4d(1.0, 0.0, 0.0, 0.5);
		glVertex2d( 0.2, 0.0);
		glColor4d(1.0, 0.0, 1.0, 0.5);
		glVertex2d( 0.4, -0.1);
		glColor4d(1.0, 1.0, 0.0, 0.5);
		glVertex2d( 0.6, 0.0);
	glEnd();
	glDisable(GL_LINE_STIPPLE);

	glLineWidth(2);
	glEnable(GL_LINE_SMOOTH);
	glLineStipple(1, 0xE3F8);

	glBegin(GL_LINE_LOOP);
		glColor4d(0.0, 1.0, 0.0, 0.5);
		glVertex2d(-0.8, -0.4);
		glVertex2d( 0.8, -0.8);
		glColor4d(0.0, 0.0, 1.0, 0.5);
		glVertex2d( 0.8, -0.4);
		glColor4d(1.0, 0.0, 0.0, 0.5); 
		glVertex2d( -0.8, -0.8);
	glEnd();

	glDisable(GL_LINE_SMOOTH);

	glFlush();
}

void CLabView::DrawTriangle(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
	glBegin(GL_TRIANGLES);
		glColor3d(0.1, 0.5, 1.0);
		glVertex2d(-0.7,  0.0);
		glVertex2d(-0.4, -0.2);
		glVertex2d(-0.9,  -0.6);
	glEnd();

	glLineWidth(4);
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	glBegin(GL_TRIANGLES);
		glColor3d(0.0, 1.0, 0.0);
		glVertex2d(-0.4,  0.1);
		glVertex2d(0.2, -0.1);
		glVertex2d(-0.2,  -0.2);
	glEnd();

	glLineWidth(2);
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	glBegin(GL_TRIANGLE_STRIP);
		glColor3d(0.0, 1.1, 1.0);
		glVertex2d( 0.7, -0.3);
		glVertex2d( 0.5, -0.6);
		glVertex2d( 0.3, -0.4);
		glVertex2d( 0.3, -0.9);
		glVertex2d( 0.2, -0.4);
	glEnd();

	glBegin(GL_TRIANGLE_FAN);
		glColor3d(0.0, 1.1, 0.3);
	glVertex2d(-0.5, -0.6);
		glVertex2d(-0.3, -0.8);
		glVertex2d(-0.1, -0.6);
		glColor3d(0.2, 1.1, 0.3);
	glVertex2d(-0.3, -0.3);
		glColor3d(0.8, 0.9, 0.3);
		glVertex2d(-0.3, -0.6);
	glEnd();


	glFlush();
}

void CLabView::DrawQuad(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glLineWidth(2);
	glLineStipple(1, 0x0101);
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	glBegin(GL_QUADS);
		glColor4d(1.0, 2.1, 1.0, 0.3);
		glVertex2d(-0.4,  0.1);
		glVertex2d(0.4,  0.0);
		glVertex2d(0.4, -0.4);
		glVertex2d(-0.4, -0.3);
	glEnd();
	glDisable(GL_LINE_STIPPLE);

	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
	glBegin(GL_QUADS);
		glColor4d(0.0, 0.0, 1.0, 2.3);
		glVertex2d(0.8,  -0.5);
		glVertex2d(0.4,  -0.6);
		glColor4d(0.0, 1.0, 0.0, 2.3);
		glVertex2d(0.4, -0.9);
		glVertex2d(0.7, -0.9);
		glColor4d(1.0, 0.0, 0.0, 2.3);
		glVertex2d(0.2, -0.2);
	glEnd();
	glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	glBegin(GL_QUAD_STRIP);
		glColor4d(1.0, 0.0, 0.0, 0.8);
		glVertex2d(-0.6, -0.9);  
		glVertex2d(-0.8, -0.5);  
		glColor4d(1.0, 1.0, 0.0, 0.1);
		glVertex2d(-0.4, -0.9); 
		glVertex2d(-0.4, -0.5);  
		glColor4d(1.0, 1.0, 1.0, 0.1);
		glVertex2d(-0.2, -0.8);
		glVertex2d(-0.1, -0.5);
		glColor4d(0.0, 0.0, 1.0, 0.1);
		glVertex2d(0.2, -0.8);
		glVertex2d(0.1, -0.5);
	glEnd();
	
	glFlush();
}

void CLabView::DrawPolygon(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);

	glBegin(GL_POLYGON);
		glColor4d(1.0, 0.0, 0.0, 0.7);
		glVertex2d(0.0,  0.0);
		glVertex2d( 0.4,  -0.35);
		glColor4d(0.0, 1.0, 0.0, 0.7);
		glVertex2d( 0.25, -0.8);
		glVertex2d( -0.25, -0.8);
		glColor4d(0.0, 0.0, 1.0, 0.7);
		glVertex2d(-0.4, -0.35);
	glEnd();
	glDisable(GL_POLYGON_STIPPLE);

	glFlush();
}

void CLabView::OnUpdateAlphaEnable(CCmdUI *pCmdUI)
{
	if (bAlpha)
		pCmdUI->Enable(FALSE);
	else
		pCmdUI->Enable(TRUE);
}

void CLabView::OnAlphaDisable()
{
	bAlpha = FALSE;

	CClientDC dc(this);
	wglMakeCurrent(dc.m_hDC, m_hrc);
	glDisable(GL_ALPHA_TEST);
	Invalidate();
	wglMakeCurrent(NULL, NULL);	
}

void CLabView::OnUpdateAlphaDisable(CCmdUI *pCmdUI)
{
	if (!bAlpha)
		pCmdUI->Enable(FALSE);
	else
		pCmdUI->Enable(TRUE);
}

void CLabView::OnBlendDisable()
{
	bBlend = FALSE;

	CClientDC dc(this);
	wglMakeCurrent(dc.m_hDC, m_hrc);
	glDisable(GL_BLEND);
	Invalidate();
	wglMakeCurrent(NULL, NULL);
}

void CLabView::OnBlendEnable()
{
	CBlend dlg;

	if (dlg.DoModal() == IDCANCEL)
		return;

	bBlend = TRUE;

	CClientDC dc(this);
	wglMakeCurrent(dc.m_hDC, m_hrc);
	glEnable(GL_BLEND);
	glBlendFunc(dlg.m_nSF, dlg.m_nDF);
	Invalidate();
	wglMakeCurrent(NULL, NULL);
}

void CLabView::OnUpdateBlendDisable(CCmdUI *pCmdUI)
{
	if (!bBlend)
		pCmdUI->Enable(FALSE);
	else
		pCmdUI->Enable(TRUE);
}

void CLabView::OnUpdateBlendEnable(CCmdUI *pCmdUI)
{
	if (bBlend)
		pCmdUI->Enable(FALSE);
	else
		pCmdUI->Enable(TRUE);
}
Соседние файлы в папке Лабораторная работа №21