2010-10-21 3 views
1

как я могу установить фоновое изображение для TListview в Delphi XE ??Как установить фоновое изображение на TListview в Delphi XE?

Я хочу сделать приложение, подобное Windows Explorer.

+0

объясните мой вопрос: в моем реальном проекте у меня есть TListview и TButton. Я хочу, когда щелкнуть Button1, затем установить фоновое изображение для Listview1 (например, Windows Explorer) , пожалуйста, см. Рисунок. На этом изображении я установил фоновое изображение для папки. Я хочу сделать приложение, например, эту фотографию: http://www.4shared.com/photo/zvzwuCp_/untitled_2.html – User

ответ

7

Чтобы установить водяной знак в списке, вам необходимо использовать сообщение LVM_SETBKIMAGE, и вам необходимо переопределить сообщение WM_ERASEBKGND по умолчанию TListView. Listview берет на себя управление рукояткой битмапа, поэтому вам нужно использовать ReleaseHandle TBitmap, а не только Handle.

Если вы хотите, чтобы он был выровнен по левому верхнему краю, а не справа внизу, как проводник, используйте LVBKIF_SOURCE_HBITMAP вместо LVBKIF_TYPE_WATERMARK для значения ulFlags.

uses 
    CommCtrl, ...; 

type 
    TListView = class(ComCtrls.TListView) 
    protected 
    procedure WndProc(var Message: TMessage); 
     override; 
    end; 

    TForm4 = class(TForm) 
    ListView1: TListView; 
    procedure FormCreate(Sender: TObject); 
    end; 

procedure TListView.WndProc(var Message: TMessage); 
begin 
    if Message.Msg = WM_ERASEBKGND then 
    DefaultHandler(Message) 
    else 
    inherited WndProc(Message); 
end; 

procedure TForm4.FormCreate(Sender: TObject); 
var 
    Img: TImage; 
    BkImg: TLVBKImage; 
begin 
    FillChar(BkImg, SizeOf(BkImg), 0); 
    BkImg.ulFlags := LVBKIF_TYPE_WATERMARK; 
    // Load image and take ownership of the bitmap handle 
    Img := TImage.Create(nil); 
    try 
    Img.Picture.LoadFromFile('C:\Watermark.bmp'); 
    BkImg.hbm := Img.Picture.Bitmap.ReleaseHandle; 
    finally 
    Img.Free; 
    end; 
    // Set the watermark 
    SendMessage(ListView1.Handle, LVM_SETBKIMAGE, 0, LPARAM(@BkImg)); 
end; 

Натяжные Watermark

элемент управления ListView изначально не поддерживает растяжения растрового изображения по всему фону. Для этого вам нужно сделать StretchBlt в ответ на WM_ERASEBKGND самостоятельно.

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; 
+0

очень спасибо. Я помещаю ваш код в проект, но имеет ошибку и не работает. Вы можете решить его, пожалуйста. (http://4shared.com/file/ImTrNd-Z/lvdemo_edited.html ) – User

+0

Если вы посмотрите на код, который я опубликовал, «Watermark» - это поле/свойство TBitmap, которое я добавил в TMyListView. Вам нужно назначить это вместо использования LVM_SETBKIMAGE. LVM_SETBKIMAGE не поддерживает растягивание, поэтому вы не можете его использовать. Кроме того, похоже, что настройки CS_HREDRAW/CS_VREDRAW в CreateParams испортили рисунок. Удалите это и вручную аннулируйте его в обработчике событий OnResize ListView. –

+0

Кроме того, в коде, который вы опубликовали, у вас есть TwpListView, где вы добавляете код, но ваши типы объявляются как TListView. Вам нужно сделать сглаживание, как в моем первом примере кода, или создать TwpListView во время выполнения. Как бы то ни было, ни один из кода в нем не выполняется. –

1

a Tlistview приятно, но если вы хотите больше. Я предлагаю вам обновить с VirtualStringTree(VirtualTreeView) очень гибкими, вы можете настроить его практически на все, что захотите, и больше всего его бесплатно.

Смежные вопросы