在两个静态控件里同时用OpenGL 绘图,
其中一个是静态里
void CWaveDisplay::OnPaint()
{
CPaintDC dc( this );
GetClientRect( &mCtrlRect );
SwapBuffers(dc.m_ps.hdc);
wglMakeCurrent(NULL,NULL);
HWND hWnd = this->GetSafeHwnd();
HDC hDC = ::GetDC(hWnd);
wglMakeCurrent(NULL,NULL);
wglMakeCurrent(hDC,this->m_hGLContext);
glLoadIdentity();
glClearColor(0,0,0,1); //清屏
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
DrawWave(); //绘图程序
wglMakeCurrent(NULL,NULL);
::ReleaseDC(hWnd,hDC);
}
另一个是
void CMyDisplayWave::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
wglMakeCurrent(NULL,NULL);
HWND hWnd = this->GetSafeHwnd();
HDC hDC = ::GetDC(hWnd);
wglMakeCurrent(NULL,NULL);
wglMakeCurrent(hDC,this->m_hGLContext);
DrawGrid(); // 绘图程序
DrawScale(); // 绘图程序
ShowState(); // 绘图程序
DrawWave(); // 绘图程序
Invalidate(FALSE);
wglMakeCurrent(NULL,NULL);
::ReleaseDC(hWnd,hDC);
CStatic::OnTimer(nIDEvent);
}
运行一段时间后就会抛出MedicalSoftware.exe 中的 0x7c812a5b 处最可能的异常: Microsoft C++ 异常: 内存位置 0x000e7118 处的 CResourceException。
Warning: Uncaught exception in WindowProc (returning 0).
如何解决啊?
4 个解决方案
#1
友情帮顶了。
#2
注意下hDC
#3
先将一些显示的函数去掉,看看是否有问题!如果再有问题,你再去掉一部分!
我个人认为,是wglMakeCurrent经常调用的问题!这个你放在onpaint里面调用,又放到ontime里面调用,太频繁了,这个最好放在构造函数或者初始化函数里面调用一次,以后都使用!
另外,wglMakeCurrent后,还要调用wglDeleteContext,你这个没有调用,我觉的,这个才是程序死掉的关键!
我个人认为,是wglMakeCurrent经常调用的问题!这个你放在onpaint里面调用,又放到ontime里面调用,太频繁了,这个最好放在构造函数或者初始化函数里面调用一次,以后都使用!
另外,wglMakeCurrent后,还要调用wglDeleteContext,你这个没有调用,我觉的,这个才是程序死掉的关键!
#4
wglMakeCurrent在构造函数里已经调用了,因为需要在两个界面同时显示,需要不停的切换,所以就经常调用wglMakeCurrent,onpaint和ontimer是在两个不同的界面里调用,如果每次调用wglMakeCurrent后再调用wglDeleteContext,就不会显示了,wglDeleteContext我在OnDestroy里调用了。如果要想两个界面同时显示的话该怎么解决啊?
#1
友情帮顶了。
#2
注意下hDC
#3
先将一些显示的函数去掉,看看是否有问题!如果再有问题,你再去掉一部分!
我个人认为,是wglMakeCurrent经常调用的问题!这个你放在onpaint里面调用,又放到ontime里面调用,太频繁了,这个最好放在构造函数或者初始化函数里面调用一次,以后都使用!
另外,wglMakeCurrent后,还要调用wglDeleteContext,你这个没有调用,我觉的,这个才是程序死掉的关键!
我个人认为,是wglMakeCurrent经常调用的问题!这个你放在onpaint里面调用,又放到ontime里面调用,太频繁了,这个最好放在构造函数或者初始化函数里面调用一次,以后都使用!
另外,wglMakeCurrent后,还要调用wglDeleteContext,你这个没有调用,我觉的,这个才是程序死掉的关键!
#4
wglMakeCurrent在构造函数里已经调用了,因为需要在两个界面同时显示,需要不停的切换,所以就经常调用wglMakeCurrent,onpaint和ontimer是在两个不同的界面里调用,如果每次调用wglMakeCurrent后再调用wglDeleteContext,就不会显示了,wglDeleteContext我在OnDestroy里调用了。如果要想两个界面同时显示的话该怎么解决啊?