Delphi graphics32 删除选中图层
Delphi graphics32 delete selected layer
graphics32 是一个非常好的库,但我不知道如何正确使用它。
例如 LAYERS,它们是一个很棒的功能。
我可以向 ImageView 添加层,select 它们,移动它们,调整它们的大小,但是,如果我想删除它们,我不知道该怎么做。
该层也已 selected,但我无法捕获其上的任何关键事件。我的意思是我想使用键盘上的箭头将图层移动一个像素,但我不能。
有人知道如何解决这些问题吗?
请帮忙
谢谢
捕获箭头键的关键是允许这样做。为此,您需要调整底层 TCustomPaintBox32 class.
的 public(但未发布)属性
类似
ImgView.Options := ImgView.Options + [pboWantArrowKeys];
应该允许 TImgView32 class(此处命名为 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 通过将增量(第二个和第三个参数)添加到 Left/Right 和 Top/Bottom.
来调整 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;
graphics32 是一个非常好的库,但我不知道如何正确使用它。 例如 LAYERS,它们是一个很棒的功能。
我可以向 ImageView 添加层,select 它们,移动它们,调整它们的大小,但是,如果我想删除它们,我不知道该怎么做。
该层也已 selected,但我无法捕获其上的任何关键事件。我的意思是我想使用键盘上的箭头将图层移动一个像素,但我不能。
有人知道如何解决这些问题吗?
请帮忙 谢谢
捕获箭头键的关键是允许这样做。为此,您需要调整底层 TCustomPaintBox32 class.
的 public(但未发布)属性类似
ImgView.Options := ImgView.Options + [pboWantArrowKeys];
应该允许 TImgView32 class(此处命名为 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 通过将增量(第二个和第三个参数)添加到 Left/Right 和 Top/Bottom.
来调整 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;