想做一个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;
}
哪位若能提供比较好的建议或方法,不胜感激。