Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


class COpenGLView : public CView



{

Protected: // create from serialization only

COpenGLView();

DECLARE_DYNCREATE(COpenGLView)

// Attributes

protected:

GLint m_width; // ширина окна OpenGL

GLint m_height; // высота окна OpenGL

public:

CDocument* GetDocument();

// Operations

public:

protected:

CClientDC *m_pDC;

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(COpenGLView)

public:

virtual void OnDraw(CDC* pDC); // overridden to draw this view

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

protected:

virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);

virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);

virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

//}}AFX_VIRTUAL

// Implementation

public:

virtual ~COpenGLView();

#ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif

protected:

BOOL SetPixelFormat(HDC hdc);

BOOL CreateGLContext(HDC hdc);

// Generated message map functions

protected:

//{{AFX_MSG(COpenGLView)

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

afx_msg void OnDestroy();

afx_msg void OnSize(UINT nType, int cx, int cy);

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

#ifndef _DEBUG // debug version in OpenGLView.cpp

inline CDocument* COpenGLView:: GetDocument()

{ return (CDocument*)m_pDocument; }

#endif

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

//{{AFX_INSERT_LOCATION}}

// Microsoft Developer Studio will insert additional declarations immediately before the previous line.

#endif //! defined(AFX_OPENGLVIEW_H__8E83909C_3A90_11D1_AB25_000000000000__INCLUDED_)

Приложение В ФАЙЛ 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), // размер структуры

Номер версии

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

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

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

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

Разряда на цвет

Биты цвета игнорируются

Не используется альфа параметр

Смещение цветов игнорируются

Буфер аккумулятора не используется

Биты аккумулятора игнорируются

Разрядный буфер глубины

Буфер трафарета не используется

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

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

Зарезервирован

Маски слоя игнорируются

};

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[] = {

X00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

X00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

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

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

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

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

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

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

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

X00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

X00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

X00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

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

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

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

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

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

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

X0f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x30,

X00, 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());

}

Приложение Г ПРИМЕРЫ ЭКРАННЫХ СНИМКОВ

Рисунок 1– Пример вложения фигур

 

Рисунок 2 – Пример вращения фигур

Рисунок 3 – Пример вращающегося тора с эффектами тумана и дождя

 

Рисунок 4 – Пример освещения видимым источником света при вращении фигуры


Поделиться:



Последнее изменение этой страницы: 2017-04-12; Просмотров: 313; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.048 с.)
Главная | Случайная страница | Обратная связь