我正在开发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
}
}
答案 0 :(得分:2)
chris 说:
如果您需要DC,则应在完成后将其归还。就像 就这么简单。
他/她是对的。
一些程序员哥说:
计算机上的资源不是无限的,其中包括诸如 句柄,设备上下文,文件等。如果您继续分配 资源并且不释放它们,系统迟早会运行 没钱了。
他/她也正确。
您应该听他们的话。
在您的应用程序调用/调用{之前,其他应用程序和进程,甚至当前进程和应用程序中的其他线程,也无法使用GetDC
或GetWindowDC
来检索窗口的设备上下文。 {1}}。