gpt4 book ai didi

delphi - 如何更改ListView OnDrag图像?

转载 作者:行者123 更新时间:2023-12-03 15:30:42 36 4
gpt4 key购买 nike

我正在使用带有 ViewStyle := vsReport 的 ListView。当我将一行从一个点拖动到另一个点时,它会获取被拖动行的第一列的值(在本例中为 1),并将其显示在深灰色矩形内,如下所示。

enter image description here

我尝试查看 XE4 源代码,但找不到设置此背景颜色的位置。我想将此背景颜色更改为 clSkyBlue (或类似的颜色),但不知道它是如何完成的。

如何更改拖动操作的默认深灰色背景图像?

最佳答案

VCL 的拖动操作没有开箱即用的拖动图像,但它确实提供了一种机制来提供要使用的拖动图像。这通常是通过构造您自己的“拖动图像列表”来完成的,或者通过重写控件本身的 GetDragImages 方法(当使用内部拖动对象时),或者通过构造您自己的“拖动对象”当拖动开始时,并在其 GetDragImages 方法中组装一个图像列表,以便在拖动开始时由 VCL 调用。

对于 TListViewTTreeView 控件,此机制有点不同,因为底层 api 控件本身支持为正在拖动的项目提供拖动图像。因此,与其他控件不同,这些控件会重写其 GetDragImages 方法,并返回在重写的 DoStartDrag 方法中创建的图像列表,其中控件要求 api 提供图像列表。这就是为什么您无法找到在 VCL 代码中创建拖动图像的位置。

要重写此行为,可以在后代类中重写这些(可能还有其他一些)方法并实现它们。我不知道这是否容易,我发现通过在 OnStartDrag 事件处理程序中构造拖动对象来提供图像列表更容易。这通常不会产生任何影响,因为在调用拖动对象的 GetDragImages 时,VCL 已经确定了 api 提供的图像列表,并且 api 已经创建了一个临时列表被拖拽。然后,我们可以强制将原始图像列表拖到末尾并替换为我们自己的图像列表。

下面是一个过于简化的示例。除了错误处理、资源保护、热点确定等之外……查看 VCL 代码,看看它如何确保确实有一个项目被拖动。

type
TListWiewDragControlObjectEx = class(TDragControlObjectEx)
protected
function GetDragImages: TDragImageList; override;
end;

function TListWiewDragControlObjectEx.GetDragImages: TDragImageList;
var
Bmp: TBitmap;
R: TRect;
begin
Bmp := TBitmap.Create;
Bmp.Canvas.Brush.Color := clSkyBlue;
R := TListView(Control).Selected.DisplayRect(drBounds);
Bmp.SetSize(R.Right - R.Left, R.Bottom - R.Top);
Bmp.Canvas.Font := TListView(Control).Font;
Bmp.Canvas.TextOut(0, 0, TListView(Control).Selected.Caption);

Result := TDragImageList.Create(Control);
Result.Width := Bmp.Width;
Result.Height := Bmp.Height;
ImageList_EndDrag; // end the drag with the temporary list
Result.SetDragImage(Result.Add(Bmp, nil), 0, 0);
Bmp.Free;
end;

procedure TForm1.ListView1StartDrag(Sender: TObject;
var DragObject: TDragObject);
begin
DragObject := TListWiewDragControlObjectEx.Create(ListView1);
DragObject.AlwaysShowDragImages := True;
end;

关于delphi - 如何更改ListView OnDrag图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17982747/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com