Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Тихомиров Ю. Программирование трёхмерной графики / Files / Bitmaps / OpenGLView
.cpp// OpenGLView.cpp : implementation of the COpenGLView class
//
#include "stdafx.h"
#include "Bitmaps.h"
#include "BitmapsDoc.h"
#include "BitmapsView.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;
// Непосредственное отслеживание размеров области вывода OpenGL
::glViewport(0, 0, m_width, m_height);
// Устанавливаем параметры ортографической проекции
::glMatrixMode(GL_PROJECTION);
::glLoadIdentity();
::gluOrtho2D(-m_width/4, m_width/4, -m_height/2, m_height/2);
// Делаем текущей видовую матрицу
::glMatrixMode(GL_MODELVIEW);
}
/////////////////////////////////////////////////////////////////////////////
// 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, -10);
// Выводим битовое изображение в буфер кадра
::glBitmap(64, 20, (GLfloat)0, (GLfloat)3,
(GLfloat)0.0, (GLfloat)0.0,
Bitmap_logo);
::glFinish();
// Осуществляем вывод на экран
::SwapBuffers(::wglGetCurrentDC());
}
Соседние файлы в папке Bitmaps