Winapi 在成员变量中存储设备上下文,而不是在每次执行OnPaint时获取/释放它

Winapi 在成员变量中存储设备上下文,而不是在每次执行OnPaint时获取/释放它,winapi,mfc,gdi,Winapi,Mfc,Gdi,我有一个对话框类,用于存储窗口对象: class CInputDlg : public CDialog { ... private: CWnd m_cImageWindow; ... }; void CInputDlg::OnPaint() { CPaintDC dc(this); if (IsIconic()) { ... } else { CDC* pDC = m_cImageWindow.G

我有一个对话框类,用于存储窗口对象:

class CInputDlg : public CDialog
{

...

private:
    CWnd m_cImageWindow;

...

};
void CInputDlg::OnPaint()
{
    CPaintDC dc(this);

    if (IsIconic())
    {
        ...
    }
    else
    {
        CDC* pDC = m_cImageWindow.GetDC();
        CDC  cDC;
        cDC.CreateCompatibleDC(pDC);

        cDC.SelectObject(m_hImageBitmap);
        pDC->StretchBlt(...,...,...,...,&cDC,...,...,...,...,SRCCOPY);

        cDC.DeleteDC();
        m_cImageWindow.ReleaseDC(pDC);
    }
}
在对话框class
OnPaint
例程中,我在窗口对象中绘制:

class CInputDlg : public CDialog
{

...

private:
    CWnd m_cImageWindow;

...

};
void CInputDlg::OnPaint()
{
    CPaintDC dc(this);

    if (IsIconic())
    {
        ...
    }
    else
    {
        CDC* pDC = m_cImageWindow.GetDC();
        CDC  cDC;
        cDC.CreateCompatibleDC(pDC);

        cDC.SelectObject(m_hImageBitmap);
        pDC->StretchBlt(...,...,...,...,&cDC,...,...,...,...,SRCCOPY);

        cDC.DeleteDC();
        m_cImageWindow.ReleaseDC(pDC);
    }
}
与每次执行
OnPaint
例程时获取/释放和创建/删除这两个设备上下文不同,我希望将它们存储为dialog类的成员变量,并在
OnInitDialog
例程中初始化它们一次

但表示“应用程序只有在必须在客户端区域绘制时才能获得显示DC,并且当应用程序完成绘制时,必须释放DC”

我还读到,当一个进程分配一个DC时,它会影响系统中的其他进程,因为可以同时获取的DC数量是有限的

所以我的问题是:

  • 按照我想要的计划去做安全吗
  • 按照我想要的计划去做合适吗
  • 在尝试我想要的方案时,VisualLeakDetector甚至没有调用
    DeleteDC
    ReleaseDC
    ,也会说“未检测到内存泄漏”。我可以假设在销毁相应实例的过程中会自动发生这种情况吗

  • 谢谢。

    您只需要在内存中创建一次兼容的DC,而不是在每一个油漆上。并保存它。当您处理
    WP_PAINT
    时,您无论如何都需要调用
    BeginPaint
    直接或间接。此呼叫返回显示窗口的DC。所以-不保存显示DC,但创建一次并保存兼容DC,在绘制时只需通过BitBland将兼容DC复制到显示,视觉泄漏检测器仅检测堆中的泄漏,而不检测GDI对象leaks@RbMm:对于您的第一条评论:如果我不能调用
    m_pDC=m_cImageWindow.GetDC()
    一次,那么我就不能调用m_cDC.CreateCompatibleDC(m_pDC)`一次。如果我理解正确,那么您建议执行后一次,但每次执行
    OnPaint
    @RbMm时都执行前一次。第二个评论:我为什么要关心任何其他泄漏?应用程序中的每个实例都被销毁后,这些泄漏不会立即消失吗?如果这是您唯一关心的问题,那么您应该这样做我也不关心内存泄漏。一旦进程终止,这些泄漏也会消失。