Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
18
Добавлен:
01.05.2014
Размер:
7.03 Кб
Скачать
// OpenGLView.cpp : implementation of the COpenGLView class
//

#include "stdafx.h"
#include "Lighting.h"

#include "LightingDoc.h"
#include "LightingView.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, -152);
  ::glBitmap(64, 20, 0, 3, 0.0, 0.0, Bitmap_logo);

  ::glFinish();

  ::SwapBuffers(::wglGetCurrentDC());
}
Соседние файлы в папке Lab5