Код:
// --------------- нажата кнопка мыши ------------------------
procedure TMainForm.ImageMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
X0 := X;
Y0 := Y;
MDown:= true;
if SpeedButton_Select.Down or SpeedButton_Rectangle.Down //*********** используем инструмент "выделение" или
or SpeedButton_FillRectangle.Down then // "прямоугольникбез заливки" или "прямоугольник с заливкой"
begin
{режим работы с фрагментом}
// Image.Canvas.Pen.Color:= PenColorShape.Brush.Color;
if REnd then
begin
{стирание прежней рамки}
Image.Canvas.DrawFocusRect(R);
if (X < R.Right) and (X > R.Left) and (Y > R.Top) and
(Y < R.Bottom) {режим начала перетаскивания фрагмен-
та} then
begin
{установка флагов}
RDrag:= true;
REnd:= false;
{запоминание начального положения перетаскиваемого
фрагмента}
R0.TopLeft := R.TopLeft;
R0.BottomRight := R.BottomRight;
{запоминание изображения}
BitMap.Assign(Image.Picture);
{установка цвета кисти}
Image.Canvas.Brush.Color :=
BrushColorShape.Brush.Color;
// MCopy.Enabled := false;
// MCut.Enabled := false;
end;
end else
begin {режим начала рисования рамки фрагмента}
RBegin := true;
REnd := false;
R.TopLeft := Point(X, Y);
R.BottomRight := Point(X, Y);
Image.Canvas.DrawFocusRect(R);
end;
end else
if SpeedButton_Eraser.Down then // *********** используеминструмент "ластик"
begin
R := Rect(X - 6, Y - 6, X + 6, Y + 6);
Image.Canvas.DrawFocusRect(R);
// Image.Canvas.Brush.Color := BrushColorShape.Brush.Color;
Image.Canvas.FillRect(Rect(X - 5, Y - 5, X + 5, Y + 5));
end else
if SpeedButton_Pen.Down then // *********** используем инст-румент "карандаш"
begin
Image.Canvas.MoveTo(X, Y);
Image.Canvas.Pen.Color := PenColorShape.Brush.Color;
end else
if SpeedButton_Line.Down then // *********** используем ин-струмент "линия"
begin
X1 := X;
Y1 := Y;
//режим pmNotXor позволяет при движении мыши стирать изо-бражение линии;
Image.Canvas.Pen.Mode := pmNotXor;
Image.Canvas.Pen.Color := PenColorShape.Brush.Color;
end else
if SpeedButton_FillEllipse.Down then // *********** исполь-зуем инструмент "эллипс с заливкой"
begin
end else
if SpeedButton_Fill.Down then // *********** используем ин-струмент "заливка"
begin
if Button = mbLeft then
Image.Canvas.Brush.Color:= PenColorShape.Brush.Color
else
Image.Canvas.Brush.Color:= BrushColorShape.Brush.Color;
Image.Canvas.FloodFill(X,Y, Image.Canvas.Pixels[X, Y],
fsSurface);
end;
end;
// мышь передвигается
procedure TMainForm.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if MDown then
begin
if (SpeedButton_Select.Down and (RBegin or RDrag)) or
SpeedButton_Rectangle.Down or
SpeedButton_FillRectangle.Down then
with Image.Canvas do
begin
// Pen.Color:= PenColorShape.Brush.Color;
if RBegin then
begin
{Режим рисования рамки фрагмента}
DrawFocusRect(R);
if X0 < X then
begin
R.Left := X0;
R.Right := X
end
else
begin
R.Left := X;
R.Right := X0
end;
if Y0 < Y then
begin
R.Top := Y0;
R.Bottom := Y
end
else
begin
R.Top := Y;
R.Bottom := Y0
end;
DrawFocusRect(R);
end
else if SpeedButton_Select.Down then
begin
{Режим перетаскивания фрагмента}
{восстановление изображения под перетаскиваемым фраг-
ментом}
CopyRect(R, BitMap.Canvas, R);
{если не нажата клавиша Ctrl - стирание изображения в
R0}
if not (ssCtrl in Shift) then
FillRect(R0);
{формирование нового положения фрагмента}
R.Left := R.Left + X - X0;
R.Right := R.Right + X - X0;
R.Top := R.Top + Y - Y0;
R.Bottom := R.Bottom + Y - Y0;
{запоминание положения курсора мыши}
X0 := X;
Y0 := Y;
{рисование фрагмента в новом положении}
CopyRect(R, BitMap.Canvas, R0);
{рисование рамки}
DrawFocusRect(R);
end;
end else
if SpeedButton_Eraser.Down then // *********** используеминструмент "ластик"
begin
Image.Canvas.DrawFocusRect(R);
R := Rect(X - 6, Y - 6, X + 6, Y + 6);
Image.Canvas.DrawFocusRect(R);
Image.Canvas.FillRect(Rect(X - 5, Y - 5, X + 5, Y + 5));
end else
if SpeedButton_Pen.Down then // *********** используем ин-струмент "карандаш"
Image.Canvas.LineTo(X, Y) else
if SpeedButton_Line.Down then // *********** рисуем времен-ную линию
with Image.Canvas do
begin
{стирание прежней линии}
MoveTo(X0, Y0);
//стирается линия в прежнем положении (это необходимо,т.к. метод LineTo
LineTo(X1, Y1);
//рисует линию,начинающуюся в текущей позиции пера и за-канчивающуюся
{рисование новой линии}//в указанной точке, исключая эту ко-нечную точку.
MoveTo(X0, Y0); //рисуется новая линия;
LineTo(X, Y);
X1 := X; {запоминание новых координат конца линии}
Y1 := Y;
end else
if SpeedButton_FillEllipse.Down then // *********** рисуемвременный эллипс
begin
end;
end;
end;