MFC и OpenGL CView, C ++, инициализация OpenGL после GLEW

Я относительно (читай: очень) новичок в MFC с использованием C ++ — обычно я просто беспокоюсь об OpenGL.

Из того, что я знаю при написании C ++ Win32 с OGL, мне нужно инициализировать GLEW, прежде чем я инициализирую OpenGL и создаю окно, которое требует использования фиктивного окна. Круто, не знаю.

В MFC я получил класс CView, который содержит членский класс OpenGL.

Я успешно инициализировал GLEW, используя временное окно в OnPreCreateWindow, я также успешно инициализировал OpenGL, но, увы, с неправильным HWND / HDC … действительно, отладка говорит мне, что HDC, удерживаемый в качестве члена в моем классе OpenGL, не тот Я получаю в OnDraw от CDC?

Где мой правильный HDC для OpenGL? — Мне нужна помощь MFC! Нужно ли будет периодически обновлять этот DC?

Кажется, у меня есть выбор OnInitialUpdate, OnPreCreateWindow и OnDraw (CDC *) для инициализации / обновления OpenGL с правильным DC.

void CJesseView::OnInitialUpdate()
{
CView::OnInitialUpdate();
HDC hDC = GetDC()->m_hDC;
}

Это работает и инициализирует GLEW — я должен сделать это в другом месте?

BOOL CJesseView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
//  the CREATESTRUCT cs

/* modify the style of the view / window */
cs.dwExStyle |= CS_OWNDC;

/*  OpenGL Set up
1. Create a faux window
*/
CString m_ClassName("JesseGLView");

HWND hwnd = CreateWindowEx(WS_EX_APPWINDOW, m_ClassName, m_ClassName,
WS_POPUP, 0, 0, 640, 480, NULL, NULL, cs.hInstance, NULL);

::ShowWindow(hwnd, SW_HIDE);    // Don't show the window.

/* OpenGL Set up
2. Initialise Glews extension Library to give us access to OpenGL 4.1 Core
*/
m_OpenGL = new OpenGL();

if( ! m_OpenGL->PreInjectGLEW( hwnd ) )
MessageBox(_T("No OpenGL Niceties - Couldn't initialise GLEW!"), _T("CJesseView"));

::DestroyWindow( hwnd );    //Destroy Window now that the extensions are loaded
hwnd = NULL;

//..
return CView::PreCreateWindow(cs);
}

void CJesseView::OnDraw(CDC* pCDC)
{
CJesseDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

BeginScene(0.4, 0.4, 0.8, 1.0);
// Draw something!
EndScene();

//..
::SwapBuffers( pCDC->GetSafeHdc() );
}

int CJesseView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO:  Add your specialized creation code here
m_OpenGL->Create( AfxGetApp()->GetMainWnd()->GetSafeHwnd(),
true, 800, 600, 0.1f, 60000.0f ); // VSYNC, 0.1, 60k for near and far

return 0;
}

И, наконец, моя функция OpenGL :: Create (), ну, ошибки должны быть связаны с HWND, который я передаю, так как я получаю HDC ..

bool OpenGL::InitOpenGL( HWND hWnd, int sW, int sH, float nearP, float farP, bool vsync )
{
bool bOk = false;
bool error = false;

m_Context = GetDC( hWnd );

//do some PIXELFORMATDESCRIPTOR and context attrib setup

bOk = bOk && (m_Renderer = wglCreateContextAttribsARB(m_Context, 0, actualContextAttribs));

if( ! bOk )
return false;

if(! wglMakeCurrent(m_Context, m_Renderer) ) {
wglDeleteContext(m_Renderer);
return false;
}

//... other stuff
}

0

Решение

Мне нужно инициализировать GLEW, прежде чем я инициализирую OpenGL

Нет. Для правильной инициализации GLEW необходим текущий контекст OpenGL. Это также четко указано в руководстве GLEW. Так что продолжайте и прочтите The Fine Manual (RTFM), пожалуйста.

Теперь для создания расширенного контекста OpenGL GLEW практически не помогает. Сначала нужно создать прокси-контекст OpenGL, который вы используете, чтобы получить указатели на расширение wgl… функции. Не беспокойтесь о MFC здесь. Для этого используйте простые функции Win32. Это очень хорошо объяснено здесь: http://www.opengl.org/wiki/Creating_an_OpenGL_Context_(WGL)#Proper_Context_Creation

Как только вы получите свой правильный контекст OpenGL, вы можете использовать GLEW.

0

Другие решения

Других решений пока нет …