Заполните пользовательскую область цветом - PullRequest
4 голосов
/ 27 ноября 2011

Как мне заполнить выделенную область цветом?

var Rect: TRect;
    Color: TColor;
begin
  //fill area with color
end;

Ответы [ 2 ]

9 голосов
/ 27 ноября 2011

Вы не указали, что вы подразумеваете под пользовательской областью , и вы говорите о "выбранной области".Я не знаю, что вы имеете в виду.

Для простого прямоугольника вы обычно заполняете прямоугольник TCanvas.FillRect.

Canvas.Brush.Style := bsSolid;
Canvas.Brush.Color := Color;
Canvas.FillRect(R);

, где R - это TRect, указывающеепрямоугольник.

Для более сложной области необходимо использовать функцию GDI в Windows FillRgn.Эта функция не заключена в TCanvas, но вы можете просто вызвать ее, передав TCanvas.Handle как HDC.

2 голосов
/ 27 ноября 2011

Вы должны быть МНОГО более конкретным, но это должно привести вас в правильном направлении:

procedure DoMyDrawing(Canvas: TCanvas; L, T, R, B: Integer; Color: TColor);
var
  Rec: TRect;
begin
  Rec.Left:= L;
  Rec.Top:= T;
  Rec.Right:= R;
  Rec.Bottom:= B;
  //SAME AS Rec:= Rect(L, T, R, B);
  Canvas.Brush.Color:= Color;
  Canvas.Brush.Style:= bsSolid;
  Canvas.Pen.Style:= psClear;
  Canvas.FillRect(Rec);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  DoMyDrawing(Self.Canvas, 10, 10, 50, 50, clNavy);
end;

EDIT:

Я бы рекомендовал использовать TRect вместо 4-х координат (Left, Top, Right и Bottom), потому что TRect включает в себя все 4 из них. Вы также можете прочитать TRect с помощью TopLeft TPoint и BottomRight TPoint.

(я также исправил опечатку выше - Canvas.FillRect(R); должен был быть Canvas.FillRect(Rec);)

Вот еще одна версия той же процедуры:

procedure DoMyDrawing(Canvas: TCanvas; const R: TRect; const Color: TColor);
begin
  Canvas.Brush.Color:= Color;
  Canvas.Brush.Style:= bsSolid;
  Canvas.Pen.Style:= psClear;
  Canvas.FillRect(R);
end;

Намного проще, не правда ли?


ДРУГОЕ РЕДАКТИРОВАНИЕ:

Также обратите внимание на функцию, которую я использую Rect(Left, Top, Right, Bottom) - Это тоже упрощает задачу. К сожалению, я видел некоторые стандартные элементы управления VCL, которые имеют события с параметрами с именем Rect: TRect;, что мешает использовать оригинальную функцию в модуле classes. Поэтому также избегайте использования переменной с именем Rect, поскольку она не позволит вам использовать функцию Rect (которая превращает 4 строки кода в 1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...