【问题标题】:Changing drag cursor in VirtualTreeView在 VirtualTreeView 中更改拖动光标
【发布时间】:2012-10-11 04:12:03
【问题描述】:

使用VirtualTreeView拖拽操作时默认为[doCopy,doMove]。移动操作用带小方框的箭头指针表示,复制操作用相同的指针图标表示,但旁边加了[+]。

默认情况下,VT 使用复制操作,如果您按下修饰键(SHIFT 键),它会修改操作以移动,因此从指针中删除 [+]。

这是我需要的:

  • 反转操作(默认是移动,按下修改键 - 复制),因此也反转指针箭头
  • 替换修饰键 - CTRL 而不是 SHIFT
  • 读取发生了两个操作中的哪一个的事件并开始复制或移动操作

任何指向正确方向的指针表示赞赏。

【问题讨论】:

  • 等等,默认情况下VT使用移动操作,不是吗?当您按 Shift 时会出现那个 + 号,还是我错了?
  • 不,复制是默认操作(这对大多数但不是所有用途都是合乎逻辑的),这就是我想扭转它的原因。当您按下 Shift 时,+ 符号消失,表示操作正在移动。 + 的存在表示复制操作。
  • 那么恕我直言,这是一个错误(不知道会影响此行为的设置),但应该使用 Shift 修饰符进行复制操作。但是通过更改OnDragOver 事件中的拖放效果(见下文),很容易将行为修改(修复)为您需要的行为。

标签: delphi c++builder virtualtreeview


【解决方案1】:

除了更改修饰符之外,您还应该在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;

【讨论】:

  • 确实很简单。非常感谢!我什至学会了那些花哨的键盘标签。
猜你喜欢
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 2012-04-24
  • 2013-01-30
  • 1970-01-01
相关资源
最近更新 更多