2012-12-24 99 views
0

我在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?

回答

1

第一个SelectObject调用更改设备上下文中选定的字体。

第二个SelectObject调用将字体重置为第一次调用之前的字体。

虽然这回答了第二次调用的“为什么”,这就是你所问的,但我不知道完成调用序列的要点是什么。我找不到ResetDefaultFont的文档结果,既不在MSDN Library中,也不在本地Visual Studio 2012帮助中。为了做到彻底,我在VS 2012中创建了一个新的默认MFC项目,并在衍生自CEditView的类的构造函数中使用标识符ResetDefaultFont。它没有编译:没有这样的。

所以,

你从哪里弄来从ResetDefaultFont功能?

+0

这是正确的。在老派的Win API编程中,当改变共享资源的全局系统对象时,出现了“三明治”的概念。获取了特定字体的字体句柄,然后当您将该字体设置为该新句柄时,之前的字体对象返回,以便您完成后可以放回原处。在Win NT之前,这些资源是系统对象,并且有少量的GDI句柄。程序员有责任把它们放回去。这是早期Windows世界中常见问题的来源。早期的Petzold书籍是一个很好的资源。 –

+0

@Cheers和hth。 - Alf它来自BCG Control的BCGPVisualStudioGUIDemo项目。 – Al2O3

+0

@Ruby公平的话题,但仍然:示例代码质量很低。除了设置设备上下文的字体并立即撤消这个改变并没有明显的目的之外,作者还认为删除一个**系统控制的**对象(从'GetStockObject'返回的'hFont'>是一个好主意) )。你可能不应该太质疑这个代码背后的理由。 – IInspectable

-2

答案很简单。 此代码仅用于获取DC的当前字体。 如果他们已经将这些代码放在这些陈述后面,那就很明显了。

相关问题