Delphi graphics32删除选中的图层

时间:2015-01-17 05:32:13

标签: delphi graphics32

graphics32是一个非常好的库,但我无法弄清楚如何正确使用它。 例如LAYERS,它们是一个很棒的功能。

  • 我可以将图层添加到ImageView,选择它们,移动它们,调整它们的大小,但是,如果我想删除它们,我不知道该怎么做。

  • 此外,图层已被选中,但我无法捕获它们上的任何关键事件。我的意思是我想使用键盘上的箭头按像素移动图层,但我不能。

有人知道如何解决这些问题吗?

请帮忙 谢谢

1 个答案:

答案 0 :(得分:1)

捕获箭头键的关键是允许这样做。为此,您需要调整基础TCustomPaintBox32类的公共(但未发布)属性。

这样的东西
ImgView.Options := ImgView.Options + [pboWantArrowKeys];

应允许TImgView32类(此处名为ImgView)捕获箭头键。

启用后,您可以编写键盘处理程序,如:

procedure TMainForm.ImgViewKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  Location: TFloatRect;
begin
  if Assigned(FSelection) then
    case Key of
      VK_LEFT:
        FSelection.Location := OffsetRect(FSelection.Location, -1, 0);
...

其中OffsetRect通过将增量(第2和第3个参数)添加到左/右和上/下来调整TFloatRect。

在上面的示例中,FSelection是当前选定的图层。选择图层后(单击鼠标)存储它。此外,如果您使用TRubberBandLayer作为选择器,您可能还需要调整橡皮带位置。

附录:

OffsetRect的实现:

function OffsetRect(const Rct: TFloatRect; const DeltaX, DeltaY: TFloat): TFloatRect;
begin
  Result.TopLeft := OffsetPoint(Rct.TopLeft, DeltaX, DeltaY);
  Result.BottomRight := OffsetPoint(Rct.BottomRight, DeltaX, DeltaY);
end;

或者你可以直接使用这样的代码:

procedure TMainForm.ImgViewKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  Location: TFloatRect;
begin
  if Assigned(FSelection) then
    case Key of
      VK_LEFT:
        FSelection.Location := FloatRect(FSelection.Location.Left - 1, FSelection.Location.Top, FSelection.Location.Right - 1, FSelection.Location.Bottom);
...

但这看起来有点难看。

附录2:

对于旧版本的库(例如1.9.x),OffsetPoint函数也可能会丢失。这实现为:

function OffsetPoint(const Pt: TFloatPoint; DeltaX, DeltaY: TFloat): TFloatPoint;
begin
  Result.X := Pt.X + DeltaX;
  Result.Y := Pt.Y + DeltaY;
end;