windows - Windows GDI - FillRect vs MoveToEx & LineTo?
问题描述
当阅读使用GDI在 Windows 中画线的源代码时,尽管唯一的目的是画线,但使用FillRect()是相对常见的。但是绘制一条具有宽度值的线和一个填充的矩形的最终产品非常相似,不是吗?
FillRect() 是 1 个函数调用,使用 MoveToEx 和 LineTo 需要 2
当需要画线时,使用FillRect()或MoveToEx( ) 和LineTo()哪个更有效?
解决方案
在最常见的情况下,FillRect 将与 MoveToEx 和 LineTo 执行相同的操作,以获得完美的水平和垂直矩形。如今,GDI 和屏幕之间有太多的间接层,以至于性能差异几乎可以肯定是无关紧要的。
GDI 中的绘图操作通常取决于设备上下文 (DC) 的当前“状态”。使用当前选择到 DC 中的任何笔来绘制线条。笔决定颜色、样式(实线、虚线等)、粗细、端盖等。
然而,FillRect 并不依赖于大部分 DC 状态。所有绘图图元都依赖于映射模式和剪切区域,但与线条不同的是,FillRect 甚至不依赖于选定的画笔,因为您可以在调用中提供一个权限。
更改状态(选择哪些对象进入 DC)可能需要做很多工作。如果你知道你想要一条 2 像素粗的蓝色水平线,那么使用 FillRect 比先创建一支笔,将它选择到 DC,画线,选择笔,然后决定如何管理那支笔的生命周期(什么时候删除它?)。如果绘图的其余部分是一堆带有圆形端盖的黄色虚线,则不必保持切换状态可以使代码更简单。
推荐阅读
- c# - c# json 只合并值(忽略缺失的字段)
- aurelia - 使用 Aurelia Store 在 Actions 中复制状态的最佳方式是什么?
- javascript - 在网格中显示组合框值的问题
- python - 检查传递给函数的关键字参数的真实性不能按预期工作 - 为什么?
- jquery - 文本溢出省略号和扩展不起作用
- php - 使用时区将 SQL TimeStamp 格式化为 TimeStamp
- java - 查找所有带有自定义注释的 bean 并从此 bean 创建解析器
- c# - 如何检查 Unity 的 Firebase 数据库中是否已存在键/值
- angular - 面临从组件的角度获取服务价值的问题
- angular - Angular:有条件的父组件