【问题标题】:Using GDI+ with legacy C based win32 system using GDI将 GDI+ 与使用 GDI 的基于 C 的传统 win32 系统一起使用
【发布时间】:2017-03-10 23:58:43
【问题描述】:

在使用 win32 C/C++ 编写的系统上工作,它使用 GDI 绘制复杂机器(热交换器)的横截面,大多数编写的代码是基于 C 的(不是 C++,因此没有面向对象编程)。我想知道我是否可以在这个系统中使用 GDI+。

目前所有代码都使用基本的 GDI 原语,如 HPEN、HBRUSH、Polygon()、Rectangle()、MoveToEx()、LineTo()、DrawText() 等。启用或开始使用 GDI+ 的一个很好的理由是绘制组件通知工具提示的上下文详细信息,请参阅此 SO question。我读过 GDI+ 的字体渲染不如 GDI 高效 (link)。

总结一下,我可以在这个老旧的系统上使用 GDI+(重写是不可能的,因为它有一个庞大的代码库)。其次,如果我迁移到 GDI+,性能会受到影响吗?

【问题讨论】:

  • 您可以使用任何您想要的系统进行绘制,最坏的情况是您甚至可以开始使用 GDI 在位图上绘制,然后继续使用 GDI+,最后在屏幕上或最初 GDI 的任何位置上对位图进行 blit画了;从屏幕上绘制到在位图上绘制遗留代码部分的切换应该只是在 DC 创建中。对于性能影响,没有比直接衡量更好的方法了。
  • 使用底层的基于 C 的 api 并非不可能,但它肯定是残酷和不寻常的惩罚,而且文档很少。是时候向这个项目添加一些 C++ 代码了,声明你的 C++ 绘画辅助函数 extern "C" 这样链接器会很高兴。

标签: c performance winapi gdi+ gdi


【解决方案1】:

我想知道我是否可以在这个系统中使用 GDI+。

GDI+ documentation 表明答案是肯定的。

特别是它说:

开发者受众

GDI+ C++ 基于类的接口专为 C/C++ 程序员使用而设计。要求熟悉 Windows 图形用户界面和消息驱动架构。

至于它是否会变慢,我怀疑你几乎看不到性能损失,只是因为这只不过是那些相同的 Win32 GDI API 函数之上的一个薄 C++ 层。

【讨论】:

  • 不,GDI+ 不是 GDI 之上的薄层。 GDI+ 是它自己的自定义绘图模型,它从头开始做所有事情以提供更高质量的图形(而 IIRC GDI+ 全部在软件中完成,这就是为什么它的性能优于 GDI,但我不是 100% 确定)。话虽如此,OP 专门要求一个 C 接口,而 GDI+ 确实有一个:“平面 API”(但这里是龙)。至于 OP,由于您不需要取悦尽可能多的人并了解您的要求,因此请评估和基准测试以确定哪个 API 最能满足您的目标。
  • 我发布的链接说专为 C/C++ 程序员使用而设计,这表明它对 C 程序员来说也是一个可行的解决方案。
  • 正确,但随后您在其余答案中谈到了 C++ 接口,或者至少我是这么读的。我只是提供特定于 C 的信息以更直接地突出显示它,以防 OP 意外达到相同的含义。对沟通不畅表示歉意。
  • @IInspectable GDI 和 GDI+ 可以混合使用,但只能在 HDC 之上创建 GDI+ 绘图表面,以便 GDI+ 图形可以渲染到 GDI。但是你不能使用 GDI 来绘制 GDI+ 图形。
猜你喜欢
  • 2021-06-08
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 2010-11-18
  • 2018-11-25
  • 1970-01-01
相关资源
最近更新 更多