DWORD WINAPI CImageDemoDlg::RenderThreadProc(LPVOID lParam)
{
CImageDemoDlg *pDlg = (CImageDemoDlg*)lParam;
pDlg->SetupPixelFormat(pDlg->m_pPaintDC->m_hDC);
pDlg->m_hRC = wglCreateContext(pDlg->m_pPaintDC->m_hDC); // Try To Get A Rendering Context
wglMakeCurrent(pDlg->m_pPaintDC->m_hDC, pDlg->m_hRC);
pDlg->ReshapeGL(pDlg->m_WndRect.Width(), pDlg->m_WndRect.Height()); // Reshape Our GL Window
pDlg->InitOpenGL();
while (TRUE)
{
if (WaitForSingleObject(pDlg->m_hRenderEvent, INFINITE) == WAIT_OBJECT_0)
{
pDlg->Render();
}
}
wglMakeCurrent(NULL, NULL);
if (pDlg->m_hRC)
wglDeleteContext(pDlg->m_hRC);
return TRUE;
}
这几天都在解决这个问题(在线程中如果直接绘制场景pDlg->Render();那么你将看不到任何效果),在网络上查了下资料,发现可以这样来解决。不过这样处理比较麻烦,因为如果你要添加纹理的话,那么创建纹理LoadTexture();函数也必须在线程函数中调用,比较麻烦。比较下来还不如用TIMER(定时器)来绘制场景:
void CMainWnd::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (nIDEvent == TIMERRENDER)
{
Render();
}
CWnd::OnTimer(nIDEvent);
}