使用双缓冲绘制跟踪器,移动和调整对象的大小。






4.72/5 (21投票s)
2003年6月6日
2分钟阅读

157128

6331
使用双缓冲绘制、定位和调整框的大小
引言
在 VC++ 中,我们有一个类 CRectTracker
,它有助于绘制跟踪器,还有一个函数 DrawFocusRect()
,可以实现跟踪器的行为。 在 C# 中,我没有找到任何这种功能(如果存在,那么我现在不知道)。 所以我决定编写一个程序,该程序使用跟踪器绘制框并允许通过跟踪器进行操作。
主要特点
- 绘制跟踪器
- 移动附有跟踪器的框。
- 借助跟踪器调整框的大小。
- 选择以 Z 顺序进行。
我试图避免使用 Form 的 Invalidate()
函数,因为它会产生闪烁效果,并且绘图不流畅。 我设计该程序是为了最大限度地利用双缓冲来避免闪烁效果。
使用代码
类 CRectTracker
方法 | 功能 |
DrawSelectionGhostRect() |
在指定的位图上绘制给定的幽灵矩形 |
InitTrackerRects() |
初始化跟踪器的八个矩形。 |
DrawSelectionTrackers() |
绘制已经初始化的跟踪器矩形 |
CursorCheck() |
检查光标的位置并使用合适的光标更改表单光标,并返回用于调整大小目的的矩形边框。 |
在主程序中有三种程序模式。 第一种是“无模式”,表示用户未进行绘制,第二种模式是“绘制模式”,当用户从工具栏中选择框图标时调用该模式,第三种是“选择模式”,当用户选择一个框用于更改位置或大小的时候调用它。
有一个主位图,它保存当前的绘图。 每当需要更改时,例如绘制橡皮筋选择或绘制跟踪器时,都会制作主位图的副本并将其保存在 TrackerImage 位图中,并且所有更改都在其中进行,最后将其分配给主位图。 即使需要重绘,也会调用 RePaintForm()
函数,而不是调用表单的 paint()
函数,以避免闪烁效果。
结论
包含一个简单的程序,演示了双缓冲和跟踪器绘制。 OnPaint()
会产生闪烁效果,因此建议先在位图上绘制,然后在表单上绘制。