管理MFC中的字体,笔刷和笔

时间:2011-01-21 12:15:05

标签: c++ mfc resources fonts

我即将在MFC中启动文本呈现窗口。鉴于文本呈现窗口将允许不同样式的字体(并且每个窗口可以具有不同的字体),我一直在考虑字体的管理。

创建某种字体管理器会有意义吗?我想每次需要字体时,渲染器都会将所需的LOGFONT传递给经理。如果存在CFont,则会返回,如果没有,则会创建。这个字体管理器在系统中是全局的。

这有多大意义吗? Windows是否在幕后做这种事情意味着从应用程序的角度来看它是完全没有必要的?

对于特定颜色的画笔和笔,人们也可以这样说。创建一个管理器后,将它们存储在某种类型的管理器中会更快吗?例如,如果我创建一个坚固的紫红色画笔,另一个想要紫红色的窗口是否应该请求现有画笔?

另外,我猜测如果我将磁盘上的图像加载到blit,如果两个单独的窗口从磁盘加载相同的图像,我将有两个图像 - 所以这些是很好的候选缓存(通过文件名,也许?)

3 个答案:

答案 0 :(得分:3)

不同的Windows版本对这些内容进行了不同程度的缓存。

我的建议取决于两件事:

  1. 不要过早优化。如果您可以在将来看到可能需要进行优化,请继续并确保您对其进行构建,以便从字体管理器中检索字体。但是,在可证明的性能不足之前,不要打扰实现缓存。

  2. 措施。制作一个测试用例程序,创建并销毁数百种不同样式的字体,并衡量其在性能方面的扩展程度。

  3. 我曾经花了很长时间写一个多线程渲染器。只是发现这一点,因为无论如何GDI驱动程序序列化对硬件的访问,我得到了零利益。

答案 1 :(得分:2)

这是一个很好的字体策略,Windows字体映射器并不便宜,而且典型程序使用的字体数量是有限的。但不是刷子和笔,它们很便宜,所以只需动态创建和销毁它们。

此战略的最终认可来自微软自己的代码,Winforms就是这样做的。请注意,缓存会产生新问题,您必须在用户更改系统设置时使缓存无效。系统颜色,DPI,那种东西。你必须在顶层窗口中监听WM_SETTINGCHANGE。

答案 2 :(得分:0)

Windows已经拥有(自从我为Windows编程以来已经有一段时间了)具有各种GetStockXXX功能,例如GetStockFont()。我有一个快速的谷歌,但没有明显的MSDN文档出现。

编辑:请参阅GetStockObject():http://msdn.microsoft.com/en-us/library/dd144925%28VS.85%29.aspx