Delphi XE で背景画像を TListview に設定するにはどうすればよいですか??
Windows Explorer のようなアプリケーションを作りたいです。
リストビューに透かしを設定するには、LVM_SETBKIMAGE メッセージを使用する必要があり、TListView のデフォルトの WM_ERASEBKGND メッセージをオーバーライドする必要があります。ReleaseHandle
リストビューはビットマップ ハンドルの所有権を取得するため、単に ではなくTBitmap の を使用する必要がありますHandle
。
Explorer のように右下ではなく、左上に揃えたい場合は、LVBKIF_SOURCE_HBITMAP
代わりにLVBKIF_TYPE_WATERMARK
for for を使用し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;
引き伸ばされた透かし
リストビューは、背景全体にビットマップを拡大することをネイティブにサポートしていません。これを行うには、自分で 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 は素晴らしいですが、もっと必要な場合は。VirtualStringTree( VirtualTreeView) で更新する必要があることをお勧めします。非常に柔軟で、ほとんど何でもカスタマイズでき、何よりも無料です。