我比較(閱讀:非常)使用C++的MFC新手 - 我通常只是擔心OpenGL。MFC和OpenGL CView,C++,初始化GLEW後的OpenGL
從我知道用OGL編寫C++ Win32,我需要在初始化OpenGL和創建窗口之前初始化GLEW,這需要使用一個虛擬窗口。很酷,dunnit。
在MFC中,我派生了一個CView類,它擁有一個成員OpenGL類。
我已經使用OnPreCreateWindow中的臨時窗口成功地初始化了GLEW,我也成功地初始化了OpenGL,但是卻錯誤地使用了錯誤的HWND/HDC。實際上,調試告訴我HDC在我的OpenGL類中保持爲成員是不是我從CDC獲得OnDraw的?
Wheres my correct HDC for OpenGL? - 我需要一些MFC幫助!我是否需要不時更新此DC?
看來我可以選擇OnInitialUpdate,OnPreCreateWindow和OnDraw(CDC *)來用正確的DC初始化/更新OpenGL。
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 ::創建()函數,以及錯誤必須是與HWND我通過在SIC我如何讓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
}
「我已經成功地在OnPreCreateWindow中使用臨時窗口初始化GLEW,我也成功地初始化了OpenGL,但是唉,出現了錯誤的HWND/HDC。實際上,調試告訴我HDC在我的OpenGL類中作爲成員持有是不是我從CDC獲得OnDraw的人?「 由於發佈此我現在可以看到我爲glClearColour放入藍色。我通過Google找到了一個名叫Eric Idelson的工作代碼示例,並且在設置我的高級上下文時意識到我得到了錯誤的HDC。 – mynameisnafe