主题:求助:构造opengl测试环境
想做一个3d测试小程序,主要是检测计算机支不支持简单的opengl 3d功能。手头上有一些opengl源代码,但都是控制台的。我想基于vc的单文档界面,测试时弹出一个窗口用来显示动画,限定时间自动关闭此窗口。最好是尽量少的改动已有代码。
我设计的是一个单文档的界面,其中响应菜单函数中直接把控制台程序移植过来,如下
void CMainFrame::OnGo()
{
// TODO: 在此添加命令处理程序代码
......
int argc = 1;
int wi;
char *argv[] = {"OpenGL Application"};
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(600,600); // Size of the OpenGL window
wi=glutCreateWindow("OpenGL 2 Dimensonal Geometries"); // Creates OpenGL Window
glutDisplayFunc(display);
glutKeyboardFunc(keyCB); // set window's key callback
glutSpecialFunc(specialKey); // set window's to specialKey callback
glutMainLoop();
//
}
程序编译通过,函数能响应,也按预想的弹出一个新窗口在其中作图。现在问题是怎么限定时间关闭此窗口,而且如果手动关闭的话会引起中端错误
**.exe 中的 0x1000a8b5 处未处理的异常: 0xC0000005: 读取位置 0x0114281c 时发生访问冲突
停止在vc wincore.cpp中的
LRESULT CALLBACK
_AfxActivationWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
WNDPROC oldWndProc = (WNDPROC)::GetProp(hWnd, _afxOldWndProc);
ASSERT(oldWndProc != NULL);
LRESULT lResult = 0;
TRY
{
BOOL bCallDefault = TRUE;
switch (nMsg)
{
case WM_INITDIALOG:
{
DWORD dwStyle;
CRect rectOld;
CWnd* pWnd = CWnd::FromHandle(hWnd);
_AfxPreInitDialog(pWnd, &rectOld, &dwStyle);
bCallDefault = FALSE;
lResult = CallWindowProc(oldWndProc, hWnd, nMsg, wParam, lParam);
_AfxPostInitDialog(pWnd, rectOld, dwStyle);
}
break;
case WM_ACTIVATE:
_AfxHandleActivate(CWnd::FromHandle(hWnd), wParam,
CWnd::FromHandle((HWND)lParam));
break;
case WM_SETCURSOR:
bCallDefault = !_AfxHandleSetCursor(CWnd::FromHandle(hWnd),
(short)LOWORD(lParam), HIWORD(lParam));
break;
case WM_NCDESTROY:
SetWindowLongPtr(hWnd, GWLP_WNDPROC, reinterpret_cast<INT_PTR>(oldWndProc));
RemoveProp(hWnd, _afxOldWndProc);
GlobalDeleteAtom(GlobalFindAtom(_afxOldWndProc));
break;
}
// call original wndproc for default handling
if (bCallDefault)
lResult = CallWindowProc(oldWndProc, hWnd, nMsg, wParam, lParam); [color=FF0000]//中断在这儿[/color]
}
CATCH_ALL(e)
{
// handle exception
MSG msg;
msg.hwnd = hWnd;
msg.message = nMsg;
msg.wParam = wParam;
msg.lParam = lParam;
lResult = AfxProcessWndProcException(e, &msg);
TRACE(traceAppMsg, 0, "Warning: Uncaught exception in _AfxActivationWndProc (returning %ld).\n",
lResult);
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
return lResult;
}
哪位若能提供比较好的建议或方法,不胜感激。
我设计的是一个单文档的界面,其中响应菜单函数中直接把控制台程序移植过来,如下
void CMainFrame::OnGo()
{
// TODO: 在此添加命令处理程序代码
......
int argc = 1;
int wi;
char *argv[] = {"OpenGL Application"};
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(600,600); // Size of the OpenGL window
wi=glutCreateWindow("OpenGL 2 Dimensonal Geometries"); // Creates OpenGL Window
glutDisplayFunc(display);
glutKeyboardFunc(keyCB); // set window's key callback
glutSpecialFunc(specialKey); // set window's to specialKey callback
glutMainLoop();
//
}
程序编译通过,函数能响应,也按预想的弹出一个新窗口在其中作图。现在问题是怎么限定时间关闭此窗口,而且如果手动关闭的话会引起中端错误
**.exe 中的 0x1000a8b5 处未处理的异常: 0xC0000005: 读取位置 0x0114281c 时发生访问冲突
停止在vc wincore.cpp中的
LRESULT CALLBACK
_AfxActivationWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
WNDPROC oldWndProc = (WNDPROC)::GetProp(hWnd, _afxOldWndProc);
ASSERT(oldWndProc != NULL);
LRESULT lResult = 0;
TRY
{
BOOL bCallDefault = TRUE;
switch (nMsg)
{
case WM_INITDIALOG:
{
DWORD dwStyle;
CRect rectOld;
CWnd* pWnd = CWnd::FromHandle(hWnd);
_AfxPreInitDialog(pWnd, &rectOld, &dwStyle);
bCallDefault = FALSE;
lResult = CallWindowProc(oldWndProc, hWnd, nMsg, wParam, lParam);
_AfxPostInitDialog(pWnd, rectOld, dwStyle);
}
break;
case WM_ACTIVATE:
_AfxHandleActivate(CWnd::FromHandle(hWnd), wParam,
CWnd::FromHandle((HWND)lParam));
break;
case WM_SETCURSOR:
bCallDefault = !_AfxHandleSetCursor(CWnd::FromHandle(hWnd),
(short)LOWORD(lParam), HIWORD(lParam));
break;
case WM_NCDESTROY:
SetWindowLongPtr(hWnd, GWLP_WNDPROC, reinterpret_cast<INT_PTR>(oldWndProc));
RemoveProp(hWnd, _afxOldWndProc);
GlobalDeleteAtom(GlobalFindAtom(_afxOldWndProc));
break;
}
// call original wndproc for default handling
if (bCallDefault)
lResult = CallWindowProc(oldWndProc, hWnd, nMsg, wParam, lParam); [color=FF0000]//中断在这儿[/color]
}
CATCH_ALL(e)
{
// handle exception
MSG msg;
msg.hwnd = hWnd;
msg.message = nMsg;
msg.wParam = wParam;
msg.lParam = lParam;
lResult = AfxProcessWndProcException(e, &msg);
TRACE(traceAppMsg, 0, "Warning: Uncaught exception in _AfxActivationWndProc (returning %ld).\n",
lResult);
DELETE_EXCEPTION(e);
}
END_CATCH_ALL
return lResult;
}
哪位若能提供比较好的建议或方法,不胜感激。