+ -
当前位置:首页 → 问答吧 → ★★★关于CListCtrl删除列然后再增加列的问题

★★★关于CListCtrl删除列然后再增加列的问题

时间:2011-11-29

来源:互联网

最近做了一个全自绘的Report模式的CListCtrl,在控件创建起初,采用CListCtrl::InsertColumn函数增加自己所要增加的列数量,并且都能正常显示,然后增加List的Item都能显示,其中我是采用了LVS_EX_GRIDLINES扩展风格来显示网格的。

在我程序运行中,现在想根据用户的选择来显示列数量以及内容,所以我在用户设置之后,首先采用DeleteAllItems()函数删除所有的Item,然后如下代码删除表头
C/C++ code
CHeaderCtrl* pHeader=this->GetHeaderCtrl();
while(pHeader->GetItemCount())
    pHeader->DeleteItem(0);

在删除所有的信息之后,然后还是像创建初期那样,采用CListCtrl::InsertColumn来创建表头,然后再添加items,为什么表头增加的是正确的,比如在删除之前显示是5列,删除之后重新新增是7列,现在表头就CHeaderCtrl显示确实是7列,但是list中绘制的列缺失12列,也就是把删除前的5列也绘制出来了,如果我多次重复来执行删除表头,新增表头的话,list中绘制的列将会累计,很奇怪,不知道是什么原因。

顺便问一下,这个网格绘制应该不是我自己来完成绘制的吧,应该是系统来完成的,所谓开始我设置的全部自己绘制“LVS_OWNERDRAWFIXED ”应该只是单元格内容显示的绘制是我自己用代码完成吧,我这样理解应该是没有问题的吧?

所以求解!!!!!!!!!!!

C/C++ code
BOOL CMyGridCtrl::PreCreateWindow(CREATESTRUCT& cs) 
{
    cs.style |= LVS_REPORT | LVS_SINGLESEL | LVS_SHAREIMAGELISTS | LVS_OWNERDRAWFIXED | LVS_SHOWSELALWAYS;    
    return CListCtrl::PreCreateWindow(cs);
}

作者: afxtian   发布时间: 2011-11-29

call DeleteAllItems并没有删除CHeadctrl中的列标题信息,如果原来是5列标题,现在要变成7列,只用增加2列就行,其他列如果标题不对,更改一下标题即可.
如果设置为LVS_OWNERDRAWFIXED,那么所有的Item信息你必须自己绘制.

作者: yuucyf   发布时间: 2011-11-29

需要说明下的是,有时候我是要在现有基础上增加列的,有时候需要减少列的,这个完全是有用户去设置变更的,而且每个列所设置的居中、居左、居右格式也是不一样的,所以想删除完之前的,然后再根据用户设置来重新添加。

作者: afxtian   发布时间: 2011-11-29

while(m_list_view_.DeleteColumn(0));

作者: xxweilw   发布时间: 2011-11-29