Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кульман_7_Курсовая работа по КГ.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
953.86 Кб
Скачать

Приложение в файл OpenGlView.Срр

// OpenGLView.cpp : implementation of the COpenGLView class

//

#include "stdafx.h"

#include "Materials.h"

#include "MaterialsDoc.h"

#include "MaterialsView.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

///////////////////////////////////////////////////////////////////////

// COpenGLView

IMPLEMENT_DYNCREATE(COpenGLView, CView)

BEGIN_MESSAGE_MAP(COpenGLView, CView)

//{{AFX_MSG_MAP(COpenGLView)

ON_WM_CREATE()

ON_WM_DESTROY()

ON_WM_SIZE()

//}}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()

///////////////////////////////////////////////////////////////////////

// COpenGLView construction/destruction

COpenGLView::COpenGLView()

{

}

COpenGLView::~COpenGLView()

{

}

BOOL COpenGLView::PreCreateWindow(CREATESTRUCT& cs)

{

// OpenGL требует наличия стилей WS_CLIPCHILDREN и WS_CLIPSIBLINGS

cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);

return CView::PreCreateWindow(cs);

}

///////////////////////////////////////////////////////////////////////

// COpenGLView printing

BOOL COpenGLView::OnPreparePrinting(CPrintInfo* pInfo)

{

// default preparation

return DoPreparePrinting(pInfo);

}

void COpenGLView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

}

void COpenGLView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)

{

}

///////////////////////////////////////////////////////////////////////

// COpenGLView diagnostics

#ifdef _DEBUG

void COpenGLView::AssertValid() const

{

CView::AssertValid();

}

void COpenGLView::Dump(CDumpContext& dc) const

{

CView::Dump(dc);

}

CDocument* COpenGLView::GetDocument() // non-debug version is inline

{

ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDocument)));

return (CDocument*)m_pDocument;

}

#endif //_DEBUG

///////////////////////////////////////////////////////////////////////

// COpenGLView message handlers

int COpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CView::OnCreate(lpCreateStruct) == -1)

return -1;

// Формируем контекст рабочей области

m_pDC = new CClientDC(this);

ASSERT(m_pDC != NULL);

// Получаем дескриптор контекста устройства

HDC hdc = m_pDC->GetSafeHdc();

// Устанавливаем формат пикселей

if (SetPixelFormat(hdc)==FALSE)

return -1;

// Создаем и делаем текущим контекст воспроизведения

if (CreateGLContext(hdc)==FALSE)

return -1;

return 0;

}

void COpenGLView::OnDestroy()

{

// Получаем текущий контекст воспроизведения

HGLRC hrc = ::wglGetCurrentContext();

// Перед удалением он не должен быть текущим

::wglMakeCurrent(NULL, NULL);

// Удаляем контекст воспроизведения

if (hrc)

::wglDeleteContext(hrc);

// Удаляем контекст рабочей области

if (m_pDC)

delete m_pDC;

CView::OnDestroy();

}

BOOL COpenGLView::SetPixelFormat(HDC hdc)

{

// Заполняем поля структуры

static PIXELFORMATDESCRIPTOR pfd = {

sizeof(PIXELFORMATDESCRIPTOR), // размер структуры

1, // номер версии

PFD_DRAW_TO_WINDOW | // поддержка вывода в окно

PFD_SUPPORT_OPENGL,// | // поддержка OpenGL

//PFD_DOUBLEBUFFER, // двойная буферизация

PFD_TYPE_RGBA, // цвета в режиме RGBA

24, // 24-разряда на цвет

0, 0, 0, 0, 0, 0, // биты цвета игнорируются

0, // не используется альфа параметр

0, // смещение цветов игнорируются

0, // буфер аккумулятора не используется

0, 0, 0, 0, // биты аккумулятора игнорируются

32, // 32-разрядный буфер глубины

0, // буфер трафарета не используется

0, // вспомогательный буфер не используется

PFD_MAIN_PLANE, // основной слой

0, // зарезервирован

0, 0, 0 // маски слоя игнорируются

};

int pixelFormat;

// Поддерживает ли система необходимый формат пикселей?

if((pixelFormat = ::ChoosePixelFormat(hdc, &pfd)) == 0){

MessageBox("С заданным форматом пикселей работать нельзя");

return FALSE;

}

if (::SetPixelFormat(hdc, pixelFormat, &pfd) == FALSE)

{

MessageBox("Ошибка при выполнении SetPixelFormat");

return FALSE;

}

return TRUE;

}

BOOL COpenGLView::CreateGLContext(HDC hdc)

{

HGLRC hrc;

// Создаем контекст воспроизведения

if((hrc = ::wglCreateContext(hdc)) == NULL)

return FALSE;

// Делаем контекст воспроизведения текущим

if(::wglMakeCurrent(hdc, hrc) == FALSE)

return FALSE;

return TRUE;

}

void COpenGLView::OnSize(UINT nType, int cx, int cy)

{

CView::OnSize(nType, cx, cy);

// Здесь отслеживается изменение размеров

m_width = (GLint)cx;

m_height = (GLint)cy;

}

///////////////////////////////////////////////////////////////////////

// COpenGLView drawing

void COpenGLView::OnDraw(CDC* pDC)

{

GLubyte Bitmap_logo[] = {

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x01, 0xc4, 0xe6, 0x31, 0x00, 0x00,

0x00, 0x00, 0x02, 0x24, 0x21, 0x49, 0x00, 0x00,

0x00, 0x00, 0x05, 0x94, 0x21, 0x49, 0x00, 0x00,

0x00, 0x00, 0x05, 0x15, 0xef, 0x31, 0xc0, 0x00,

0x00, 0x00, 0x05, 0x95, 0x29, 0x48, 0x00, 0x00,

0x00, 0x00, 0x02, 0x25, 0x29, 0x48, 0x00, 0x00,

0x00, 0x00, 0x01, 0xc5, 0xef, 0x30, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x01, 0x12, 0x89, 0x91, 0x4a, 0x19, 0xe9, 0x31,

0x01, 0x1a, 0x52, 0x51, 0x6a, 0x25, 0x21, 0x49,

0x01, 0x16, 0x72, 0x55, 0x5b, 0xa5, 0xe1, 0x48,

0x01, 0x12, 0x52, 0x5b, 0x4a, 0xa5, 0x41, 0xc8,

0x01, 0x12, 0x89, 0x91, 0x4b, 0x99, 0xc1, 0x48,

0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x01, 0x48,

0x0f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x30,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

};

CDocument* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// Здесь вызываются команды рисования "заглушки"

::glClear(GL_COLOR_BUFFER_BIT);

::glColor3f(0.0f, 0.0f, 0.0f);

::glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);

::glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

::glRasterPos2i(-16, -152);

::glBitmap(64, 20, 0, 3, 0.0, 0.0, Bitmap_logo);

::glFinish();

::SwapBuffers(::wglGetCurrentDC());

}