我在一个Listbox的Item上用Pen画了一条线,如何去掉这条线。画线的代码如下procedure TForm1.Button1Click(Sender: TObject);
var
  R: TRect;
begin
  R:= ListBox1.ItemRect( 0 );
  ListBox1.Canvas.Pen.Width:= 2;
  ListBox1.Canvas.MoveTo(R.Left, R.Top + 1);
  ListBox1.Canvas.LineTo(R.Right, R.Top + 1);
end;
如果去掉刚刚的画线,应该怎么做?
Refresh当然行,但这个不是重绘整个Listbox吗?有没有方法可以只重绘被画线的Item,而不用重绘整块画布。就像选中一个Item, 该Item背景被画成蓝色,字体会由黑色变成白色。但这个画操作不会重画整个Listbox。

解决方案 »

  1.   

    var
      R: TRect;
    begin
      R:= ListBox1.ItemRect( 0 );
      ListBox1.Canvas.Pen.Width:= 2;
      ListBox1.Canvas.MoveTo(R.Left, R.Top + 1);
      ListBox1.Canvas.LineTo(R.Right, R.Top + 1);
      ListBox1.Canvas.Brush.Color := clWhite;
      R.Bottom := R.Top + ListBox1.Canvas.Pen.Width;
      ListBox1.Canvas.FillRect(R);
    end;
    这样吗
      

  2.   

    sanguomi ,你的方法是又画了一个白的矩形框,黑线是去掉了,但也会覆盖掉Item.Caption啊。你可以试试,在Item上画一条线,就像“你好”这样。然后选中他,再取消选中,最后的样子其实就是回到了画线前的样子。我要的就是如何在Item上面画了一条线后,再让他回复到画线前,当然最好是只重绘这个Item所占的区域。
      

  3.   

    突然想到是不是要重新FillRect后再DrawText
      

  4.   

    有个办法,加多一条
    var
      R: TRect;
    begin
      R:= ListBox1.ItemRect( 0 );
      ListBox1.Canvas.Pen.Width:= 2;
      ListBox1.Canvas.Pen.Mode:=pmNotXor; //用异或模式来画线,第二次用的时候就擦掉了
      ListBox1.Canvas.MoveTo(R.Left, R.Top + 1);
      ListBox1.Canvas.LineTo(R.Right, R.Top + 1);
    end;
      

  5.   

    在原坐标上再画一遍,颜色设成你的背景色就是fillrect那个颜色,这样试试