重画ListBox的问题(100分)

  • 主题发起人 主题发起人 歪就歪
  • 开始时间 开始时间

歪就歪

Unregistered / Unconfirmed
GUEST, unregistred user!
是这样,我想让ListBox里的某一行的背景变成红色,就象编辑
器那样,就在OnItemDraw的事件里加:
procedure TForm1.ListBox1ItemDraw(Rect....Index....)
begin
if Index = RedLine then
begin
ListBox1.Canvas.Brush.Color := clRed;
ListBox1.TextOut(Rect.Left, Rect.Top, ListBox1.Items[index]);
end
else
begin
ListBox1.Canvas.Brush.Color := clRed;
ListBox1.TextOut(Rect.Left, Rect.Top, ListBox1.Items[index]);
end;
end;

(代码可能有误,源码在班上呢),这样就能在想要的行上画上红色了。
但是,当Highlight那ListBox的某一行时,那一行上的字就没了。
谁有类似经历,当Highlight时应该怎么处理呢?


 
应该可以的,许多书上有介绍。
到班上看看辕马吧
 
我试了一下,好象没问题呀, 我的代码:
procedure TForm1.ListBox1DrawItem(Control: TWinControl;
Index: Integer;
Rect: TRect;
State: TOwnerDrawState);
begin
if index=2 then
begin
ListBox1.Canvas.Brush.Color := clRed;
ListBox1.canvas.TextOut(Rect.Left, Rect.Top, ListBox1.Items[index]);
end
else
begin
ListBox1.Canvas.Brush.Color := clGreen;
ListBox1.canvas.TextOut(Rect.Left, Rect.Top, ListBox1.Items[index]);
end;

end;

其中listbox里包含4行文字, listbox1.style是lbOwnerDrawFix,
中文也没问题的
你再看看你的程序
 
唉,明白了,是我的BRUSH=WHITE了,在HIGHTLIGHT时,字也变白了:
procedure TForm1.ListBox1DrawItem(Control: TWinControl;
Index: Integer;
Rect: TRect;
State: TOwnerDrawState);
begin

if index=2 then
begin
ListBox1.Canvas.Brush.Color := clRed;
ListBox1.Canvas.FillRect(Rect);
ListBox1.canvas.TextOut(Rect.Left, Rect.Top, ListBox1.Items[index]);
end
else
begin
ListBox1.Canvas.Brush.Color := clWhite;
ListBox1.Canvas.FillRect(Rect);
ListBox1.canvas.TextOut(Rect.Left, Rect.Top, ListBox1.Items[index]);
end;
end;

又什么办法么,毕竟缺省颜色是绿色而与背景不同,太难看了
 
根据State: TOwnerDrawState 判断是否被选择
procedure TForm1.ListBox1DrawItem(Control: TWinControl;
Index: Integer;
Rect: TRect;
State: TOwnerDrawState);
begin

if index=2 then
begin
ListBox1.Canvas.Brush.Color := clRed;
ListBox1.Canvas.FillRect(Rect);
ListBox1.canvas.TextOut(Rect.Left, Rect.Top, ListBox1.Items[index]);
end
else
begin
if odSelected in State then
begin
ListBox1.Canvas.Brush.Color := clblack;
ListBox1.Canvas.FillRect(Rect);
ListBox1.canvas.TextOut(Rect.Left, Rect.Top, ListBox1.Items[index]);
end
else
begin
ListBox1.Canvas.Brush.Color := clWhite;
ListBox1.Canvas.FillRect(Rect);
ListBox1.canvas.TextOut(Rect.Left, Rect.Top, ListBox1.Items[index]);
end;
end;

end;
 
HUBDOG:谢谢,CODE完全没问题,但是,唉,我这水平真够陋的了,能否
给讲讲:
if odSelected in State then
里的odSelected是真对谁的么?我原来是用
if ListBox1.Selected[index] then
结果,全给涂蓝了。
不好意思,若嫌分少……(歪就歪嘟囔道……)
 
实际上ondrawitem是当item状态改变需要重绘时才会激发,
odSelected是对应当前被你选中需要重新绘制的item。
不知道是不是你要问的??
 
正是我要问的,但
1、和ListBox1.Selected[Index]有什么不同么?为什么你不用SELECTED?
2、恕我学识浅,我还是头一次见到:odSelected in State,什么时候应该
用它呢?
3、类似odSelected in State的应用还有么?比如……
我另开100分了,烦你进去点个卯。
 
1、因为有可能在ondrawitem时,control 还没有设定
ListBox1.Selected[Index]:=true or false你有可能取到错误的信息
另外State: TOwnerDrawState 可以给你很多别的信息比如
(odSelected, odGrayed, odDisabled, odChecked, odFocused, odDefault, odHotLight, odInactive, odNoAccel, odNoFocusRect, odReserved1, odReserved2, odComboBoxEdit);
是否是灰色的,是否focused等等信息
2、因为 state的类型是集合,所以用odselected in state
TOwnerDrawState = set of (odSelected, odGrayed, odDisabled, odChecked,
odFocused, odDefault, odHotLight, odInactive, odNoAccel, odNoFocusRect,
odReserved1, odReserved2, odComboBoxEdit);
3、至于其他的应用,肯定有比如...没想起来:(
 
明白了,长见识。
 
后退
顶部