2014-01-26 68 views
0

我比較(閱讀:非常)使用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 
} 

回答

0

我在我初始化OpenGL之前需要初始化GLEW

不需要。GLEW需要現有的OpenGL上下文正在進行正確的初始化。這在GLEW手冊中也有明確說明。所以請繼續閱讀精細手冊(RTFM)。

現在爲了創建一個先進的OpenGL環境,GLEW沒有什麼幫助。您需要首先創建一個代理OpenGL上下文,您可以使用它獲取指向擴展wgl…函數的函數指針。這裏不要打擾MFC。爲此,使用普通的Win32函數。這裏解釋得非常好:http://www.opengl.org/wiki/Creating_an_OpenGL_Context_(WGL)#Proper_Context_Creation

一旦你獲得了正確的OpenGL上下文,就可以使用GLEW。

+0

「我已經成功地在OnPreCreateWindow中使用臨時窗口初始化GLEW,我也成功地初始化了OpenGL,但是唉,出現了錯誤的HWND/HDC。實際上,調試告訴我HDC在我的OpenGL類中作爲成員持有是不是我從CDC獲得OnDraw的人?「 由於發佈此我現在可以看到我爲glClearColour放入藍色。我通過Google找到了一個名叫Eric Idelson的工作代碼示例,並且在設置我的高級上下文時意識到我得到了錯誤的HDC。 – mynameisnafe