【问题标题】:Why SelectObject is called twice?为什么 SelectObject 被调用两次?
【发布时间】:2012-12-10 16:25:08
【问题描述】:

我在 MFC 中阅读了代码,但对下面的代码感到困惑:

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?

【问题讨论】:

    标签: c++ windows mfc cdc


    【解决方案1】:

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

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

    虽然这回答了第二次通话的“原因”,也就是您要问的问题,但我不知道执行完整的通话顺序有什么意义。我在 MSDN Library 和本地 Visual Studio 2012 帮助中都没有找到 ResetDefaultFont 的文档结果。为了彻底起见,我在 VS 2012 中创建了一个新的默认 MFC 项目,并在派生自 CEditView 的类的构造函数中使用了标识符 ResetDefaultFont。它没有编译:没有。

    所以,

    你从哪里得到 ResetDefaultFont 函数?

    【讨论】:

    • 这是正确的。在老式的 Win API 编程中,当更改作为共享资源的全局系统对象时,有一个“三明治”的概念获得特定字体的字体句柄,然后当您将字体设置为该新句柄时,之前的字体对象被退回,以便您在完成后可以将其放回。在 Win NT 之前,这些资源是系统对象,并且 GDI 句柄数量有限。将它们放回去是程序员的责任。这是早期 Windows 世界中问题的常见来源。早期的 Petzold 书籍是一个很好的资源。
    • @Cheers 和 hth。 - Alf 它位于 BCG Control 的 BCGPVisualStudioGUIDemo 项目中。
    • @Ruby 相当离题,但仍然:示例代码质量非常低。除了设置设备上下文的字体并立即撤消该更改没有明显目的之外,作者还认为删除 系统控制 对象是一个好主意(hFontGetStockObject)。您可能不应该过多质疑这段代码背后的基本原理。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-07-13
      • 2021-11-25
      • 2015-12-24
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多