首页 > 代码库 > VC 自绘CListCtrl类

VC 自绘CListCtrl类

http://www.codeproject.com/listctrl/quicklist.asp

http://www.codeproject.com/listctrl/ctooltiplistctrl.asp


实现功能:鼠标在ListCtrl上滑动的时候,滑动到哪一行哪一行就高亮,有且仅有一条是高亮的。

如何实现下面两个功能:
1.当鼠标离开ListCtrl的时候,高亮行取消高亮。
2.更改高亮行的背景色,默认是蓝色的,客户想要其它的颜色。


    //自绘CListCtrl类,重载虚函数DrawItem  
      
    void CNewListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)  
    {  
     // TODO: Add your code to draw the specified item  
     ASSERT(lpDrawItemStruct->CtlType == ODT_LISTVIEW);  
     CDC dc;   
     dc.Attach(lpDrawItemStruct->hDC);  
     ASSERT(NULL != dc.GetSafeHdc());  
     // Save these value to restore them when done drawing.  
     COLORREF crOldTextColor = dc.GetTextColor();  
     COLORREF crOldBkColor = dc.GetBkColor();  
       
     // If this item is selected, set the background color   
     // and the text color to appropriate values. Also, erase  
     // rect by filling it with the background color.  
     if ((lpDrawItemStruct->itemAction | ODA_SELECT) &&  
      (lpDrawItemStruct->itemState & ODS_SELECTED))  
     {  
      dc.SetTextColor(::GetSysColor(COLOR_HIGHLIGHTTEXT));  
      dc.SetBkColor(::GetSysColor(COLOR_HIGHLIGHT));  
      dc.FillSolidRect(&lpDrawItemStruct->rcItem,   
       ::GetSysColor(COLOR_HIGHLIGHT));  
     }  
     else  
     {  
      if(lpDrawItemStruct->itemID%2)  
       dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(128,128,128));  
      else  
       dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(255,128,255));  
     }  
       
     // If this item has the focus, draw a red frame around the  
     // item's rect.  
     if ((lpDrawItemStruct->itemAction | ODA_FOCUS) &&  
      (lpDrawItemStruct->itemState & ODS_FOCUS))  
     {  
      CBrush br(RGB(0, 0, 128));  
      dc.FrameRect(&lpDrawItemStruct->rcItem, &br);  
     }  
      
     // Draw the text.  
     CString strText(_T(""));  
     CRect rcItem;  
      
     for(int i=0; i<GetHeaderCtrl()->GetItemCount(); i++)  
     {  
      strText = GetItemText(lpDrawItemStruct->itemID, i);  
      GetSubItemRect(lpDrawItemStruct->itemID, i, LVIR_LABEL, rcItem);  
      rcItem.left += 5;  
      dc.DrawText(  
       strText,  
       strText.GetLength(),  
       &rcItem,  
      DT_LEFT|DT_SINGLELINE|DT_VCENTER);  
     }  
       
     // Reset the background color and the text color back to their  
     // original values.  
     dc.SetTextColor(crOldTextColor);  
     dc.SetBkColor(crOldBkColor);  
       
     dc.Detach();  
    }  
      
    // 调用  
      
    CNewListCtrl m_list; // 类的成员变量  
      
       
      
    #define IDC_LIST 0x1101  
     m_list.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|WS_VSCROLL|WS_HSCROLL|LVS_OWNERDRAWFIXED, CRect(0, 0, 280, 280), this, IDC_LIST);  
     m_list.ModifyStyle(0, LVS_REPORT|LVS_SINGLESEL);  
     m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);  
     m_list.InsertColumn(0, _T("AAA"), LVCFMT_LEFT, 100);  
     m_list.InsertColumn(1, _T("BBB"), LVCFMT_LEFT, 100);  
      
     CString strText(_T(""));  
     for(int i=0; i<20; i++)  
     {  
      m_list.InsertItem(i, _T(""));  
      strText.Format(_T("%d - Hello, World!"), i+1);  
      m_list.SetItemText(i, 0, strText);  
      strText.Format(_T("%d - ABCDEFG"), i+1);  
      m_list.SetItemText(i, 1, strText);  
     }  

显示效果如下图所示:


VC 自绘CListCtrl类