如何让文本成为我的拖动光标?

4

当在两个组件之间拖放文本时,是否有一种简单的方法来显示我正在拖动的文本作为拖动光标?


1
你是不是指除了拖动光标之外的其他方式?我的意思是,你怎么知道“文本光标”热点在哪里? - Andreas Rejbrand
1
制作一个独立的AlwaysOnTop透明窗口,其中包含文本,并将其移动到始终靠近或在光标下方。就像Stardock CursorFX一样。 - Arioch 'The
2
如果您是指拖动图像,请查看此处 - Ondrej Kelle
2
当然,你可以轻松地使用Canvas.TextOut创建文本图像。 - Ondrej Kelle
显示剩余2条评论
1个回答

7

要从列表框中拖动项目,并在拖动光标旁显示其文本表示:

type
  TTextDragObject = class(TDragControlObjectEx)
  private
    FDragImages: TDragImageList;
    FText: String;
  protected
    function GetDragImages: TDragImageList; override;
  end;

{ TTextDragObject }

function TTextDragObject.GetDragImages: TDragImageList;
var
  Bmp: TBitmap;
begin
  if FDragImages = nil then
  begin
    FDragImages := TDragImageList.Create(Control);
    Bmp := TBitmap.Create;
    try
      Bmp.Width := Bmp.Canvas.TextWidth(FText);
      Bmp.Height := Bmp.Canvas.TextHeight(FText);
      Bmp.Canvas.TextOut(0, 0, FText);
      FDragImages.Width := Bmp.Width;
      FDragImages.Height := Bmp.Height;
      FDragImages.SetDragImage(FDragImages.Add(Bmp, nil), 0, 0);
    finally
      Bmp.Free;
    end;
  end;
  Result := FDragImages;
end;

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
  ControlStyle := ControlStyle + [csDisplayDragImage];
  ListBox1.ControlStyle := ListBox1.ControlStyle + [csDisplayDragImage];
end;

procedure TForm1.ListBox1StartDrag(Sender: TObject;
  var DragObject: TDragObject);
var
  List: TListbox absolute Sender;
begin
  DragObject := TTextDragObject.Create(List);
  if List.ItemIndex > -1 then
    TTextDragObject(DragObject).FText := List.Items[List.ItemIndex];
end;

好的,它有效了。+1和答案,@NLGN。然而,用户应该注意,如果他们的OnDragDop处理程序检查源组件,它将是TTextDragObject类型。对我来说没有问题,因为我只有一个源和一个目的地,但是......另外,我在文本之前放了几个空格,以便将其从光标下移开。 - Mawg says reinstate Monica
3
请使用TTextDragObject的“DragHotspot”而不是偏移图像。 - Sertac Akyuz
2
@Mawg TTextDragObject(Source).Control 是源组件。 - NGLN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接