MFC用opengl空指针问题

你好,我看了你的《MFC+OPENGL配置+显示三维图形实现 旋转平移缩放+光照效果[对话框篇]》这篇文章,我用的是VS2019,我照着第一部分做完以后,开始调试,结果说m_pDisplay->那里有问题,是空指针了,你知道是什么原因吗?有办法修改吗?

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    根据你提供的问题描述,在使用MFC和OpenGL时遇到了m_pDisplay指针为空的问题,可能是以下原因导致的:

    1. 没有正确初始化m_pDisplay指针,导致为空。
    2. 在MyOpengl类中没有定义或初始化m_pDisplay指针。
    3. m_pDisplay指针在程序运行过程中被释放,导致为空。

    为了解决这个问题,可以采取以下几步操作:

    1. 在MyOpengl.h中定义并初始化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;
    
        ...
    };
    
    1. 在函数OnCreate中初始化m_pDisplay指针:
    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;
    }
    
    1. 在函数OnPaint中使用m_pDisplay指针进行绘制:
    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);
    }
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

效果不太好,我准备重新发帖问问,不过,还是谢谢你了