CListCtrl的有关问题啊大神门,带小弟我飞

CListCtrl的问题啊,大神门,带我飞啊
自绘了一个ListCtrl,基类是CListCtrl,正常情况下是这样的
CListCtrl的有关问题啊大神门,带小弟我飞

行使价=1000是第一行
然后不知道怎么就出现了下面这种问题,第一行只能漏出一点点,但是滚动条已经到最顶上了,不能再往上滚动了
CListCtrl的有关问题啊大神门,带小弟我飞
要用鼠标在那漏出的一点点上单击一下,第一行才能刷新出来
CListCtrl的有关问题啊大神门,带小弟我飞
第一行刷新出来之后,表头与表格之间就出来一条缝隙,好大一条缝隙啊
CListCtrl的有关问题啊大神门,带小弟我飞

CListCtrl的有关问题啊大神门,带小弟我飞

然后将滚动条往下滚动,再滚到最顶时,第一行又只能漏一点点了
CListCtrl的有关问题啊大神门,带小弟我飞

这是咋回事??????大神带我飞啊

代码:
发送重绘消息的函数

LRESULT ClistctrlOptions::OnMyRedrawItem( WPARAM item, LPARAM subitem )  //根据情况 发出重绘item 信号
{
    if( item == 0xFFFFFFFE) // if item = -2, redraw whole list control 重绘整个list control
    {
        Invalidate(FALSE);
    }
    if( item==0xffffffff )  // item<0, mean redraw items[0,subitem]    重绘items[0,subitem] 
    {
        RedrawItems( 0, subitem );
    }
    else
        if( subitem==0xffffffff )  // subItem<0, mean Update item's all subitem.  重绘items[subitem,subitem] 
        {
            RedrawItems( item, item );       
        }
        else
        {
            if( subitem>=0 && subitem<MACRO_MaxSubItems )
            {
                int refrectsubitem = subitem ;
                if( refrectsubitem>=0 )
                {
                    CRect rect ;
                    if( GetSubItemRect( item, refrectsubitem, LVIR_LABEL, rect )==TRUE )
                    {   
                        rect.left++ ;
                        rect.right-- ;
                        rect.top++ ;
                        rect.bottom-- ;
                        InvalidateRect( rect, FALSE );  // only update subitem, no need clear bgn.
                    }
                }
                 
            }
             
        }
        return 0;
}


重绘函数(代码已简化,将那些设置颜色啥的代码都去掉了)

void ClistctrlOptions::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)  //重绘函数
{
 
    LPDRAWITEMSTRUCT lpDIS = lpDrawItemStruct;
    int nItem=lpDIS->itemID; //将要重绘的行值
    if(nItem == -1)       
        return ;   
    CRect rcCol = lpDIS->rcItem;  //这行的位置
 
    CString sText;   
    CDC* pDC=CDC::FromHandle(lpDIS->hDC);   
    int nOldDCMode=pDC->SaveDC();   
     
    LVITEM item;
    item.iItem = nItem;
    item.iSubItem = 0;   
    item.mask = LVIF_IMAGE|LVIF_STATE;   
    item.stateMask = 0XFFFF;   
    GetItem(&item);   
     
     
     
    ListView_SetExtendedListViewStyle(this->m_hWnd, this->GetStyle() & ~LVS_EX_GRIDLINES);//不显示网格线
         
         
    LV_COLUMN lvc;
    lvc.mask=LVCF_FMT|LVCF_WIDTH;
 
 
    rcCol.right = rcCol.left; 
    for(int nCol=0; GetColumn(nCol,&lvc); nCol++)
    {   
            rcCol.left = rcCol.right; 
            rcCol.right = rcCol.left + GetColumnWidth(nCol);       
             
             
            ::Rectangle(lpDIS->hDC, rcCol.left-1, rcCol.top-1 , rcCol.right , rcCol.bottom );
         
             
            pDC->DrawText(sText, -1, CRect::CRect(rcCol.left+3,rcCol.top,rcCol.right,rcCol.bottom-2), DT_RIGHT);   
    }
    pDC->RestoreDC(nOldDCMode);   
     
}

------解决思路----------------------
哎,这个现在可以不用重绘了,使用CMFCListCtrl类派生一下就搞定,你只需要管理数据就行了。比如


// CMyListCtrl

class CMyListCtrl : public CMFCListCtrl
{
DECLARE_DYNAMIC(CMyListCtrl)

public:
CMyListCtrl();
virtual ~CMyListCtrl();

protected:
DECLARE_MESSAGE_MAP()

/*通过虚函数可修改表的行、列的颜色和字体*/
virtual COLORREF OnGetCellBkColor(int nRow, int nColum); // 修改背景色
virtual COLORREF OnGetCellTextColor(int nRow, int nColum); // 修改文本色
virtual HFONT OnGetCellFont(int nRow, int nColum, DWORD dwData = 0); // 修改字体
// 排序处理
virtual int OnCompareItems(LPARAM lParam1, LPARAM lParam2, int iColumn);
private:
// 背景灰状态数组

------解决思路----------------------
好象滚动的问题,你没改吧?

------解决思路----------------------
是不是 head 绘制问题 ?
------解决思路----------------------
把根据字体自动调整行高的代码发上来,也许是它的问题.