一直都对QQ的好友列表很好奇,最先感觉用TreeView实现的,看了看TreeView的源码,发现要实现还真的不太好完成任务啊,其中最大的原因是自己的功力不足,后来觉得用ListView来做吧,结果也是失败,后来又想到ListBox,结果发现也是难成,最后发现有一个TDrawGrid,可以来绘制,但是不知道那两行文字怎么搞,有知道的望告知,谢谢。好了不再废话,就把最近对TDrawGrid的一些操作记录如下:
1.我们先设置TDrawGrid的属性: BorderStyle:bsNone; ColCount:1; DefaultColWidth:200; DefaultRowHeight:60; RowCount:10; GridLineWidth:2; Options:[goFixedVertLine, goFixedHorzLine, goHorzLine, goDrawFocusSelected, goThumbTracking]; ScrollBars:ssVertical;
2.在窗体的public 域定义如下变量和函数: PicList: TList; function GetPicture(ACol, ARow:Integer): TBitMap;
3.完成相关函数和过程:
function TForm1.GetPicture(ACol, ARow: Integer): TBitMap; var Index: integer; begin Result := nil; Index := ARow * Grid.ColCount + ACol; if Index <= PicList.Count - 1 then Result := TBitmap(PicList.Items[Index]); end;
procedure TForm1.FormCreate(Sender: TObject); var Bmp: TBitMap; Index: Integer; AFileName: string; begin PicList := TList.Create; for Index := 1 to 10 do begin AFileName := Format(ExtractFilePath(ParamStr(0)) + 'Icon\%d.bmp', [Index]); Bmp := TBitmap.Create; Bmp.LoadFromFile(AFileName); PicList.Add(Bmp); end; end;
procedure TForm1.GridDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState); var ACanvas: TCanvas; R: TRect; Bmp: TBitMap; begin ACanvas := Grid.Canvas; Bmp := GetPicture(ACol, ARow); if Bmp <> nil then begin R := Rect; R.Left := R.Left + 6; R.Top := R.Top + 6; {如果使用Canvas的StretchDraw函数,必须加上 下面两句代码,不过BMP图片还是无法透明} //R.Bottom := R.Bottom - 6; //R.Right := Bmp.Width; {设置BMP的Transparent为真,再用Canvas的 Draw函数,就可以使BMP透明绘制,不过你需要 制作透明的BMP图片} Bmp.Transparent := True; ACanvas.Draw(R.Left, R.Top, Bmp); {网上有人说用下面的语句可以透明,但是使用 函数StretchDraw,还是无法透明} //ACanvas.Brush.Style := bsClear; //ACanvas.StretchDraw(R, Bmp); end; end;
最后,关于透明BMP图片的制作方法,感兴趣的可以百度一下。
http://www.lsworks.net/article/45.html
|
请发表评论