我在MFC中读取代码,但与下面的代码很困惑:为什么SelectObject被调用两次?
void EditView::ResetDefaultFont()
{
HFONT hFont = (HFONT)::GetStockObject(DEFAULT_GUI_FONT);
CDC* pDC = GetDC();
CFont* pFont = pDC->SelectObject(CFont::FromHandle(hFont));
pDC->SelectObject(pFont);
::DeleteObject(hFont);
}
为什么CDC选择默认字体第一(CFont* pFont = pDC->SelectObject(CFont::FromHandle(hFont));
),但再次选择pFont?
这是正确的。在老派的Win API编程中,当改变共享资源的全局系统对象时,出现了“三明治”的概念。获取了特定字体的字体句柄,然后当您将该字体设置为该新句柄时,之前的字体对象返回,以便您完成后可以放回原处。在Win NT之前,这些资源是系统对象,并且有少量的GDI句柄。程序员有责任把它们放回去。这是早期Windows世界中常见问题的来源。早期的Petzold书籍是一个很好的资源。 –
@Cheers和hth。 - Alf它来自BCG Control的BCGPVisualStudioGUIDemo项目。 – Al2O3
@Ruby公平的话题,但仍然:示例代码质量很低。除了设置设备上下文的字体并立即撤消这个改变并没有明显的目的之外,作者还认为删除一个**系统控制的**对象(从'GetStockObject'返回的'hFont'>是一个好主意) )。你可能不应该太质疑这个代码背后的理由。 – IInspectable