如何在Delphi XE中将背景图像设置为TListview?

如何在Delphi XE中将背景图像设置为TListview?,delphi,delphi-xe,tlistview,Delphi,Delphi Xe,Tlistview,如何在Delphi XE中将背景图像设置为TListview 我想制作一个类似Windows资源管理器的应用程序。为了在listview中设置水印,您需要使用消息,并且需要覆盖TListView的默认WM_橡皮擦Gnd消息。listview拥有位图句柄的所有权,因此您需要使用TBitmap的ReleaseHandle,而不仅仅是句柄 如果希望它与左上角对齐,而不是像资源管理器一样与右下角对齐,请使用LVBKIF_SOURCE_HBITMAP而不是LVBKIF_TYPE_水印作为ulFlags值

如何在Delphi XE中将背景图像设置为TListview


我想制作一个类似Windows资源管理器的应用程序。

为了在listview中设置水印,您需要使用消息,并且需要覆盖TListView的默认WM_橡皮擦Gnd消息。listview拥有位图句柄的所有权,因此您需要使用TBitmap的ReleaseHandle,而不仅仅是句柄

如果希望它与左上角对齐,而不是像资源管理器一样与右下角对齐,请使用LVBKIF_SOURCE_HBITMAP而不是LVBKIF_TYPE_水印作为ulFlags值

拉伸水印

listview本机不支持在整个背景上拉伸位图。要做到这一点,您需要对WM_ERASEBKGND自己做一个StretchBlt响应

type
  TMyListView = class(TListView)
  protected
    procedure CreateHandle; override;
    procedure CreateParams(var Params: TCreateParams); override;
    procedure WMEraseBkgnd(var Msg: TWMEraseBkgnd); message WM_ERASEBKGND;
  public
    Watermark: TBitmap;
  end;

procedure TMyListView.CreateHandle;
begin
  inherited;
  // Set text background color to transparent
  SendMessage(Handle, LVM_SETTEXTBKCOLOR, 0, CLR_NONE);
end;

procedure TMyListView.CreateParams(var Params: TCreateParams);
begin
  inherited;
  // Invalidate every time the listview is resized
  Params.Style := Params.Style or CS_HREDRAW or CS_VREDRAW;
end;

procedure TMyListView.WMEraseBkgnd(var Msg: TWMEraseBkgnd);
begin
  StretchBlt(Msg.DC, 0, 0, Width, Height, Watermark.Canvas.Handle,
    0, 0, Watermark.Width, Watermark.Height, SrcCopy);
  Msg.Result := 1;
end;

为了在listview中设置水印,您需要使用该消息,并且需要覆盖TListView的默认WM_橡皮擦BKGND消息。listview拥有位图句柄的所有权,因此您需要使用TBitmap的ReleaseHandle,而不仅仅是句柄

如果希望它与左上角对齐,而不是像资源管理器一样与右下角对齐,请使用LVBKIF_SOURCE_HBITMAP而不是LVBKIF_TYPE_水印作为ulFlags值

拉伸水印

listview本机不支持在整个背景上拉伸位图。要做到这一点,您需要对WM_ERASEBKGND自己做一个StretchBlt响应

type
  TMyListView = class(TListView)
  protected
    procedure CreateHandle; override;
    procedure CreateParams(var Params: TCreateParams); override;
    procedure WMEraseBkgnd(var Msg: TWMEraseBkgnd); message WM_ERASEBKGND;
  public
    Watermark: TBitmap;
  end;

procedure TMyListView.CreateHandle;
begin
  inherited;
  // Set text background color to transparent
  SendMessage(Handle, LVM_SETTEXTBKCOLOR, 0, CLR_NONE);
end;

procedure TMyListView.CreateParams(var Params: TCreateParams);
begin
  inherited;
  // Invalidate every time the listview is resized
  Params.Style := Params.Style or CS_HREDRAW or CS_VREDRAW;
end;

procedure TMyListView.WMEraseBkgnd(var Msg: TWMEraseBkgnd);
begin
  StretchBlt(Msg.DC, 0, 0, Width, Height, Watermark.Canvas.Handle,
    0, 0, Watermark.Width, Watermark.Height, SrcCopy);
  Msg.Result := 1;
end;

Tlistview很好,但如果您想要更多。我建议你必须非常灵活地进行更新,你几乎可以自定义任何你想要的内容,最重要的是它是免费的。

Tlistview不错,但如果你想要更多。我建议你必须非常灵活地进行更新,你几乎可以自定义任何你想要的内容,最重要的是它是免费的。

解释我的问题:在我的真实项目中,我有一个TListview和一个TButton。我想,当单击按钮1时,然后为Listview1设置背景图像,就像windows资源管理器请查看图片一样,在这张图片中,我为文件夹设置了背景图像。我想制作一个应用程序,如下图:解释我的问题:在我的真实项目中,我有一个TListview和一个TButton。我想,当单击按钮1时,然后为Listview1设置背景图像,就像windows资源管理器请查看图片一样,在这张图片中,我为文件夹设置了背景图像。我想制作一个应用程序,如下图:非常感谢。我把你的代码放在项目中,但是有错误并且不起作用。请你解决它好吗。如果您查看我发布的代码,Watermark是我添加到TMyListView的TBitmap字段/属性。您需要分配它,而不是使用LVM_SETBKIMAGE。LVM_SETBKIMAGE不支持拉伸,因此您不能使用它。此外,在CreateParams中设置CS_HREDRAW/CS_VREDRAW样式似乎会弄乱图形。在ListView的OnResize事件处理程序中删除该代码并手动使其无效。此外,在您发布的代码中,您有一个TwpListView,在其中添加代码,但您的类型声明为TListView。您需要像我在第一个代码示例中那样进行别名处理,或者在运行时创建TwpListView。事实上,里面的代码都没有被执行。非常感谢。我把你的代码放在项目中,但是有错误并且不起作用。请你解决它好吗。如果您查看我发布的代码,Watermark是我添加到TMyListView的TBitmap字段/属性。您需要分配它,而不是使用LVM_SETBKIMAGE。LVM_SETBKIMAGE不支持拉伸,因此您不能使用它。此外,在CreateParams中设置CS_HREDRAW/CS_VREDRAW样式似乎会弄乱图形。在ListView的OnResize事件处理程序中删除该代码并手动使其无效。此外,在您发布的代码中,您有一个TwpListView,在其中添加代码,但您的类型声明为TListView。您需要像我在第一个代码示例中那样进行别名处理,或者在运行时创建TwpListView。事实上,没有一个代码被执行。