在窗体设计器上增加一个ListView,设其ViewStyle属性为vsIcon,然后在ListView上利用ItemEditor增加两个Item。最后在ListView的OnAdvancedCustomDrawItem事件上增加如下代码,其目的是修改被选中Item文字的背景色:var
r: TRect;
begin
with Sender.Canvas do
if cdsSelected in State then
begin
Brush.Color := clYellow; //颜色接口:背景颜色
Pen.Color := $009CDEF7; //颜色接口:边框颜色
r := Item.DisplayRect(drLabel);
FillRect(r);
DrawText(Handle,
PChar(Item.Caption),
Length(Item.Caption),
R,
DT_WORDBREAK or DT_CENTER);
end;
end;虽然我的目的达到了,但是出现了一个问题,就是选中一个Item后,再选择另外一个Item时,前一个被选择的Item的字体发生了变化,不是原来的字体了。如何能够使前一个被选择的Item的字体保持不变呢?
另外,我发现如果ListView中的Item多于两个的时候不会发生这种情况,到底是为什么呢?
r: TRect;
begin
with Sender.Canvas do
if cdsSelected in State then
begin
Brush.Color := clYellow; //颜色接口:背景颜色
Pen.Color := $009CDEF7; //颜色接口:边框颜色
r := Item.DisplayRect(drLabel);
FillRect(r);
DrawText(Handle,
PChar(Item.Caption),
Length(Item.Caption),
R,
DT_WORDBREAK or DT_CENTER);
end;
end;虽然我的目的达到了,但是出现了一个问题,就是选中一个Item后,再选择另外一个Item时,前一个被选择的Item的字体发生了变化,不是原来的字体了。如何能够使前一个被选择的Item的字体保持不变呢?
另外,我发现如果ListView中的Item多于两个的时候不会发生这种情况,到底是为什么呢?
r: TRect;
begin
with Sender.Canvas do
begin
if cdsSelected in State then begin
Brush.Color := clYellow; //颜色接口:背景颜色
Pen.Color := $009CDEF7; //颜色接口:边框颜色
end;
r := Item.DisplayRect(drLabel);
FillRect(r);
DrawText(Handle,
PChar(Item.Caption),
Length(Item.Caption),
R,
DT_WORDBREAK or DT_CENTER);
end;
end;
to:wenxj:你给的办法是不错,可是我的水平还不够,对于事件OnCustomDrawItem的了解还不够深刻,我会争取掌握的,然后就能用你的方法了。
谢谢二位!
下面是最终的代码:var
R,RFill,RLine: TRect; //R为文字覆盖的范围
//RFill为文字填充的范围
begin
R := Item.DisplayRect(drLabel);
with Sender.Canvas do begin
if cdsSelected in State then
begin
Brush.Color := $009CDEF7; //颜色接口:背景颜色
Pen.Color := clGreen; //颜色接口:边框颜色
end
else
Brush.Color := clWhite; //此处必须为clWhite,不能为系统颜色,
//否则文字的显示出现问题,暂时无法解决
RFill := R; //通过R得到RFill和RLine的值
InflateRect(RFill,-1,-1); //将矩形RFill上下左右向里缩一个单位
FillRect(RFill);
DrawText(Sender.Canvas.Handle,
PChar(Item.Caption),
Length(Item.Caption),
RFill,
DT_WORDBREAK or DT_CENTER);
end;
end;我随后结帖,欢迎对以上代码提出意见。
现在结帖,我的新问题在Win32 SDK/API中提出了,如果你有好的办法,请到那里告诉我,谢谢。