在 Win32 API 中绘制格式化文本的最快方法是什么?

2024-01-03

我正在使用普通 Win32 API 在 C++ 中实现一个文本编辑器,并且我正在尝试找到实现语法突出显示的最佳方法。我知道有像 scintilla 这样的现有控件,但我这样做是为了好玩,所以我想自己完成大部分工作。我还希望它又快又轻。

从我到目前为止所了解到的情况来看,在 GDI 中绘制文本的最低级选项似乎是TextOut功能。但是,如果我需要不断更改字体颜色,那么这意味着我需要多次调用TextOut为了绘制具有混合格式的文本正文。这效率低吗?当实现语法​​高亮和富文本控件时,他们可能会使用TextOut在幕后还是有其他方式?在 GDI 中绘制文本的所有其他方法都只是更高级别的包装吗TextOut?


DrawText 和 TextOut 都是 ExtTextOut 的包装器,因此 ExtTextOut 是低级 API。根据我的经验,ExtTextOut 速度相当快,因此我怀疑您是否会发现 ExtTextOut 本身存在任何性能问题。但是,创建/选择字体可能是性能问题的根源,因此,如果您在字体之间来回切换,则可以通过缓存和重用字体 (HFONT) 而不是每次都使用 CreateFont / SelectObject / DeleteObject 来实现显着的性能提升。基本上,在创建新字体后第一次调用 SelectObject 时,Windows 将执行字体匹配过程,为您所请求的逻辑字体找到最佳的物理字体。这是一个相当复杂的过程,因此您希望最大限度地减少在性能很重要的情况下发生的次数。

许多年前,我开发了一个丰富的编辑控件,它本质上是 Microsoft Word 的迷你版本。我使用 ExtTextOut 作为所有文本输出的主要工具。该控件将维护最近使用的字体的字体缓存(默认缓存大小为 10 种字体)。它支持 WYSIWYG 布局,因此它实际上使用打印机 DC 和字体进行所有布局,然后使用屏幕 DC 和类似字体渲染屏幕兼容版本,因此需要进行大量可能不适用于的额外工作你的情况。即便如此,在当时的典型硬件(例如 266 mhz Pentium)上运行时的性能仍然非常出色。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Win32 API 中绘制格式化文本的最快方法是什么? 的相关文章

随机推荐

  • React 和 Material UI:如何只扩展一张卡

    我使用 React 和 Material UI 来显示一些映射的卡片 当我尝试扩展一张卡时 所有卡都会同时扩展 我发现我必须在 handleExpandClick 函数中传递一个索引 但仍然不起作用 也许我犯了某种错字 我发现这个问题单击展
  • 后台进程的 cy.exec 超时

    我正在尝试使用启动服务器cy exec并像这样后台处理 cy exec nohup python m my module arg 1 failOnNonZeroExit false then result gt if result code
  • 如何防止密码和其他敏感信息出现在 ASP.NET 转储中?

    如何防止在 IIS ASP NET 转储文件中向 ASP NET 网页提交和接收密码和其他敏感数据 重现步骤 使用 Visual Studio 2010 创建 ASP NET MVC 3 Intranet 应用程序 将其配置为使用 IIS
  • Spring嵌套事务

    在我的 Spring Boot 项目中 我实现了以下服务方法 Transactional public boolean validateBoard Board board boolean result false if inProgress
  • 更新更改 svn 时出错

    我安装了 PHPStorm 并使用 SVN 打开包含 PHP 项目的目录 在 更改 的 SVN 选项卡下 我遇到以下错误 Error updating changes svn E155021 The client is too old to
  • Spring JPA Repository - 在服务器重启时保留数据

    我目前正在尝试学习如何使用 Spring Boot 但遇到一个问题 我不确定如何解决 我已经按照使用 JPA 访问数据 http spring io guides gs accessing data jpa 指导 一切正常 但是 如果我重新
  • Pandas 和 Matplotlib - fill_ Between() 与 datetime64

    有一个 Pandas 数据框
  • ggplot 中的热图,每组不同的颜色

    我正在尝试在 ggplot 中生成热图 我希望每个组都有不同的颜色渐变 但不知道该怎么做 我当前的代码如下所示 dummy data data lt data frame group sample c Direct Patient Care
  • OL3:强制重绘图层

    我目前正在将 OpenLayers 客户端版本 2 13 1 升级为新版本的 OpenLayers OL3 我的设置包括作为 WMS 映射服务器的 Mapserver 和前面提到的 OpenLayers 客户端 在旧系统中 我支持用户交互
  • R 中百分比格式表

    我想获取一个百分比表 将值格式化为百分比并以良好的格式显示它们 如果重要的话 我正在使用 RStudio 并编织为 PDF 我看过其他关于此的帖子 但它们看起来都不干净 而且效果不佳 例如 下面的 apply 语句确实采用百分比格式 但是
  • 检索两个字符之间的子字符串

    我有这样的字符串 var str it itA itB et etA etB etC etD 如何检索 和 之间的元素 截至目前 我正在用新行分割文本 但无法解决这个问题 请帮我解决这个问题 请使用这个小提琴http jsfiddle ne
  • IronPython - JSON 选择

    在 IronPython 2 0 1 中处理 JSON 的最佳方法是什么 原生 Python 标准库 json 看起来尚未实现 如果我想使用 Newtonsoft Json NET 库 我该怎么做 我可以将程序集添加到 GAC 但我还有其他
  • 如何使用 php 渲染远程图像?

    这是一个 jpg https i stack imgur com PIFN0 jpg 假设我希望这个渲染自 img php file name PIFN0 jpg 以下是我尝试完成这项工作的方法 样本 php p Here s my ima
  • UICollectionView 启用取消选择单元格,同时禁用 allowedMultipleSelection

    When collectionView allowsMultipleSelection YES 我可以取消选择已选择的单元格 when collectionView allowsMultipleSelection NO 我无法取消选择已选择
  • Fortran 中不提升数组的标量参数

    为什么 Fortran 会将标量表达式提升为数组表达 但不作为过程的参数 特别是 为什么标准机构做出这样的设计决定 仅仅是因为含糊不清 程序就应该超载吗 在这种情况下 错误消息是否可以作为替代方法 例如 在下面的代码中 最后一条语句 x f
  • Jsoup,在执行表单POST之前获取值

    这是我用来提交表单的代码 Connection Response res Jsoup connect http example com data id myID data username myUsername data code MyAu
  • iPhone:cocos2d 中相机跟随玩家

    我正在用 cocos2d 制作 iPhone 游戏 我想知道如何使相机 视图遵循特定的精灵 我会使用 CCCamera 类吗 是的 CCCamera 可以工作 然而 它有一些缺点 使其不适合某些用途 相对于该精灵移动图层以及所有其他对象可能
  • 在 StructureMap 中注册一个默认实例

    我有一堂课 MyService 具有静态属性 MyService Context 代表当前上下文 特定于当前登录的用户 因此它会发生变化 我想要实现的目标 ObjectFactory Initialize x gt x For
  • 在 WPF 中,我们如何将 Duration 定义为资源?

    我在许多动画中使用了一个持续时间 0 0 0 5 并且我想仅在一个位置定义该数字 我可以将双精度定义为
  • 在 Win32 API 中绘制格式化文本的最快方法是什么?

    我正在使用普通 Win32 API 在 C 中实现一个文本编辑器 并且我正在尝试找到实现语法突出显示的最佳方法 我知道有像 scintilla 这样的现有控件 但我这样做是为了好玩 所以我想自己完成大部分工作 我还希望它又快又轻 从我到目前