简单问题,但我就是没搞明白!!(300分)

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

cAkk

Unregistered / Unconfirmed
GUEST, unregistred user!
我想让我的Listview控件,能够根据当前的item的index显示不同的颜色,
但我尝试了listview的几个事件均不能如愿!

1.OnDrawItem
在这里事件里,我尝试遍历每一个Column,以得到每个subitem所在
的位置,然后textout文本,但是在调整header宽度的时候发生文字
混乱!

2.OnCustomDraw系列的三个事件
这个事件,没有任何参数让我知道当前正在draw的item是什么

3.OnAdvancedCustomDraw系列的三个事件同2

请问怎样实现我的想法?
 
1, 好象不是这样的吧,每画一个 item 就会触发一次的
//我用的不多,错了请见谅。
 
>>>每画一个 item 就会触发一次
但是穿过来的参数是一个Tlistitem呀!
 
>2.OnCustomDraw系列的三个事件
>这个事件,没有任何参数让我知道当前正在draw的item是什么
原形:
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
Item不是吗?他在画每一个Item时候触发,就象StringGrid的Ondraw...
 
>但是穿过来的参数是一个Tlistitem呀!
TListView 的Item 不就是TListItem吗?
 
过去用过,好像没有那么复杂,等我查查.如SuperMMX所说"每画一个 item 就会
触发一次的"(每次仅给出当前要重画的区域)
 
Nose: 能给我写一段代码吗? 我想不出来.
 
Nose: 照你所说,我怎样知道该在什么位置textout什么字符串呢?
 
>Nose: 照你所说,我怎样知道该在什么位置textout什么字符串呢?
ARect:=Item.DisplayRect(drLabel);
获取Item的文本Rect.
下面的代码只是简单的判断非选择状态的重画,可以根据State的值进行你自己的
重画代码

procedure TForm1.ListView1AdvancedCustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage;
var DefaultDraw: Boolean);
var
ARect:TRect;
begin
if (Item.Caption='111') then
begin
ARect:=Item.DisplayRect(drLabel);
Sender.Canvas.Font.Color:=clBlue;
if not (cdsSelected in State) then
Sender.Canvas.TextOut(ARect.Left + 2,ARect.Top,Item.Caption);
DefaultDraw:=False;
end
else
DefaultDraw:=True // if ...end
end;
 
那么subitems怎么draw ?

其实我刚才已经解决了我的问题,我刚才之所以总是不成功,是因为...因为...
我用canvas的时候没有加上listview1,结果实际上设置的是form的canvas.....
真不好意思.

但是我还是关心在CustomDrawItem里面如何draw subitems ?所以请继续关注.
 
1.procedure TForm1.ListView1AdvancedCustomDrawSubItem(
Sender: TCustomListView; Item: TListItem; SubItem: Integer;
State: TCustomDrawState; Stage: TCustomDrawStage;
var DefaultDraw: Boolean);
2.procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState;
var DefaultDraw: Boolean);

 
不是有个OnCustomDrawSubItem吗?
 
sorry,没看见Nose的。
 
如果我想subitem用不同的颜色呢? 我怎样得到subitem的rect?
 
正在Try,用了好多办法都不灵,不过有新发现
RowSelected:=True时,SubItem的颜色也跟着变了,不知道是否
一个突破口?
继续研究
 
主要是要得到subitem的横坐标。

如果LISTVIEW没有水平滚动条,可用各ListView1.Columns[SubItem].Width累加得到。

如果水平滚动的话:
GetWindowRect(FindWindowEx(ListView1.Handle,0,'SysHeader32',nil), aRect);
有了aRect.Left,就知道滚动到那里了,再用上面的方法。
 
也就是说,还是要遍历一遍columns?
 
嗨,有现成的function.

function ListView_GetSubItemRect(hwndLV: HWND; iItem, iSubItem: Integer;
code: DWORD; prc: PRect): BOOL;

hwndLV
Handle to a list view control.
iItem
Index of the subitem's parent item.
iSubItem
The one-based index of the subitem.
code
Portion of the list view subitem for which to retrieve the bounding rectangle information.
This value can be one of the following:
LVIR_BOUNDS Returns the bounding rectangle of the entire item, including the icon and label.
LVIR_ICON Returns the bounding rectangle of the icon or small icon.
LVIR_LABEL Returns the bounding rectangle of the entire item, including the icon and label.
This is identical to LVIR_BOUNDS.

lpRect
Address of aRECT structure that receives the subitem bounding rectangle information.
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部