Как удалить прямоугольник, созданный с помощью 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;
Другие вопросы по тегам