我想在CListCtrl的子类中的一块区域绘制我自己的文字。但当CListCtrl插入新的Item或重绘客户区域时,我自己绘制的那块区域会被搽掉,如何能让它不被搽掉?
并且,不能重载OnPaint函数。不能重载DrawItem函数。
或者换一种方法解决此问题,各位告诉我如何得到MFC的重绘结束的消息?也就是说,如何我知道MFC的绘制已经结束,这时我再去绘制我的区域,也可以满足要求。但我只知道MFC提供WM_PAINT消息,表示MFC将开始绘制客户区,我却找不到一个WM_PAINTEND的消息。如果有,那就太好了。谁第一个帮我解决,全分送上!先来先得哦!
本人将于每天早中晚看三次此贴,如果那位认为解决了问题而没得到分,请耐心等待一下,不要说我是耍赖不给分哦.:-)
并且,不能重载OnPaint函数。不能重载DrawItem函数。
或者换一种方法解决此问题,各位告诉我如何得到MFC的重绘结束的消息?也就是说,如何我知道MFC的绘制已经结束,这时我再去绘制我的区域,也可以满足要求。但我只知道MFC提供WM_PAINT消息,表示MFC将开始绘制客户区,我却找不到一个WM_PAINTEND的消息。如果有,那就太好了。谁第一个帮我解决,全分送上!先来先得哦!
本人将于每天早中晚看三次此贴,如果那位认为解决了问题而没得到分,请耐心等待一下,不要说我是耍赖不给分哦.:-)
解决方案 »
- vs2005 mscomm 控件没有setportopen()函数
- 发现tinyxml里可疑bug
- 结构体数据存取问题
- xp下开发的应用程序,在win7下运行时,连InitInstance()函数都没进就挂了,明白的来看看!
- 类似spy++的用鼠标获得窗体句柄的功能如何实现?分不够可加!
- 请教高手们
- 从文件读取值到整型变量中时遇到的棘手问题(急!多谢各位高手)
- 如何使用VC编程发送手机短信息?
- COM组件中调用别的COM组件,发生奇怪问题
- 下载了一个用ado操作数据库的类,但是不知如何来连接sql sever数据库
- 如何对打印口进行编程,急!!!UP有分
- OLE DB中如何得到一个已经打开的Rowset中的记录个数
然后RedrawWindow()不可以吗?
你认为你的方法在MFC更新客户区域时会不被刷新掉吗?
我插入新的Item时可以绘制一下,那滚动滚动条时,整个List更新时,我绘制的东西不就被刷掉了,要不然,就会变的有很多个我绘制的区域,一个都不被刷掉。
看看OnCustomDraw()
同意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!
在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的值。