TAChart: Extract TChartMarks.MeasureLabel function.

+ Take label font into account while measuring mark labels.

git-svn-id: trunk@24110 -
This commit is contained in:
ask 2010-03-20 11:47:31 +00:00
parent 4f98042b2f
commit d474f1e6a3
2 changed files with 23 additions and 9 deletions

View File

@ -560,19 +560,12 @@ var
labelRect: TRect;
dummy: TRect = (Left: 0; Top: 0; Right: 0; Bottom: 0);
labelText: String;
labelSize: TSize;
begin
labelText := FormattedMark(AIndex);
if labelText = '' then exit;
labelSize := ACanvas.TextExtent(labelText);
labelRect.Left := ADataPoint.X - labelSize.cx div 2;
if ADown then
labelRect.Top := ADataPoint.Y + Marks.Distance
else
labelRect.Top := ADataPoint.Y - Marks.Distance - labelSize.cy;
labelRect.BottomRight := labelRect.TopLeft + labelSize;
InflateRect(labelRect, MARKS_MARGIN_X, MARKS_MARGIN_Y);
labelRect := Marks.MeasureLabel(ACanvas, labelText, ADown);
OffsetRect(labelRect, ADataPoint.X, ADataPoint.Y);
if
not IsRectEmpty(FPrevLabelRect) and
IntersectRect(dummy, labelRect, FPrevLabelRect)

View File

@ -144,6 +144,8 @@ type
procedure DrawLabel(
ACanvas: TCanvas; const ALabelRect: TRect; const AText: String);
function IsMarkLabelsVisible: Boolean;
function MeasureLabel(
ACanvas: TCanvas; const AText: String; ADown: Boolean): TRect;
published
// If false, labels may overlap axises and legend.
property Clipped: Boolean read FClipped write SetClipped default true;
@ -243,6 +245,9 @@ type
implementation
uses
Types;
{ TChartPen }
procedure TChartPen.Assign(Source: TPersistent);
@ -439,6 +444,22 @@ begin
Result := Visible and (Style <> smsNone) and (Format <> '');
end;
function TChartMarks.MeasureLabel(
ACanvas: TCanvas; const AText: String; ADown: Boolean): TRect;
var
labelSize: TSize;
begin
ACanvas.Font.Assign(LabelFont);
labelSize := ACanvas.TextExtent(AText);
Result.Left := - labelSize.cx div 2;
if ADown then
Result.Top := Distance
else
Result.Top := - Distance - labelSize.cy;
Result.BottomRight := Result.TopLeft + labelSize;
InflateRect(Result, MARKS_MARGIN_X, MARKS_MARGIN_Y);
end;
procedure TChartMarks.SetClipped(const AValue: Boolean);
begin
if FClipped = AValue then exit;