当 DragImage.Height > 300 时,IFMXDragDropService 出现意外的渐变效果

问题描述 投票:0回答:1

我有一个纸牌游戏,我使用 IFMXDragDropService 将一系列纸牌从一个堆栈拖动到另一个堆栈。我更喜欢非半透明的拖动图像(this VCL 解决方案在 FMX 中不起作用),但除此之外它可以满足我的要求,直到卡运行足够长以至于拖动图像高度 >300。从那时起,拖动图像透明度具有 x 轴渐变效果。

可以使用具有 2 个 TImage 控件的表单看到效果,其中一个控件的高度为 <=300 and the other >300。 (宽度 >300 也会产生 x 轴效果。)将匹配大小的 PNG 加载到表单的 Create 事件中的每个 TImage.Bitmap 属性中。将以下代码分配给每个 TImage 的 OnMouseDown 事件:

procedure TFormFMXDrag.ImgMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;
  X, Y: Single);
var
  Svc: IFMXDragDropService;
  DragData: TDragObject;
  DragImage: TBitmap;
begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXDragDropService, Svc) then
  begin
    DragImage := TBitmap.Create;
    try
      DragImage.Assign(TImage(Sender).Bitmap);
      DragData.Source := Sender;
      Svc.BeginDragDrop(FormFMXDrag, DragData, DragImage);
    finally
      DragImage.Free;
    end;
  end;
end;

DragImage.Height 300 DragImage.Height 301

创建图像的方式并不重要。我尝试过 MakeScreenShot、PaintTo 并在设计时将 PNG 加载到 MultiResBitmap 属性中。最大不透明度的垂直线落在的位置不一致。每次开始拖动时它都会改变。

我哪里错了? 我担心解决方案将意味着实现我自己的拖放服务......我从未这样做过。我在 FMX 中完成了此操作,因此如果我决定瞄准其他平台,则不必从头开始,但目前唯一的计划是 Windows。

windows delphi drag-and-drop firemonkey delphi-12-athens
1个回答
0
投票

观察到的“渐变效果”不是由 Delphi FMX 框架创建或管理的。它由 Windows 操作系统管理,因为

IFMXDragDropService
将拖动对象的创建委托给 Windows API。

很像你其他人发现这个“神奇”的值300像素仅通过测试,因为没有官方Windows文档可用于此行为。由于到目前为止尚未找到解决方法,因此实施适合您需求的自定义拖放功能,或搜索已经解决此问题的第三方解决方案,是最好的做法。

© www.soinside.com 2019 - 2024. All rights reserved.