Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №12 / GLlab / GLlabView
.cpp// GLlabView.cpp : implementation of the CGLlabView class
//
#include "stdafx.h"
#include "GLlab.h"
#include "GLlabDoc.h"
#include "GLlabView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGLlabView
IMPLEMENT_DYNCREATE(CGLlabView, CView)
BEGIN_MESSAGE_MAP(CGLlabView, CView)
//{{AFX_MSG_MAP(CGLlabView)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_COMMAND(ID_DRAW_LINESTRIP, OnDrawLinestrip)
ON_UPDATE_COMMAND_UI(ID_DRAW_LINESTRIP, OnUpdateDrawLinestrip)
ON_COMMAND(ID_DRAW_POINTS, OnDrawPoints)
ON_UPDATE_COMMAND_UI(ID_DRAW_POINTS, OnUpdateDrawPoints)
ON_COMMAND(ID_DRAW_QUADRILATERALS, OnDrawQuadrilaterals)
ON_UPDATE_COMMAND_UI(ID_DRAW_QUADRILATERALS, OnUpdateDrawQuadrilaterals)
ON_COMMAND(ID_DRAW_TRIANGLEFAN, OnDrawTrianglefan)
ON_UPDATE_COMMAND_UI(ID_DRAW_TRIANGLEFAN, OnUpdateDrawTrianglefan)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGLlabView construction/destruction
CGLlabView::CGLlabView()
{
// TODO: add construction code here
}
CGLlabView::~CGLlabView()
{
}
BOOL CGLlabView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.style |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CGLlabView drawing
void CGLlabView::OnDraw(CDC* pDC)
{
CGLlabDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
wglMakeCurrent(pDC->m_hDC, m_hRC);
DrawWithOpenGL();
wglMakeCurrent(pDC->m_hDC, NULL);
}
/////////////////////////////////////////////////////////////////////////////
// CGLlabView printing
BOOL CGLlabView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CGLlabView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CGLlabView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CGLlabView diagnostics
#ifdef _DEBUG
void CGLlabView::AssertValid() const
{
CView::AssertValid();
}
void CGLlabView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CGLlabDoc* CGLlabView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGLlabDoc)));
return (CGLlabDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CGLlabView message handlers
int CGLlabView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), // Structure size.
1, // Structure version number.
PFD_DRAW_TO_WINDOW | // Property flags.
PFD_SUPPORT_OPENGL,
PFD_TYPE_RGBA,
24, // 24-bit color.
0, 0, 0, 0, 0, 0, // Not concerned with these.
0, 0, 0, 0, 0, 0, 0, // No alpha or accum buffer.
32, // 32-bit depth buffer.
0, 0, // No stencil or aux buffer.
PFD_MAIN_PLANE, // Main layer type.
0, // Reserved.
0, 0, 0 // Unsupported.
};
CClientDC clientDC(this);
int pixelFormat =
ChoosePixelFormat(clientDC.m_hDC, &pfd);
BOOL success =
SetPixelFormat(clientDC.m_hDC, pixelFormat, &pfd);
m_hRC = wglCreateContext(clientDC.m_hDC);
return 0;
}
void CGLlabView::OnDestroy()
{
CView::OnDestroy();
// TODO: Add your message handler code here
wglDeleteContext(m_hRC);
}
void CGLlabView::OnDrawLinestrip()
{
// TODO: Add your command handler code here
m_shape = LineStrip;
Invalidate();
}
void CGLlabView::OnUpdateDrawLinestrip(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if (m_shape == LineStrip)
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
void CGLlabView::OnDrawPoints()
{
// TODO: Add your command handler code here
m_shape = Points;
Invalidate();
}
void CGLlabView::OnUpdateDrawPoints(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if (m_shape == Points)
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
void CGLlabView::OnDrawQuadrilaterals()
{
// TODO: Add your command handler code here
m_shape = Quads;
Invalidate();
}
void CGLlabView::OnUpdateDrawQuadrilaterals(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if (m_shape == Quads)
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
void CGLlabView::OnDrawTrianglefan()
{
// TODO: Add your command handler code here
m_shape = TriangleFan;
Invalidate();
}
void CGLlabView::OnUpdateDrawTrianglefan(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if (m_shape == TriangleFan)
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
void CGLlabView::DrawWithOpenGL()
{
glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //Белый цвет фона
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f, 0.0f, 0.0f);
GLint Width=512,Height=512;
glViewport(0,0,Width,Height);
switch(m_shape)
{
case Points : DrawPoints(); break;
case LineStrip : DrawLineStrip(); break;
case TriangleFan : DrawTriangleFan(); break;
case Quads : DrawQuads(); break;
}
glFlush();
}
//Рисуем точки
void CGLlabView::DrawPoints()
{
GLfloat ps[2];
glGetFloatv(GL_POINT_SIZE_RANGE, ps);
glPointSize(20);
glEnable(GL_POINT_SMOOTH);
glBegin(GL_POINTS);
glColor3d(1,0,0);
glVertex2f(0.0f, 0.0f); //Первая вершина
glColor3d(1,1,0);
glVertex2f(0.75f, 0.75f); //Вторая вершина
glColor3d(0,1,1);
glVertex2f(-0.75f, -0.75f);//Третья вершина
glColor3d(1,0,1);
glVertex2f(-0.75f, 0.75f);//Четвертая вершина
glColor3d(0,0,1);
glVertex2f(0.75f, -0.75f);//Пятая вершина
glEnd();
glDisable(GL_POINT_SMOOTH);
}
//Рисуем линии
void CGLlabView::DrawLineStrip()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //Черный цвет фона
glClear(GL_COLOR_BUFFER_BIT);
glPointSize(20);
glEnable(GL_SMOOTH);
glBegin(GL_LINE_STRIP);
glColor3f(1.0,0.0,0.0);
glVertex2f(-0.8f, -0.8f); //Первая вершина
glColor3f(1.0,1.0,0.0);
glVertex2f(0.0f, 0.0f); //Вторая вершина
glColor3f(1.0,0.0,1.0);
glVertex2f(-0.8f, 0.8f);//Третья вершина
glColor3f(0.0,1.0,0.0);
glVertex2f(0.75f, 0.75f);//Четвертая вершина
glColor3f(0.0,0.0,1.0);
glVertex2f(0.75f, -0.75f);//Пятая вершина
glEnd();
glDisable(GL_SMOOTH);
}
//Рисуем треугольники
void CGLlabView::DrawTriangleFan()
{ glEnable(GL_FLAT);
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glBegin(GL_TRIANGLE_FAN);
glColor3f(1.0,1.0,0.0);
glVertex2f(0.0f, 0.0f);
glVertex2f(-0.8f, -0.8f);
glVertex2f(-0.8f, 0.8f); //Первый треугольник
glColor3f(0.0,0.0,1.0);
glVertex2f(0.5f, 1.0f); //Второй треугольник
glColor3f(0.0,1.0,0.0);
glVertex2f(1.0f, 0.0f);
glEnd();
glDisable(GL_FLAT);
}
//Рисуем квадраты
void CGLlabView::DrawQuads()
{
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
glBegin(GL_QUADS);
glColor3f(0.0,0.0,0.0);
glVertex2f(-0.7f, -0.7f);
glVertex2f(0.7f, -0.7f);
glVertex2f(0.7f, 0.7f);
glVertex2f(-0.7f, 0.7f);
glEnd();
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glBegin(GL_QUADS);
glColor3f(0.0,0.0,1.0);
glVertex2f(-0.3f, -0.3f);
glVertex2f(0.3f, -0.3f);
glVertex2f(0.3f, 0.3f);
glVertex2f(-0.3f, 0.3f);
glEnd();
}
Соседние файлы в папке GLlab