OldHawk

菜地一块,欢迎拍砖
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ListBox自绘,列表显示一系列图片

Posted on 2007-07-28 18:20  OldHawk  阅读(2589)  评论(4编辑  收藏  举报
      最近本人做的项目中,需要将一系列图片列表显示到一个ListBox中,本人使用的raize套件中的RzListBox,这里讲的方法同样适用于这两种组件,首先设置ListBox的style为:lbOwnerDrawVariable,然后处理ListBox的MeasureItem与DrawItem事件。

      代码如下:
procedure TFrameAuction.RzListBoxMeasureItem(Control: TWinControl;
  Index: Integer; var Height: Integer);
begin
  Height:
=82;//设置item的高度
end;

procedure TFrameAuction.RzListBoxDrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  jpeg:TJPEGImage;
  bmp:TBitMap;
  root,cnode: IXMLNode;
  icon: TIcon;
  fname:
string;
begin
  root:
=self.FXMLDoc.DocumentElement;
  cnode:
=root.ChildNodes[Index];
  with (Control 
as TRzListBox).Canvas do begin
    bmp:
=TBitmap.Create;
    jpeg:
=TJPEGImage.Create;
    
if cnode.GetAttribute('photo')='' then begin
      fname:
=ExtractFilePath(Application.ExeName)+'images\none.jpg';
    end 
else begin
      fname:
=ExtractFilePath(Application.ExeName)+'images\'+root.GetAttribute('id')+'-'+cnode.GetAttribute('photoid')+'-'+cnode.GetAttribute('photo');
      
if not FileExists(fname) then
        fname:
=ExtractFilePath(Application.ExeName)+'images\none.jpg';
    end;
    jpeg.LoadFromFile(fname);
    with bmp 
do
    begin
      PixelFormat:
=pf24bit;
      Height:
=60;
      Width:
=self.RzListBox.Width;
      Canvas.Brush.Color:
=$00F0EDE6;
      Canvas.FillRect(Canvas.ClipRect);
      Canvas.StretchDraw(Bounds(
0,0,80,60), jpeg);
    end;

    FillRect(Rect);
    Draw(Rect.Left
+1, Rect.Top + 1,bmp);
    icon:
=TIcon.Create;
    
if cnode.GetAttribute('status')='1' then
      self.ImageListStatus.GetIcon(
8,icon)
    
else if cnode.GetAttribute('status')='3' then
      self.ImageListStatus.GetIcon(
2,icon)
    
else if cnode.GetAttribute('status')='2' then begin
      
if cnode.GetAttribute('bargainflag')='0' then
        self.ImageListStatus.GetIcon(
6,icon)
      
else
        self.ImageListStatus.GetIcon(
4,icon)
    end 
else if cnode.GetAttribute('status')='0' then begin
      
if root.GetAttribute('activeitem')=cnode.GetAttribute('itemid') then
         self.ImageListStatus.GetIcon(
0,icon);
    end;

    Draw(Rect.Left
+1+80+5,Rect.Top+22,icon);
    TextOut(
1,Rect.Top+64,cnode.GetAttribute('no')+'号:'+cnode.GetAttribute('itemtitle'));
  end;
  icon.Free;
  bmp.Free;
  jpeg.Free;
end;

运行结果如下: