为什么释放DC()

Why ReleaseDC()?

本文关键字:DC 释放 为什么      更新时间:2023-10-16

我正在开发MFC应用程序,在空闲处理循环中,我曾遇到过一些奇怪的访问违规错误。

经过一些研究,我发现这可能是由未释放的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
    }
}

chris说:

如果你拿了DC,你应该在完成后把它还给别人。它就像就这么简单。

他/她是对的。

一些程序员说:

计算机上的资源不是无限的,包括句柄、设备上下文、文件等。如果你继续分配资源而不释放它们,系统迟早会运行资源不足。

他/她也是对的。

你应该听他们的。

其他应用程序和进程,甚至是当前进程和应用程序中的其他线程,在应用程序调用/调用ReleaseDC之前,将无法使用GetDCGetWindowDC检索窗口的设备上下文。