Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
class COpenGLView : public CView ⇐ ПредыдущаяСтр 4 из 4
{ 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; Просмотров: 332; Нарушение авторского права страницы