松鼠的博客

导航

为TListView项自绘图标

(1)将OwnerDraw属性设为 true

(2)编写OnDrawItem事件代码 (推荐使用ListView1CustomDrawItem事件来实现自绘)

/*
    自绘
*/
void __fastcall TForm1::ListView1DrawItem(TCustomListView *Sender,
      TListItem 
*Item, TRect &Rect, TOwnerDrawState State)
{
    TListView 
*lv = (TListView *)Sender;
    TRect rct(Rect.Left, Rect.Top, Rect.Width(), Rect.Bottom);
    
//突出显示选中项
    if(/*State.Contains(odFocused) || */State.Contains(odSelected))
    {
        lv
->Canvas->Pen->Color = clBlue;
        lv
->Canvas->Rectangle(rct);
        lv
->Canvas->Font->Color = clWhite;
    }
    
else
    {
        lv
->Canvas->Brush->Color = lv->Color;
        lv
->Canvas->FillRect(Rect);
        lv
->Canvas->Font->Color = clBlack;
    }
    lv
->Canvas->TextOut(Rect.Left,Rect.Top + 2,Item->Caption);

    
// Draw SubItem Text
    int nColOffset(0);
    
for(int i=0; i<Item->SubItems->Count; i++)
    {
        nColOffset 
+= lv->Column[i]->Width;
        lv
->Canvas->TextOut(nColOffset + Rect.Left,
            Rect.Top 
+ 2,
            Item
->SubItems->Strings[i]);
    }
}

如果出现ListView Item高不够的情况可以使用绑定一个ImageList组件来撑高ListViewItem的行高

说明:
使用ListView1CustomDrawItem来实现自绘项,可以不影响每一项的高度,性能也更好一些。

void   __fastcall   TForm1::ListView1CustomDrawItem(TCustomListView   *Sender,   
          TListItem   
*Item,   TCustomDrawState   State,   bool   &DefaultDraw)   
  
{   
          HDC   hDC   
=   GetDC(ListView1->Handle);   
          TRect   Rect   
=   Item->DisplayRect(drIcon);//关键部分
          DrawEdge(hDC,   &Rect,   EDGE_RAISED,   BF_RECT);   
          ReleaseDC(ListView1
->Handle,   hDC);   
  }

 

参考:
http://www.ccrun.com/article.asp?i=656&d=qdc7kg
http://topic.csdn.net/t/20020811/10/931824.html

posted on 2008-09-03 11:18  Xproer-松鼠  阅读(574)  评论(0)    收藏  举报