【问题标题】:Windows GDI - FillRect vs MoveToEx & LineTo?Windows GDI - FillRect vs MoveToEx & LineTo?
【发布时间】:2020-03-18 18:35:44
【问题描述】:

当阅读在 Windows 中使用GDI 画线的源代码时,尽管唯一的目的是画线,但使用FillRect() 是相对常见的。但是画一条带宽度值的线和一个填充矩形的最终结果是不是很相似?

FillRect() 是 1 个函数调用,使用 MoveToEx 和 LineTo 需要 2 个

当需要画线时,使用FillRect()MoveToEx()和LineTo()哪个更有效?

【问题讨论】:

  • FillRect 不能替代 LineTo,它只能绘制完美的水平或垂直矩形。这很容易而且很明显,性能不是什么大问题。
  • 打印效果不同。我认为打印时厚度为 1 的线条太窄,厚度为 2 的线条太粗。 FillRect 可以是一个解决方案,但这取决于地图模式等。

标签: windows gdi


【解决方案1】:

在最常见的情况下,FillRect 将与 MoveToEx 和 LineTo 执行相同的操作,以获得完美的水平和垂直矩形。如今,GDI 和屏幕之间的间接层太多了,性能差异几乎可以肯定是无关紧要的。

GDI 中的绘图操作通常取决于设备上下文 (DC) 的当前“状态”。使用当前选择到 DC 中的任何笔来绘制线条。笔决定颜色、样式(实线、虚线等)、粗细、端盖等。

然而,FillRect 并不依赖于大部分 DC 状态。所有绘图图元都依赖于映射模式和剪切区域,但与线条不同的是,FillRect 甚至不依赖于选定的画笔,因为您可以在调用中提供一个权限。

更改状态(选择哪些对象进入 DC)可能需要大量工作。如果你知道你想要一条 2 像素粗的蓝色水平线,那么使用 FillRect 比首先创建一支笔、将其选择到 DC、画线、选择笔然后决定如何管理那支笔的生命周期(什么时候删除它?)。如果绘图的其余部分是一堆带有圆形端盖的黄色虚线,则不必保持切换状态可以使代码更简单。

【讨论】:

  • FillSolidRect() 更容易使用,您可以在其中简单地提供颜色,而不需要画笔。我不知道它是否也快了一点,但可能很难测量。
  • @Nick:或者使用 DC 刷子。或者使用背景颜色的不透明 TextOut,这曾经是绘制轴对齐矩形的最快方法。也可能是 DrawText。
  • FillSolidRect 可以避免创建画笔,但使用 DrawText 对我来说是一种新方法(这还需要一个额外的函数调用 SetBackgroundColor)。
  • @Nick:是的,我明白了。然而,直流电刷是预先创建的。在 GDI 由显卡硬件加速的时代,TextOut(或 DrawText)技巧被认为更快。如果你只画一个矩形,那么时间差异可能可以忽略不计。如果您正在绘制 n 个矩形,那么设置成本(创建画笔、选择它或设置背景颜色等)将在绘制时分摊。
猜你喜欢
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 2011-05-31
  • 2011-01-07
  • 2011-11-05
  • 2011-12-17
  • 2023-03-03
  • 2016-10-06
相关资源
最近更新 更多