65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.72/5 (21投票s)

2003年6月6日

2分钟阅读

viewsIcon

157128

downloadIcon

6331

使用双缓冲绘制、定位和调整框的大小

引言

在 VC++ 中,我们有一个类 CRectTracker,它有助于绘制跟踪器,还有一个函数 DrawFocusRect(),可以实现跟踪器的行为。 在 C# 中,我没有找到任何这种功能(如果存在,那么我现在不知道)。 所以我决定编写一个程序,该程序使用跟踪器绘制框并允许通过跟踪器进行操作。

主要特点

  • 绘制跟踪器
  • 移动附有跟踪器的框。
  • 借助跟踪器调整框的大小。
  • 选择以 Z 顺序进行。

我试图避免使用 Form 的 Invalidate() 函数,因为它会产生闪烁效果,并且绘图不流畅。 我设计该程序是为了最大限度地利用双缓冲来避免闪烁效果。

使用代码

类 CRectTracker

方法 功能
DrawSelectionGhostRect() 在指定的位图上绘制给定的幽灵矩形
InitTrackerRects() 初始化跟踪器的八个矩形。
DrawSelectionTrackers() 绘制已经初始化的跟踪器矩形
CursorCheck() 检查光标的位置并使用合适的光标更改表单光标,并返回用于调整大小目的的矩形边框。

在主程序中有三种程序模式。 第一种是“无模式”,表示用户未进行绘制,第二种模式是“绘制模式”,当用户从工具栏中选择框图标时调用该模式,第三种是“选择模式”,当用户选择一个框用于更改位置或大小的时候调用它。  

有一个主位图,它保存当前的绘图。 每当需要更改时,例如绘制橡皮筋选择或绘制跟踪器时,都会制作主位图的副本并将其保存在 TrackerImage 位图中,并且所有更改都在其中进行,最后将其分配给主位图。 即使需要重绘,也会调用 RePaintForm() 函数,而不是调用表单的 paint() 函数,以避免闪烁效果。

结论

包含一个简单的程序,演示了双缓冲和跟踪器绘制。 OnPaint() 会产生闪烁效果,因此建议先在位图上绘制,然后在表单上绘制。

© . All rights reserved.