请教一个TListView的自绘SubItem的问题(200分)

  • 主题发起人 主题发起人 crazycock
  • 开始时间 开始时间
C

crazycock

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TfrmMain.lv_LocalDataCustomDrawSubItem(Sender: TCustomListView;
Item: TListItem;
SubItem: Integer;
State: TCustomDrawState;
var DefaultDraw: Boolean);
var
rect:TRect;
bm:TBitmap;
begin
if (SubItem=5) then
begin
bm := TBitmap.Create;
bm.LoadFromFile(g_Setting.RunPath + 'pdf.bmp');
ListView_GetSubItemRect(lv_LocalData.Handle, Item.Index, SubItem, LVIR_BOUNDS, @Rect);
lv_LocalData.Canvas.Draw(rect.Left+5,rect.Top,bm);
bm.Free;
end
else
lv_LocalData.Canvas.Font.Assign(frmMain.Canvas.Font);
end;

意图就是SubItem中,第五个的位置画一个图标,但是发现第六个SubItem里的字体变成了粗体,而且变大了,不知道是不是没有备份Canvas的字体属性的缘故,请做过类似代码的朋友指点。
 
好可怜,现在连个“顶”的人都没了~
 
晕,刚又测了一下,发现确实有这个现象。[:(]
暂时没找到原因。
 
使用 lv_LocalData.Canvas.Font.Assign(frmMain.Font);
 
谢谢xifengge关注。
to LSUPER:试了lv_LocalData.Canvas.Font.Assign(frmMain.Font)不行的。
继续up。
 
I:=SaveDC(Canvas.Handle) 一下,用完后再
RestoreDC(Canvas.Handle, I)
 
经过试验,我上面的方法也无效,追踪了一下VCL,感觉挺奇怪,这会不会是Windows的BUG呢,
但有个土办法可以解决:
if (SubItem=5) then
begin
//.....
end
else
lv_LocalData.Canvas.Font.Color := clBlack;
 
改了一下,还是不行。
procedure TfrmMain.lv_LocalDataCustomDrawSubItem(Sender: TCustomListView;
Item: TListItem;
SubItem: Integer;
State: TCustomDrawState;
var DefaultDraw: Boolean);
var
rect:TRect;
bm:TBitmap;
I:integer;
begin
if (SubItem=5) then
begin
I:=SaveDC(lv_LocalData.Canvas.Handle);
DefaultDraw :=False;
bm := TBitmap.Create;
bm.LoadFromFile(g_Setting.RunPath + 'pdf.bmp');
ListView_GetSubItemRect(lv_LocalData.Handle, Item.Index, SubItem, LVIR_BOUNDS, @Rect);
lv_LocalData.Canvas.Draw(rect.Left+5,rect.Top,bm);
bm.Free;
RestoreDC(lv_LocalData.Canvas.Handle, I);
end;
end;
 
哦。
if (SubItem=5) then
begin
//.....
end
else
lv_LocalData.Canvas.Font.Color := clBlack;
这个代码竟然是有效的哦。我看到当时我的字体变大了,所以就用Assign的方法恢复,竟然不行。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
692
import
I
I
回复
0
查看
546
import
I
后退
顶部