我想实现的功能是给ListCtrl控件的一个子项换背景颜色。下面是我的代码:
LRESULT CMyDlg::OnCustomDrawList(LPARAM lParam)
{   LPNMLISTVIEW  pnm    = (LPNMLISTVIEW)lParam;switch (pnm->hdr.code)
{
 
case NM_CUSTOMDRAW:    LPNMLVCUSTOMDRAW  lplvcd = (LPNMLVCUSTOMDRAW)lParam;    switch(lplvcd->nmcd.dwDrawStage) 
    {    case CDDS_PREPAINT :
        return CDRF_NOTIFYITEMDRAW;    case CDDS_ITEMPREPAINT:
 
 return CDRF_NOTIFYSUBITEMDRAW;    case CDDS_SUBITEM | CDDS_ITEMPREPAINT:
        if(lplvcd->nmcd.dwItemSpec==1)
        {
            lplvcd->clrText = RGB(0, 0, 0);
            lplvcd->clrTextBk = RGB( 245, 210, 10 );
        }
return CDRF_NEWFONT;        return CDRF_NEWFONT;    
      }  }
}先请大虾给看看写的对不??
另外,该怎样利用消息映射机制来调用该函数啊??我写好了却不会调用,真是郁闷!

解决方案 »

  1.   

    .H afx_msg void OnCustomdrawMenuList( NMHDR*, LRESULT* );
    .CPPBEGIN_MESSAGE_MAP(CEditDlg, CDialog)
        ON_NOTIFY(NM_CUSTOMDRAW, IDC_MENULIST, OnCustomdrawMenuList)
    END_MESSAGE_MAP()
    void CEditDlg::OnCustomdrawMenuList( NMHDR* pNMHDR, LRESULT* pResult )
    {
    NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );    *pResult = 0;    if ( CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage )
        {
            *pResult = CDRF_NOTIFYITEMDRAW;
        }
        else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
        {
    //// custome draw /////////////////
            LVITEM   rItem;
            int      nItem = static_cast<int>( pLVCD->nmcd.dwItemSpec );
            CDC*     pDC   = CDC::FromHandle ( pLVCD->nmcd.hdc );
            COLORREF crBkgnd;
            BOOL     bListHasFocus;
            CRect    rcItem;
            CRect    rcText;
            CString  sText;
            UINT     uFormat;
            bListHasFocus = ( m_MenuList.GetSafeHwnd() == ::GetFocus() ); ZeroMemory ( &rItem, sizeof(LVITEM) );
    rItem.mask  = LVIF_IMAGE | LVIF_STATE;
    rItem.iItem = nItem;
    rItem.stateMask = LVIS_SELECTED | LVIS_FOCUSED;
    m_MenuList.GetItem ( &rItem ); m_MenuList.GetItemRect ( nItem, &rcItem, LVIR_ICON ); // Draw the icon.
    uFormat = ILD_TRANSPARENT | ILD_MASK; if ( ( rItem.state & LVIS_SELECTED ) && bListHasFocus )
    uFormat |= ILD_FOCUS; m_MenuImageList.Draw( pDC, rItem.iImage, rcItem.TopLeft(), uFormat ); // Draw the Text
    for( int i=0;i<3;i++ )
    {
    m_MenuList.GetSubItemRect( nItem, i,LVIR_LABEL,rcItem ); /////Draw Back
    if( rItem.state & LVIS_SELECTED )
    {
    crBkgnd = GetSysColor ( COLOR_HIGHLIGHT );
    pDC->SetTextColor ( GetSysColor ( COLOR_HIGHLIGHTTEXT ));
    }
    else
    {
    crBkgnd = GetSysColor ( COLOR_WINDOW );
    pDC->SetTextColor ( GetSysColor ( COLOR_BTNTEXT ));
    }
    pDC->FillSolidRect ( rcItem, crBkgnd );
    pDC->SetBkMode ( TRANSPARENT );
    /// end Draw Back sText = m_MenuList.GetItemText ( nItem, i );
    rcText = rcItem;
    rcText.left += 3;
    rcText.top++;
    LVCOLUMN col;
    col.mask = LVCF_FMT;
    m_MenuList.GetColumn( i,&col );
    if( (col.fmt & LVCFMT_CENTER) == LVCFMT_CENTER )
    {
    pDC->DrawText ( sText, rcText, DT_CENTER | DT_VCENTER | DT_SINGLELINE );        
    }
    else if( (col.fmt & LVCFMT_RIGHT) == LVCFMT_RIGHT )
    {
    pDC->DrawText ( sText, rcText, DT_RIGHT | DT_VCENTER | DT_SINGLELINE );        
    }
    else if( (col.fmt & LVCFMT_LEFT) == LVCFMT_LEFT )
    {
    pDC->DrawText ( sText, rcText, DT_LEFT | DT_VCENTER | DT_SINGLELINE );        
    } if ( bListHasFocus && ( rItem.state & LVIS_FOCUSED ))
    {
    pDC->DrawFocusRect ( rcItem );
    }
    }        *pResult = CDRF_SKIPDEFAULT;
        }}
      

  2.   

    http://www.codeproject.com/listctrl/lvcustomdraw.asp应该可以告诉你答案!