读书人

关于CListCtrl自绘的有关问题

发布时间: 2014-06-01 16:30:44 作者: rapoo

关于CListCtrl自绘的问题
我使用了一个CListCtrl自绘的控件,刚打开程序的时候,自绘是可以正常显示的
DrawItem函数是可以调试进入的,显示的是Report模式
但是,我DeleteAllItems();然后将列全部删除后,再添加新的列进来,然后添加数据
这时,数据无法显示了,调试没有进入到DrawItem函数中,也没有报错,看滚动条状态也正常
只是好像根本就不调用DrawItem自绘了,不知道是什么原因?
[最优解释]
你把每一列拉大一下 那一列数据就显示出来了,但是仍然有其他问题,比如点击那一列也不选中了,造成这样的问题就是你直接调用了m_HeaderCtrl的DeleteItem绕过了CListCtrl,读取属性什么的可以调用m_HeaderCtrl
但是你要增删改什么的要通过CListCtrl的成员函数,因为HeaderCtrl属于CListCtrl的一部分。
[其他解释]
可以参考我做过的一个例子:
http://blog.csdn.net/hurryboylqs/article/details/5862046
[其他解释]
hurryboylqs
我用你的例子测试了一下,删除数据后,重新添加
显示的也不对
[其他解释]
sorry,我少加了一句SetItemCount,多谢
[其他解释]
查查style是不是变了。
[其他解释]
hurryboylqs 给的例子是使用NM_CUSTOMDRAW消息自绘的,
我这个是使用LVS_OWNERDRAWFIXED,DrawItem方式自绘的,

style没有变,只是数据不能正常显示了,也就是DrawItem没有被调用,我想知道是什么原因
[其他解释]
‘将列全部删除’ 列头 没删除吧 ?
[其他解释]
mListX.DeleteAllItems();
CHeaderCtrl *pHeader = mListX.GetHeaderCtrl();
int xn = pHeader->GetItemCount();
for (int i = xn - 1; i >= 0; --i)
{
pHeader->DeleteItem(i);
}
是这样删除数据和列的,然后再添加数据就无法显示了
[其他解释]
‘再添加数据’就要再加 列头 ,没有 列头 是 不能 显示的。
[其他解释]
是的,当然添加了列头后,再添加数据的
[其他解释]
列头,滚动条状态都显示正常,就是数据没有显示出来,网格线也正常,我GetItemCount()正常,返回的个数和添加的一致,我查看了添加的数据也没有发现异常,奇怪
[其他解释]
我不喜欢用DrawItem,觉得在里面画的话不完整(完美),可以的话你把demo发我给你调调看:liqisong611@hotmail.com
[其他解释]
为什么要把 列头 都删除? 列头可以通过 SetItem 来改的,多余的才 删除。

[其他解释]
hurryboylqs
已发送邮件,谢谢了
[其他解释]
>>schlafenhamster:
不管怎样,这种现象都是不对的,既然控件提供了这个功能,不可能只是希望不被用到,而且有可能会引发其他错误出来
[其他解释]
自绘控件有源码么?
可以回过去查调用。

是VCbase上面的那个么?
我是记得上面那个有严重的BUG,我自己修改了一下才OK。
不能及时切换色彩。。


[其他解释]
再强制InvalidateRect一下呢?有效果没?
[其他解释]
VisualEleven
在外部调用刷新没有效果,应该不是刷新的问题,好像哪里不对,以至于没有能够调用DrawItem函数
[其他解释]
tiger9991
是的,vckbase上那个CListCtrlCl,颜色的大多没有用到,我去掉了,我只是简单的使用它显示数据
请问你改的是什么bug?不知和这个有没有关系
[其他解释]
是刷新的问题
[其他解释]
这个代码临时放置在这里
http://www.vdisk.cn/down/index/11386899#?


有兴趣的朋友,帮忙看一下
[其他解释]
因为你删除列调用的函数不得当导致的:
void CListCtrlCl::ClearAllColumn()
{
DeleteAllItems();
int xn = m_Header.GetItemCount();
for (int i = xn - 1; i >= 0; --i)
{
m_Header.DeleteItem(i); //这样是有问题的,你绕过了CListCtrl直接操作HeaderCtrl
}
}

应该像下面:

void CListCtrlCl::ClearAllColumn()
{
DeleteAllItems();
/*
int xn = m_Header.GetItemCount();
for (int i = xn - 1; i >= 0; --i)
{
m_Header.DeleteItem(i);
}*/

int nColumnCount = m_Header.GetItemCount();

// Delete all of the columns.
for (int i=0; i < nColumnCount; i++)
{
DeleteColumn(0);//用CListCtrl自身的函数来删除列头,这样CListCtrl才能设置相应的内部数据结构
}




}
[其他解释]
怎么刷新?哪里的错误?
[其他解释]
果然是的,多谢了

读书人网 >VC/MFC

热点推荐