怪事年年有哈,我的listview不是在生成的时候闪烁。而是生成之后鼠标在上面移动时,移动到哪一条,哪一条就闪一下,请高手指教。我是用repaint+ondata动态生成的。

解决方案 »

  1.   

    你的listview   MouseMove  有事件处理吗?
      

  2.   

    listview   都响应什么消息、事件?
      

  3.   

    用form的
        DoubleBuffered := True试试
      

  4.   

    谢谢关注
    我试过Form.doublebuffered:=true;,Listview.doublebuffered:=true;都不管用。
    listview 的mouseMove没有任何处理,但是我想这里能不能屏蔽掉重画的消息?
    listview 有 columnclick 用来sort一个list ,然后用repaint调用了ondata 画 Item.
    有oncustomdraw自画,其中procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    begin
      //Sender.DoubleBuffered:=true;
      if (Item.Index mod 2) = 0 then
        Sender.Canvas.Brush.Color :=$00C0DCC0 //间隔绿
      else
        Sender.Canvas.Brush.Color :=$00F0FBFF; //间隔灰  LVDrawItem(ListView1, Item, State, DefaultDraw);----->这个对应下面的函数
    end;procedure LVDrawItem(Sender: TListView; Item: TListItem; State: TCustomDrawState;
      var DefaultDraw: Boolean);
    var
      BoundRect, Rect: TRect;
      i: integer;
      TextFormat: Word;
      LV: TListView;
      procedure Draw_CheckBox_ImageList(r: TRect; aCanvas: TCanvas; Checked: Boolean);
      var
        R1: TRect;
      begin
        if Sender.Checkboxes then
        begin
          aCanvas.Pen.Color := clBlack;
          aCanvas.Pen.Width := 2;
          //画CheckBox外框,也可以修改成你想要的图标显示
          aCanvas.Rectangle(r.Left + 2, r.Top + 2, r.Left + 14, r.Bottom - 2); //draw a rectangle using Pen and fill it with Brush
          if Checked then
          begin //画CheckBox的勾
            aCanvas.MoveTo(r.Left + 4, r.Top + 6);
            aCanvas.LineTo(r.Left + 6, r.Top + 11);
            aCanvas.LineTo(r.Left + 11, r.Top + 5);
          end;
          aCanvas.Pen.Width := 1;
        end;
        //开始画图标
        if (Item.ImageIndex > -1) and (LV.SmallImages <> nil) then
        begin
        //获取图标的RECT
          if Boolean(ListView_GetSubItemRect(sender.Handle, item.Index, 0, LVIR_ICON, @R1)) then
          begin
            LV.SmallImages.Draw(LV.Canvas, R1.Left, R1.Top, Item.ImageIndex);
          end;
        end;
      end;
    begin
      LV := Sender;
      BoundRect := Item.DisplayRect(drBounds); //Returns the bounding rectangle of the list item.
      InflateRect(BoundRect, -1, 0); //increases or decreases the width and height of the specified rectangle.
      if Item.Selected then //设置选中条颜色
      begin
        if cdsFocused in State then
        begin
          LV.Canvas.Brush.Color := clHighlight; //$00ECCCB9; //  //clHighlight; // 手动选中
          //LV.Canvas.Font.Color := clred;//clBtnText; //clHighlightText;
        end
        else
        begin
          LV.Canvas.Brush.Color := clHighlight; //$00F8ECE5; //clSilver; //自动选中--没有得到焦点
    //      LV.Canvas.Font.Color := clBtnText;
        end;
      end
      else
      begin
    //    LV.Canvas.Brush.Color := clWindow;
    //    LV.Canvas.Font.Color := clWindowText;
      end;
      LV.Canvas.FillRect(BoundRect); //初始化背景 using the current brush.
      for i := 0 to LV.Columns.Count - 1 do
      begin
      //获取SubItem的Rect
        ListView_GetSubItemRect(LV.Handle, Item.Index, i, LVIR_LABEL, @Rect);
        case LV.Columns[i].Alignment of
          taLeftJustify:
            TextFormat := 0;
          taRightJustify:
            TextFormat := DT_RIGHT;
          taCenter:
            TextFormat := DT_CENTER;
        end;
        case i of
          0: //画Caption
            begin
              Draw_CheckBox_ImageList(BoundRect, LV.Canvas, Item.Checked);
              InflateRect(Rect, -3, 0); //向后移3个像素,避免被后面画线框时覆盖
              DrawText(
                LV.Canvas.Handle, //HDC hDC, // handle to device context
                PCHAR(Item.Caption), // pointer to string to draw
                Length(Item.Caption), // string length, in characters
                Rect, // pointer to structure with formatting dimensions
                DT_VCENTER or DT_SINGLELINE or DT_END_ELLIPSIS or TextFormat); // text-drawing flags
            end;
          1..MaxInt: //画Subitems[i]
            begin
              if i - 1 <= Item.SubItems.Count - 1 then
                DrawText(
                  LV.Canvas.Handle,
                  PCHAR(Item.SubItems[i - 1]),
                  Length(Item.SubItems[i - 1]),
                  Rect,
                  DT_VCENTER or DT_SINGLELINE or DT_END_ELLIPSIS or TextFormat);
            end;
        end;
      end;
      LV.Canvas.Brush.Color := clWhite;
      if Item.Selected then //画选中条外框
      begin
        if cdsFocused in State then
          LV.Canvas.Brush.Color := clHighlight //$00DAA07A // $00E2B598; //clHighlight;
        else
          LV.Canvas.Brush.Color := $00E2B598; //$00DAA07A // clHighlight;
        LV.Canvas.FrameRect(BoundRect); //draw a 1 pixel wide border around a rectangular region
        // DrawFocusRect(Item.DisplayRect(drBounds)); //
      end;
      DefaultDraw := False; //True;//cdsSelected in State;
      //with Sender.Canvas do
      //if Assigned(Font.OnChange) then Font.OnChange(Font);
    end;我很奇怪,为什么鼠标移动到Item,Item就要重画一下呢?我该怎么让它不闪?请高手指教,分不够我再加
      

  5.   

    对ListView做操作时套上
    ListView1.Items.BeginUpdate;…………
    代码
    …………
    ListView1.Items.EndUpdate;
      

  6.   

    试了你的代码,没问题。可能是别的地方。用我的工具,把完整的程序发上来看看吧。www.filelet.com
      

  7.   

    ========= CSDN 附件,由 CSDN附件工具(请到http://www.filelet.com下载)创建 =========
    CSDNAttM000013460100C2CDBFA59F42D4FEA6C70EFAAA4E4A00000001000000000114dVBhcGVyUX
    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
    ================================================================================
      

  8.   

    这个就算有dfm也没办法运行,因为里面有许多自定义的类在另外的单元无法引用。
    所以如果你能根据listview的事件看出问题的话上面的就是全部了。
    不过很感谢你的热心。
      

  9.   

    谢谢,正是这个原因,现在不闪了。
    但是我想也想不明白,ownerdraw:=true;不是和我在
    procedure LVDrawItem(Sender: TListView; Item: TListItem; State: TCustomDrawState;
      var DefaultDraw: Boolean);
    里面的DefaultDraw := False;一样的效果吗?能告诉我原因吗?
      

  10.   

    我猜原因是这样的:如果设置了ownerdraw为false,listview会先画一遍,然后customdraw再画,导致刷新。
      

  11.   

    谢谢,但是我不太同意这个观点。
    DefaultDraw := False;不是阻止自动画了吗?