You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IFMXDragDropService拖拽图高度超300时出现异常渐变效果问题

FMX拖拽图像超300尺寸出现渐变透明的问题解决(Windows平台)

问题现象

使用FMX的IFMXDragDropService实现纸牌拖拽时,拖拽图像高度/宽度≤300时显示正常(完全不透明),但尺寸超过300后,拖拽图会出现X轴方向的渐变透明效果,且最高透明度的垂直线位置每次拖拽都会变化。无论通过MakeScreenShot、PaintTo还是设计时加载PNG到MultiResBitmap,都无法避免该问题,VCL平台的透明拖拽方案也不适用于FMX。

问题原因

这是FMX在Windows平台下IFMXDragDropService实现的内置行为:当拖拽位图尺寸超过300x300阈值时,FMX会自动对拖拽图像应用水平渐变透明效果,该逻辑是封装Windows原生拖拽机制时的设计决策,且未提供公开开关关闭此效果。

解决方案(Windows专属)

由于仅针对Windows平台开发,可以绕过FMX的拖拽服务,直接调用Windows原生API实现拖拽,完全控制拖拽图像的显示效果,确保其完全不透明。

代码示例

uses
  Winapi.Windows, Winapi.ShellAPI, FMX.Platform.Win, FMX.Graphics;

procedure TFormFMXDrag.ImgMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState;
  X, Y: Single);
var
  LImage: TImage;
  LBitmap: TBitmap;
  LHBmp: HBITMAP;
  LDragImage: SHDRAGIMAGE;
  LDropEffect: DWORD;
begin
  if Button <> mbLeft then Exit;
  LImage := TImage(Sender);

  LBitmap := TBitmap.Create;
  try
    LBitmap.Assign(LImage.Bitmap);
    // 将FMX Bitmap转换为Windows HBITMAP
    LHBmp := LBitmap.Handle;

    // 初始化拖拽图像信息
    ZeroMemory(@LDragImage, SizeOf(SHDRAGIMAGE));
    LDragImage.sizeDragImage.cx := LBitmap.Width;
    LDragImage.sizeDragImage.cy := LBitmap.Height;
    LDragImage.hbmpDragImage := LHBmp;
    // 设置拖拽热点(鼠标点击位置相对于图像左上角的偏移)
    LDragImage.ptOffset.x := Round(X);
    LDragImage.ptOffset.y := Round(Y);

    // 启动原生拖拽流程
    if DoDragDrop(WindowHandleToPlatform(Handle).Wnd, @LDragImage, LDropEffect) then
    begin
      // 可在此处理拖拽结果,比如根据LDropEffect判断是否完成拖拽
      case LDropEffect of
        DROPEFFECT_COPY: {处理复制逻辑};
        DROPEFFECT_MOVE: {处理移动逻辑};
      end;
    end;
  finally
    LBitmap.Free;
  end;
end;

说明

  • 该方案直接调用Windows的DoDragDrop和SHDRAGIMAGE结构,完全自定义拖拽图像,不会添加任何默认渐变效果。
  • 需要确保拖拽目标也适配Windows原生拖拽逻辑,或者在目标控件的拖拽事件中处理对应的消息(如WM_DROPFILES),如果之前用FMX的拖拽接收逻辑,可能需要调整为原生API的处理方式。

替代方案(若需保留FMX框架)

如果不想完全切换到原生API,可以尝试将大尺寸拖拽图像先绘制到一个300x300的画布上(保持比例缩放),但这会改变拖拽图像的显示大小,仅适用于对尺寸要求不严格的场景。


内容的提问来源于stack exchange,提问作者Mark G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 23:43:11