我想在CListCtrl的子类中的一块区域绘制我自己的文字。但当CListCtrl插入新的Item或重绘客户区域时,我自己绘制的那块区域会被搽掉,如何能让它不被搽掉?
并且,不能重载OnPaint函数。不能重载DrawItem函数。
或者换一种方法解决此问题,各位告诉我如何得到MFC的重绘结束的消息?也就是说,如何我知道MFC的绘制已经结束,这时我再去绘制我的区域,也可以满足要求。但我只知道MFC提供WM_PAINT消息,表示MFC将开始绘制客户区,我却找不到一个WM_PAINTEND的消息。如果有,那就太好了。谁第一个帮我解决,全分送上!先来先得哦!
本人将于每天早中晚看三次此贴,如果那位认为解决了问题而没得到分,请耐心等待一下,不要说我是耍赖不给分哦.:-)

解决方案 »

  1.   

    你每次在你插入新的Item后再绘制一下你的文字,
    然后RedrawWindow()不可以吗?
      

  2.   

    你可以在ondraw中添加绘图处理的
      

  3.   

    to zhucde(【风间苍月】):
    你认为你的方法在MFC更新客户区域时会不被刷新掉吗?
    我插入新的Item时可以绘制一下,那滚动滚动条时,整个List更新时,我绘制的东西不就被刷掉了,要不然,就会变的有很多个我绘制的区域,一个都不被刷掉。
      

  4.   

    在截取WM_PAINT消息后,首先调用默认的处理过程,然后再调用自己的处理过程
      

  5.   

    同意 flyelf(空谷清音) 
      

  6.   

    你是不是画绘制背景文字?
    看看OnCustomDraw()
      

  7.   

    不同意flyelf!你的方法我试过,会异常出错。
    同意checkyvc6!
    我正是在OnCustomDraw里做的此事,但你没有解答我的问题。
    此问题我已自己解决。
    思路:得到List中某个Item的绘制结束消息,然后绘制我自己的区域,则不会被搽掉。
    方法如下:
    void CXListCtrlEx::OnCustomDraw( NMHDR *pNMHDR , LRESULT *pResult )
    {
    NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
    *pResult = 0 ;
    if (pLVCD->nmcd.dwDrawStage == CDDS_PREPAINT)
    {
    *pResult = CDRF_NOTIFYITEMDRAW;
    }
    else if (pLVCD->nmcd.dwDrawStage == CDDS_ITEMPREPAINT)
    {
    // This is the notification message for an item.  We'll request
    // notifications before each subitem's prepaint stage.
    pLVCD->clrText = GetItemColor( pLVCD->nmcd.dwItemSpec );

    // I want Draw the Record Index after the Item Redrawed!
    // DrawRecIndex();
    CRect rect;
    GetItemRect( pLVCD->nmcd.dwItemSpec , rect , LVIR_BOUNDS );

    if( rect.PtInRect( m_rectArea.BottomRight() ) || rect.PtInRect( m_rectArea.TopLeft() ) 
    || pLVCD->nmcd.dwItemSpec == GetCount() -1 )
    *pResult = CDRF_NOTIFYPOSTPAINT; // I hope I can get a PAINTEND message!
    else
    *pResult = CDRF_NOTIFYSUBITEMDRAW;
    }
    else if (pLVCD->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM))
    {
    // This is the prepaint stage for a subitem. Here's where we set the
    // item's text and background colors. Our return value will tell
    // Windows to draw the subitem itself, but it will use the new colors
    // we set here.
    }
    else if( pLVCD->nmcd.dwDrawStage == CDDS_ITEMPOSTPAINT )
    {
    DrawRecIndex();
    }
    }此贴不暂时不结,各位可以继续帮我解决此做法带来的负面影响。问题如下:
    在MFC的List控件中,如果项目太多,客户区显示不完,则出现滚动条。如果客户区中最下面一条Item(不是最后一条)只有一半显示出来,而此时用鼠标将这个选取时,由于MFC要将HighLight Item全部显示,所以,MFC此时会自动向上滚动一点,以便将HighLight Item全部显示给用户,但此时,MFC又自动重画客户区了。
    问:我如何得到这种MFC的自动滚动的消息。我试过,至少OnVScroll()是不行的。MFC自动滚动似乎不发出WM_VSCROLL的消息。各位请继续跟贴!Thx!
      

  8.   

    或者我这么问:
    在CListCtrl::OnClick(NMHDR* pNMHDR, LRESULT* pResult) 函数中,我把*pResult的值设为多少时,MFC将会不再处理NM_CLICK消息?
    因为在CListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)中,我将*pResult设置为CDRF_SKIPDEFAULT,MFC就不再处理消息。我希望对于NM_CLICK消息,*pResult也能有一个类似于CDRF_SKIPDEFAULT的值。