为何ReleaseDC()?

时间:2015-04-03 14:03:54

标签: c++ mfc

我正在开发MFC app我在某些时候在空闲处理循环期间遇到了一些奇怪的访问冲突错误。

经过一些研究后,我发现可能是由未发布的DC引起的。我在每次GetDC()调用之后都调用了ReleaseDC()函数,并且错误停止出现。

我能理解的是为什么我必须致电ReleaseDC()? 。例如:

void CMainFrame::OnUpdateStatusLODLevel(CCmdUI *pCmdUI)
{
    pCmdUI->Enable();

    RenderingStatistics Stats = theApp.xAM->GetRenderingStatistics();

    std::wstring wsText;

    wsText = L"LOD: ";
    wsText += std::to_wstring(Stats.uiCurrentLOD);

    pCmdUI->SetText(wsText.c_str());

    CDC* dc = m_wndStatusBar.GetDC();

    if (dc){
        CSize size = dc->GetTextExtent(wsText.c_str());
        m_wndStatusBar.SetPaneWidth(m_wndStatusBar.CommandToIndex(ID_STATUS_BAR_LOD_LEVEL), size.cx);

        ReleaseDC(dc); // without this call Access Violation errors appears
    }
}

1 个答案:

答案 0 :(得分:2)

chris 说:

  

如果您需要DC,则应在完成后将其归还。就像   就这么简单。

他/她是对的。

一些程序员哥说:

  

计算机上的资源不是无限的,其中包括诸如   句柄,设备上下文,文件等。如果您继续分配   资源并且不释放它们,系统迟早会运行   没钱了。

他/她也正确。

您应该听他们的话。

在您的应用程序调用/调用{之前,其他应用程序和进程,甚至当前进程和应用程序中的其他线程,也无法使用GetDCGetWindowDC来检索窗口的设备上下文。 {1}}。