Как удалить прямоугольник, созданный с помощью Canvas?
У меня есть прямоугольник, который нарисован в TPaintBox
компонент с помощью моей мыши. Итак, как удалить этот прямоугольник (всего) из моего приложения после "события мыши вверх" TPaintBox
?
Любое предложение будет приветствоваться.
Вот мой код, который рисует этот прямоугольник:
private
FSelecting: Boolean;
FSelection: TRect;
end;
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FSelection.Left := X;
FSelection.Top := Y;
FSelecting := True;
end;
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if FSelecting then
begin
FSelection.Right := X;
FSelection.Bottom := Y;
PaintBox1.Invalidate;
end;
end;
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
FSelecting := False;
FSelection.Right := X;
FSelection.Bottom := Y;
PaintBox1.Invalidate;
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
PaintBox1.Canvas.Brush.Color := clRed;
PaintBox1.Canvas.Rectangle(FSelection);
end;
1 ответ
Вы не можете удалить рисунок, вы должны нарисовать что-то еще поверх него.
В коде, который вы показали, вы можете просто установить FSelection
в пустой прямоугольник 0x0 и Invalidate()
PaintBox
снова. Будет нарисована его нормальная картинка, и вы не будете рисовать прямоугольник поверх нее.
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
FSelection := Rect(X, Y, X, Y);
FSelecting := True;
end;
end;
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if FSelecting then
begin
FSelection.Right := X;
FSelection.Bottom := Y;
PaintBox1.Invalidate;
end;
end;
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (Button = mbLeft) and FSelecting then
begin
FSelecting := False;
FSelection := Rect(0, 0, 0, 0);
PaintBox1.Invalidate;
end;
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
//...
PaintBox1.Canvas.Brush.Color := clRed;
PaintBox1.Canvas.Rectangle(FSelection);
end;
Или, если вам нужно запомнить выбранный прямоугольник для использования с другими вещами, то просто не рисуйте выделенный прямоугольник на PaintBox
когда FSelecting
ложно
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
FSelection := Rect(X, Y, X, Y);
FSelecting := True;
end;
end;
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if FSelecting then
begin
FSelection.Right := X;
FSelection.Bottom := Y;
PaintBox1.Invalidate;
end;
end;
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if (Button = mbLeft) and FSelecting then
begin
FSelecting := False;
PaintBox1.Invalidate;
end;
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
//...
if FSelecting then
begin
PaintBox1.Canvas.Brush.Color := clRed;
PaintBox1.Canvas.Rectangle(FSelection);
end;
end;
В любом случае, для хорошей меры, вы должны нарисовать прямоугольник, прозрачный с пунктирной границей, чтобы пользователь мог видеть, что он выбирает, не будучи слишком навязчивым:
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
//...
if FSelecting then
begin
PaintBox1.Canvas.Brush.Style := bsClear;
PaintBox1.Canvas.Pen.Style := psDot;
PaintBox1.Canvas.Rectangle(FSelection);
end;
end;