1

我在我的 Windows 创建方法中使用以下代码

HANDLE hFont = ::GetStockObject(DEFAULT_GUI_FONT);
m_InfoTab.SendMessage(WM_SETFONT, (WPARAM)hFont);

m_InfoTab 是标准的 Windows/MFC 选项卡控件。父窗口销毁时是否需要保存原字体并恢复?

4

2 回答 2

3

不需要恢复原始字体。然而,您有责任自己管理字体对象,即在不再使用时将其删除。的文档在WM_SETFONT这里相当明确:

当不再需要字体时,应用程序应调用 DeleteObject 函数将其删除;例如,在它破坏了控件之后。

在这种特殊情况下,您不会遇到任何问题,因为您通过调用GetStockObject(). 这些对象由系统控制,不需要对它们调用 DeleteObject(尽管它也无害)。

使用任务管理器可以轻松验证您的应用程序是否泄漏 GDI 句柄。转到Processes选项卡,选择View -> Select Columns...并勾选GDI Objects。监控到位后,更改您的代码并使用SetTimer()with uElapsed = 1000(每秒一次)安装计时器。使用以下代码添加OnTimer处理程序:

void CMyDialog::OnTimer(UINT_PTR nIDEvent)
{
    // Retrieve the system font
    HFONT hFontSystem = (HFONT)GetStockObject( DEFAULT_GUI_FONT );
    LOGFONT lfSystem = { 0 };
    GetObject( hFontSystem, sizeof( lfSystem ), &lfSystem );
    // And construct and identical font object
    HFONT hFontNew = CreateFontIndirect( &lfSystem );
    // This will leak the font object
    m_InfoTab.SendMessage( WM_SETFONT, (WPARAM)hFontNew );

    __super::OnTimer(nIDEvent);
}

现在打开任务管理器,启动应用程序并观察 GDI 对象计数每秒增加 1。

于 2013-01-09T22:00:49.997 回答
-1

不,有问题的窗口 (m_infoTab) 负责管理其字体,并在必要时释放旧字体。

于 2013-01-09T21:20:43.670 回答