你好,我看了你的《MFC+OPENGL配置+显示三维图形实现 旋转平移缩放+光照效果[对话框篇]》这篇文章,我用的是VS2019,我照着第一部分做完以后,开始调试,结果说m_pDisplay->那里有问题,是空指针了,你知道是什么原因吗?有办法修改吗?
不知道你这个问题是否已经解决, 如果还没有解决的话:根据你提供的问题描述,在使用MFC和OpenGL时遇到了m_pDisplay指针为空的问题,可能是以下原因导致的:
为了解决这个问题,可以采取以下几步操作:
class MyOpengl : public CWnd
{
public:
MyOpengl();
virtual ~MyOpengl();
afx_msg void OnPaint();
private:
HDC m_hDC;
HGLRC m_hGLRC;
CRect m_rect;
//添加m_pDisplay指针的定义
COpenGLDC* m_pDisplay = nullptr;
...
};
int MyOpengl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
//初始化m_pDisplay指针
m_pDisplay = new COpenGLDC(this);
m_hDC = ::GetDC(m_hWnd);
SetupPixelFormat(m_hDC);
m_hGLRC = wglCreateContext(m_hDC);
wglMakeCurrent(m_hDC, m_hGLRC);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //设置背景色
return 0;
}
void MyOpengl::OnPaint()
{
CPaintDC dc(this); // device context for painting
wglMakeCurrent(m_pDisplay->GetSafeHdc(), m_hGLRC);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// TODO: Add your message handler code here
//根据需要在这里进行绘制操作
glFlush();
SwapBuffers(m_hDC);
wglMakeCurrent(NULL, NULL);
}
这样,就可以解决m_pDisplay指针为空的问题了。需要注意的是,在使用完m_pDisplay指针后,需要手动释放指针,避免内存泄露。可以在MyOpengl的析构函数中释放m_pDisplay指针:
MyOpengl::~MyOpengl()
{
//释放m_pDisplay指针
if (m_pDisplay != nullptr)
{
delete m_pDisplay;
m_pDisplay = nullptr;
}
wglMakeCurrent(NULL, NULL);
if (m_hGLRC)
{
wglDeleteContext(m_hGLRC);
}
ReleaseDC(m_hDC);
}
效果不太好,我准备重新发帖问问,不过,还是谢谢你了