Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №21 / LabView
.cpp// 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