我发现ListView好像只能够显示ImageList中的图片,由于我的程序特殊,需要动态加载好多图片,所以最好能直接设置任何一个Item的Image(从硬盘用LoadFromFile)
如何实现?或者有没有更好的控件?谢谢。
高分奖励,急需,谢谢。
參考答案:ListView的每一个Item的类型是TListItem,这个类型带有句柄属性
建议你使用GetDC函数来获取每个Item的作图区,然后使用Canvas对象在目标上作图:关键代码如下:
const
PicFullName: String = 'C:\Start.bmp';
procedure TForm1.FormCreate(Sender: TObject);
begin
Self.lvTst.LargeImages := TImageList.Create(Application);
//设置ListView的LargetImage值,不使用用来装载图片,只是在vsIcon
//显示方式中给图片空位用
//依此类推:vsList显示模式显示Item图片就实例化一个SmallImages
end;
procedure TForm1.BtnSetPicClick(Sender: TObject);//点击此按钮为当前被选中的Item设置图片
var
C: PChar;
Item: TListItem;
begin
if Self.lvTst.Selected = nil then Exit;
Item := Self.lvTst.Selected;
New(C);
GetMem(C,255);
StrPCopy(C,PicFullName);
if Item.Data <> nil then
Dispose(Item.Data);
Item.Data := C;//在Item中的Data属性是一个指针,让它保存图片的路径
Self.lvTst.Invalidate;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
I: Integer;
begin
for I := 0 to Self.lvTst.Items.Count - 1 do
if Self.lvTst.Items[I].Data <> nil then
Dispose(Self.lvTst.Items[I].Data);//释放每一个指针
end;
procedure TForm1.lvTstCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);//在ListView的OnCustomDraw事件中加入图形持久化代码
var
X,Y: Integer;
Cvs: TCanvas;
Bmp: TBitMap;
begin
Cvs := TCanvas.Create;
Bmp := TBitMap.Create;
if Item.Data <> nil then
begin
Cvs.Handle := GetDC(Item.Handle);
Bmp.LoadFromFile(PChar(Item.Data));
X := Item.Position.X;
Y := Item.Position.Y;
Cvs.Draw(X,Y,BMP);//开始作图
end;
Cvs.Free;
Bmp.Free;
end;
end.