Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторные работы / 10 KG / 1KGView
.cpp// 1KGView.cpp : implementation of the CMy1KGView class
//
#include "stdafx.h"
#include "1KG.h"
#include "1KGDoc.h"
#include "1KGView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMy1KGView
IMPLEMENT_DYNCREATE(CMy1KGView, CView)
BEGIN_MESSAGE_MAP(CMy1KGView, CView)
//{{AFX_MSG_MAP(CMy1KGView)
ON_WM_CREATE()
ON_WM_DESTROY()
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CMy1KGView construction/destruction
CMy1KGView::CMy1KGView()
{
// TODO: add construction code here
}
CMy1KGView::~CMy1KGView()
{
}
BOOL CMy1KGView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.style|=(WS_CLIPCHILDREN|WS_CLIPSIBLINGS); //устанавливаем стили окна, необходимые для работы с OpenGL
cs.cx=500;
cs.cy=300;
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMy1KGView drawing
void CMy1KGView::OnDraw(CDC* pDC)
{
CMy1KGDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect ClientRect; //описываем переменную типа прямоугольник
GetClientRect(&ClientRect); //определяем длину и ширину окна на основе его координат
windW=abs(ClientRect.right-ClientRect.left);
windH=abs(ClientRect.top-ClientRect.bottom);
glClearColor(1.0,1.0,1.0,1.0); //задаем цвет фона окна, например, белый
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //устанавливаем цвет фона
InitViewport(0, 0, windW, windH); //устанавливаем параметры видового окна
//далее следуют команды построения изображения
glMatrixMode(GL_MODELVIEW);//овал
glLoadIdentity();
glTranslatef(0.0,1.0,0.0);
glColor3f(1.,0.8,0.7);
glScalef(4.,4.0,0.0);
auxSolidSphere(0.9);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);//глаз1-зрачок
glLoadIdentity();
glTranslatef(-1.0,1.0,0.0);
glColor3f(0.,0.,0.);
glScalef(1.,1.0,0.0);
auxSolidSphere(0.2);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);//глаз2-зрачок
glLoadIdentity();
glTranslatef(1.0,1.0,0.0);
glColor3f(0.,0.,0.);
glScalef(1.,1.0,0.0);
auxSolidSphere(0.2);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);//глаз
glLoadIdentity();
glTranslatef(-1.0,1.0,0.0);
glColor3f(0.,0.,0.);
glScalef(1.,1.5,0.0);
auxWireSphere(0.35);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);//глаз
glLoadIdentity();
glTranslatef(1.0,1.0,0.0);
glColor3f(0.,0.,0.);
glScalef(1.,1.5,0.0);
auxWireSphere(0.35);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);//рот
glLoadIdentity();
glTranslatef(0.0,-1.5,0.0);
glColor3f(0.,0.,0.);
glScalef(1.,1.0,0.0);
auxSolidBox(2.0,0.2,0.);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);//шляпка
glLoadIdentity();
glTranslatef(0.0,2.2,0.0);
glColor3f(1.0, 0.0, 0.0);
glScalef(1.5,1.5,1.5);
glRotatef(90.0,-30.,0.0,0.5);
auxSolidCone(2.3,3.3);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);//слеза есть
glLoadIdentity();
glTranslatef(1.0,-0.1,0.0);
glColor3f(0.0, 0.5, 1.0);
// glRotatef(90.0,-30.,0.0,0.5);
// auxSolidCone(0.1,0.3);
for(int i=0;i<50;i++)
{glColor3f(1.f,0.8f,0.7f); //задаем цвет фона окна, например, белый
auxSolidSphere(0.1);
//слеза есть
glColor3f(0.0f, 0.5f, 1.0f);
glTranslatef(0.0,-1.2,0.0);
glRotatef(90.0,-30.,0.0,0.5);
auxSolidSphere(0.1);
//слезы нет
glColor3f(1.f,0.8f,0.7f);
glTranslatef(0.0,-1.2,0.0);
glRotatef(90.0,-30.,0.0,0.5);
auxSolidSphere(0.12);
//слеза есть
glColor3f(0.0f, 0.5f, 1.0f);
glTranslatef(0.0,-1.5,0.0);
glRotatef(90.0,-30.,0.0,0.5);
auxSolidSphere(0.1);
//слезы нет
glColor3f(1.f,0.8f,0.7f);
glTranslatef(0.0,-1.5,0.0);
glRotatef(90.0,-30.,0.0,0.5);
auxSolidSphere(0.12);
//слеза есть
glColor3f(0.0f, 0.5f, 1.0f);
glTranslatef(0.0,-1.8,0.0);
glRotatef(90.0,-30.,0.0,0.5);
auxSolidSphere(0.1);
glFlush(); //или glFinish();
SwapBuffers(wglGetCurrentDC()); //обеспечиваем перезапись содержимого внеэкранного буфера на экранный (основной)
}
}
/////////////////////////////////////////////////////////////////////////////
// CMy1KGView printing
BOOL CMy1KGView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CMy1KGView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CMy1KGView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CMy1KGView diagnostics
#ifdef _DEBUG
void CMy1KGView::AssertValid() const
{
CView::AssertValid();
}
void CMy1KGView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMy1KGDoc* CMy1KGView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMy1KGDoc)));
return (CMy1KGDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMy1KGView message handlers
int CMy1KGView::OnCreate(LPCREATESTRUCT lpCreateStruct) //функция обработки сообщения "Создание окна"
{if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
//Настраиваем формат пикселей для работы с OpenGL
PIXELFORMATDESCRIPTOR pfd; //структура для описания формата пикселей
memset(&pfd,0,sizeof(PIXELFORMATDESCRIPTOR));//для начала заполняем все значения структуры нулями
//Начинаем заполнение нужных нам значений структуры:
pfd.nSize=sizeof(PIXELFORMATDESCRIPTOR); //размер структуры, устанавливаем равным размеру типа PIXELFORMATDESCRIPTOR
pfd.nVersion=1; //номер версии, для работы с OpenGL ставим 1
pfd.dwFlags = PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER;
//рисовать в окне
//поддержка OpenGL
//двойная буферизация
pfd.iPixelType=PFD_TYPE_RGBA; //режим для отображения цветов - цветовая модель RGBA
pfd.cColorBits=32; //32-битовая глубина цвета
pfd.cAlphaBits=8; //компонента альфа цвета
pfd.cAccumBits=32; //буфер аккумулятора
pfd.cDepthBits=32; //буфер глубины (z- буфер)
pfd.cStencilBits=8; //трафарет
pfd.iLayerType=PFD_MAIN_PLANE; //тип плоскости - основная
m_pdc=GetDC(); //создаем контекст устройства
//Исходя из настройки пикселей и созданного контекста устройства, получаем оптимальный, наиболее совпадающий с требуемым, формат пикселей:
int nPixelFormat=ChoosePixelFormat(m_pdc->m_hDC,&pfd);
if (nPixelFormat==0)
{MessageBox("Ошибка при выборе формата пикселей");
return FALSE;}
BOOL bResult=SetPixelFormat(m_pdc->m_hDC,nPixelFormat,&pfd);
//Устанавливаем полученный формат пикселей:
if (!bResult){MessageBox("Ошибка при установке формата пикселей");
return FALSE;}
if ((hrc=wglCreateContext(m_pdc->m_hDC))==NULL) //на основе контекста устройства создаем контекст воспроизведения
return FALSE;
if (wglMakeCurrent(m_pdc->m_hDC,hrc)==FALSE) //делаем его текущим
return FALSE;
return 0;
}
void CMy1KGView::OnDestroy()
{
CView::OnDestroy();
// TODO: Add your message handler code here
//Убираем из текущего и удаляем контекст воспроизведения
if (hrc==::wglGetCurrentContext()) //запрашиваем текущий контекст воспроизведения
{wglMakeCurrent(NULL,NULL); //делаем его не текущим
wglDeleteContext(hrc); //удаляем контекст воспроизведения
hrc=NULL;
}
CView::OnDestroy(); //для корректного завершения работы передаем управление вверх по иерархии
}
void CMy1KGView::InitViewport(int x, int y, int width, int height)
{
glViewport(x, y, width, height); //задаем видовое окно
glMatrixMode(GL_PROJECTION); //определяем матрицу проецирования
glLoadIdentity(); //делаем ее единичной
glOrtho(-10., 10., -7., 7.,2.,12.); //задаем матрицу 2-х мерной ортографической проекции (окно отсечения), коэффициенты в знаменателе масштабируют изображение
gluLookAt(0.,0.,5.,0.,0.,0.,0.,1.,0.); //устанавливаем положение камеры просмотра
glMatrixMode(GL_MODELVIEW); //режим работы с матрицей вида
}
Соседние файлы в папке 10 KG