在VirtualTreeView中更改拖动光标

4
使用VirtualTreeView进行拖放操作时,默认情况下为[doCopy,doMove]。箭头指针带有小框表示移动操作,相同的指针图标加上[+]表示复制操作。
默认情况下,VT使用复制操作,如果按下修饰键(SHIFT键),它会修改操作以进行移动,因此会从指针中删除[+]。
这是我需要的:
  • 反转操作(默认情况下为移动,按下修饰键后为复制),因此也要反转指针箭头
  • 将修饰键替换为CTRL而不是SHIFT
  • 读取事件中发生的两个操作之一,并开始复制或移动操作
欢迎提供任何有关正确方向的指针。

等等,VT 默认使用移动操作,对吧?那个加号是在你按 Shift 键时出现的,我错了吗? - TLama
不,复制是默认操作(对于大多数情况来说是合理的,但并非所有情况都是如此),这就是为什么我想要反转它。当您按下Shift键时,加号会消失,表示操作变成了移动。+的存在表示复制操作。 - Coder12345
1
如果没有设置会影响此行为的选项,那么在我看来这就是一个 bug,因为 Shift 修改键应该用于复制操作。但是通过更改 OnDragOver 事件中的拖放效果很容易修改(修复)行为以满足您的需求(请参见下文)。 - TLama
1个回答

5
在处理 OnDragOver 事件时,你不仅需要更改修改器,还需要更改你将要执行的操作。因此,要添加 CTRL 键作为复制操作修改器,你可以编写以下代码。在此事件中设置的 Effect 参数值还会根据所选择的操作更改拖动光标。除此之外,该值也会传递到 OnDragDrop 事件中,在那里你可以根据它来确定如何处理已放置的源:
procedure TForm1.VirtualStringTree1DragOver(Sender: TBaseVirtualTree;
  Source: TObject; Shift: TShiftState; State: TDragState; Pt: TPoint;
  Mode: TDropMode; var Effect: Integer; var Accept: Boolean);
begin
  Accept := True;
  if Shift = [ssCtrl] then
    Effect := DROPEFFECT_COPY;
end;

OnDragDrop事件处理程序中,您可以确定所使用的效果:
procedure TForm1.VirtualStringTree1DragDrop(Sender: TBaseVirtualTree;
  Source: TObject; DataObject: IDataObject; Formats: TFormatArray;
  Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode);
begin
  case Effect of
    DROPEFFECT_COPY: ShowMessage('DROPEFFECT_COPY');
    DROPEFFECT_MOVE: ShowMessage('DROPEFFECT_MOVE');
  end;
end;

1
非常简单。非常感谢!我甚至学会了那些花哨的键盘标签。 - Coder12345

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