class CCoolListCtrl : public CListCtrlvoid CCoolListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
switch(pNMCD->dwDrawStage)
{
case CDDS_PREPAINT: 
{
*pResult = CDRF_NOTIFYITEMDRAW;
if(m_IsChange)
{
CPoint pt;
int nGap = 6;
for(int i = 0; i < GetItemCount(); i++)
{
GetItemPosition(i, &pt);
pt.y=50;
pt.x = nGap + i*(THUMBNAIL_WIDTH + nGap);
SetItemPosition(i,pt);
} }
m_IsChange=false;
break; }
case CDDS_ITEMPREPAINT:
{
*pResult = CDRF_DODEFAULT;
break;
}
default:
*pResult   =   CDRF_DODEFAULT;  
}   *pResult = 0;
继承一个ClistCtrl类,ICON模式下,使用custom draw。
问题:为什么InsertItem()的时候进不来CDDS_ITEMPREPAINT????
补充: const DWORD dwViewStyle =
     LVS_OWNERDRAWFIXED | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_BORDER | LVS_ICON;
if (!m_CoolListCtrl.Create (dwViewStyle, rectDummy, this, ID_TRANSFERLV))

解决方案 »

  1.   


    case CDDS_ITEMPREPAINT:
    改成:
    case CDDS_ITEMPREPAINT | CDDS_SUBITEM:
      

  2.   

     LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
     DWORD dwItemPrepaint = pNMCD->dwDrawStage & CDDS_ITEMPREPAINT;
     if(dwItemPrepaint > 0)
        AfxMessageBox("CDDS_ITEMPREPAINT OK!");
    你增加这段调试一下,看看是否收到CDDS_ITEMPREPAINT。
      

  3.   

    这样的话,不行的,还没有InsertItem的时候就满足条件了,调试不了。
      

  4.   

    估计InsertItem时,dwDrawStage除了你想要的值外,还有其它的属性值,这时候用等于判断,会不正确。你在InsertItem后,在这个函数中加断点,看一下dwDrawStage的值,分析一下都有哪些参数在里面。
      

  5.   


    我在InsertItem上设了个断点,在switch(pNMCD->dwDrawStage)设个断点,发现dwDrawStage的值总是为1,也就是CDDS_PREPAINT
      

  6.   

    http://blog.csdn.net/ctbinzi/archive/2009/09/02/4511634.aspx
    这篇文章的最后似乎和你的问题有些关系。看看吧。