当控件的父窗口被销毁时,是否有必要显式恢复控件字体?
Is it necessary to explicitly restore a control font when its parent window is destroyed?
我在我的windows创建方法
中使用了以下代码HANDLE hFont = ::GetStockObject(DEFAULT_GUI_FONT);
m_InfoTab.SendMessage(WM_SETFONT, (WPARAM)hFont);
m_InfoTab是一个标准的Windows/MFC选项卡控件。是否有必要保存原来的字体和恢复它时,父窗口被破坏?
不需要恢复原字体。然而,你自己负责管理字体对象,也就是说,当它不再使用时删除它。WM_SETFONT
的文档在这里相当明确:
应用程序应该调用DeleteObject函数来删除不再需要的字体;例如,在它销毁控件之后。
在本例中,您不会遇到任何问题,因为您通过调用GetStockObject()
来检索字体对象。这些对象由系统控制,不需要对它们调用DeleteObject(尽管它也没有害处)。
应用程序是否泄漏GDI句柄可以使用任务管理器轻松验证。转到Processes选项卡,选择View -> select Columns…并勾选GDI对象。监视就绪后,更改代码并使用SetTimer()
和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。
不,所讨论的窗口(m_infoTab)负责管理其字体,并在必要时释放旧的字体。
相关文章:
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 在编译时,C++项目抛出错误 C2228,这是预期的,因为控件在运行时未达到该点
- 如何更改窗体上所有控件的标题?[C++生成器]
- 双击更改 mfc 中列表控件中的行的颜色
- 派生的 wxPanel 控件如何访问其中包含 wxDialog 中的数据?
- 如何从代码本身向 wxwidgets 中的文本控件插入字符?
- 如何在MFC中的静态文本控件上插入图标?
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 如何在Qt C++中向自定义控件添加属性?
- C/C++ 检测双击 TVItem 的常用控件
- 从C++标头中导入常量而不是硬编码它们:扩展 .net 控件?
- 控件不会在选择函数旁边移动
- MFC:我们能否扩展CEditView中存在的CEdit控件类行为
- 通过嵌入式 IWebBrowser2 控件中的链接打开 youtube 搜索失败
- 查找素数:错误:控件到达非void函数的末尾
- C++ 获取"控件可能会到达约翰逊-特罗特代码上的非空函数的末尾
- C++WIN32-将RTF数据加载到Rich Edit控件
- 保存“编辑控件”用户输入并在应用程序重新启动C++Visual Studio时进行恢复的有效方法
- 当控件的父窗口被销毁时,是否有必要显式恢复控件字体?