我正在構建一個自定義列表控件,類似於列表視圖,但更輕。它的物品分別爲ItemWidth
和ItemHeight
,物品在TOwnedCollection
。每個項目是相同的大小。我還有Margins
和ItemSpacing
的屬性來指定相隔多遠來定位每個項目。如何識別自動排列列表中的列表項的rect?
問題在於何時計算每個項目的位置以使其最適合當前控制空間。該控件只有垂直滾動,並且沒有水平。因此,我需要識別某個項目何時無法放入列表中並將其帶到下一行。
爲了使這更加棘手,我還必須能夠識別給定點是否位於項目的矩形區域內,以便處理鼠標事件。所以爲了解決這個問題,我決定在每個項目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;
如果您不再將其視爲列表視圖控件,並開始將其視爲網格控件,它可能會幫助您理解事物。 –