【发布时间】:2012-06-04 00:30:41
【问题描述】:
我正在构建一个自定义列表控件,类似于列表视图但更轻。它的每个项目都有ItemWidth 和ItemHeight 属性,这些项目位于TOwnedCollection 中。每个项目的大小相同。我还有Margins 和ItemSpacing 的属性来指定每个项目的位置相距多远。
问题在于计算每个项目的位置以使其最适合当前控制空间。该控件只有垂直滚动,没有水平滚动。因此,我需要识别出某个项目何时无法放入列表并将其带到下一行。
为了使这更棘手,我还必须能够识别给定点是否在项目的矩形区域内,以处理鼠标事件。所以为了解决这个问题,我决定在每个项目 GetRect 上放置一个函数,它将在控件上返回该项目的 Rect 区域。但是如何让这个函数计算这个呢?
这个函数的两个主要实现会在控件的Paint中:
for X := 0 to FItems.Count - 1 do begin
Canvas.Rectangle(FItems[X].GetRect);
end;
当确定一个点是否在这个项目的区域内时:
for X := 0 to FItems.Count - 1 do begin
R:= FItems[X].GetRect;
Result := (P.X > R.Left) and (P.X < R.Right) and (P.Y > R.Top) and (P.Y < R.Bottom);
end;
【问题讨论】:
-
如果您停止将其视为列表视图控件并开始将其视为网格控件,它可能会帮助您理解事物。
标签: delphi custom-controls listitem