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

时间:2017-05-25 09:14:37

标签: winapi mfc device-context

我有一个存储窗口对象的对话框:

class CInputDlg : public CDialog
{

...

private:
    CWnd m_cImageWindow;

...

};

在对话框类OnPaint例程中,我绘制到窗口对象:

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例程的每次执行上获取/释放和创建/删除这两个设备上下文,而不是在OnInitDialog例程中初始化一次

但是MSDN说"应用程序只有在必须在客户区绘制时才获得显示DC,并且当应用程序完成绘制时,它必须释放DC"。

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

所以我的问题是:

  1. 按照我想要的计划安全吗?
  2. 选择合适的方案是否合适?
  3. 尝试我想要的方案, Visual Leak Detector 说“没有检测到内存泄漏”#39;甚至没有打电话给DeleteDCReleaseDC。我可以假设在销毁相应的实例期间会自动发生这种情况吗?
  4. 谢谢。

0 个答案:

没有答案