关于VC6中使用ListCtrl控件,无法删除表头的问题

由于项目需要列表,所以从网上下了一个CMyListCtrl,可以修改颜色,可以修改表头字体,反正一大堆可控的函数,一直在VS2017中运行良好,修改表头,删除表头重新设置表头,都没问题,但由于有些客户端是XP系统,所以需要将程序移植到VC6和VS2010 中,这时,问题来了,之前删除表头,重新插入表头的函数,现在删除没问题,但重新插入之后,仍然是之前的表头字符,查了N久,都找不出问题,网上查,很多人都反应此问题,但无人能解,给出的答案全部是一个人写的,而那个答案在VS2017中不存在问题,我也一直在用.那为啥VC6和VS2010就不行了呢,经过一晚上测试,终于找到了答案.

    在CMyListCtrl中有一个CMyHeaderCtrl,从变量中可以看到有一个私有CStringArray的变量,这个变量正是表头的字符,当删除表头之后,这个私有变量并未被删除,原因不明,可能是微软的BUG,也可能是其它什么乱七八糟的原因,不去管它,就是这个私有变量,用尽一切手段,都删不掉,但好在,可以通过GetAt(int n)获取到,也可以通过SetAt(int n)改变它,OK,能改变就行了.下面是代码:


void CMyListCtrl::DeleteAllColumItem()            // 这个函数是从网上下来的,一般直接用这个就可以,但VC6不行
{
    DeleteAllItems();                            //先删除所有的数据行
    int nColumn = m_Header.GetItemCount();            //得到列数
    for (int i = 0; i < nColumn; i++) {
        this->DeleteColumn(0);            // 注意这里是CListCtrl类中的函数,不是CHeaderCtrl
    }
}

void CDBList::InitSubListProgram()
{
    BYTE i = 0 ;
    RECT rt ;
    m_List.GetWindowRect(&rt);
    int w = rt.right-rt.left ;
    
    m_List.DeleteAllColumItem();      // 先删除所有列和行,在VC6中也可以,但后面的就不行
    
    m_List.InsertColumn(i,"序",            LVCFMT_CENTER,    45,        i++);
    m_List.InsertColumn(i,"单号",    LVCFMT_CENTER,    70,        i++);
    m_List.InsertColumn(i,"程序号",        LVCFMT_CENTER,    70,        i++);
    m_List.InsertColumn(i,"程序名",        LVCFMT_CENTER,    200,    i++);
    m_List.InsertColumn(i,"夹具",        LVCFMT_CENTER,    100,    i++);
    m_List.InsertColumn(i,"长度",        LVCFMT_CENTER,    100,    i++);
    m_List.InsertColumn(i,"柄",        LVCFMT_CENTER,    100,    i++);    
    m_List.InsertColumn(i,"方法",        LVCFMT_CENTER,    100,    i++);    
    m_List.InsertColumn(i,"余量",        LVCFMT_CENTER,    100,    i++);
    m_List.InsertColumn(i,"开始",        LVCFMT_CENTER,    200,    i++);
    m_List.InsertColumn(i,"结束",        LVCFMT_CENTER,    200,    i++);
    m_List.InsertColumn(i,"操作员",        LVCFMT_CENTER,    100,    i++);


    CMyHeaderCtrl *p = &m_List.m_Header;     // 如果没有下面的行,到这里结束的话,是不会改变表头的.这里才真正改变表头
    CString *s = p->m_HChar.GetData() ;
    CString s0 = p->m_HChar.GetAt(0);
    CString s1 = p->m_HChar.GetAt(1);        // 尝试获取字段名,没问题

    i = 0 ;
    p->m_HChar.SetAt(i++,_T("序号"));         // 像这样,直接修改字段,搞定
    p->m_HChar.SetAt(i++,_T("单号"));
    p->m_HChar.SetAt(i++,_T("程序号"));
    p->m_HChar.SetAt(i++,_T("程序名"));
    p->m_HChar.SetAt(i++,_T("夹具"));
    p->m_HChar.SetAt(i++,_T("长度"));
    p->m_HChar.SetAt(i++,_T("柄"));
    p->m_HChar.SetAt(i++,_T("方法"));
    p->m_HChar.SetAt(i++,_T("余量"));
    p->m_HChar.SetAt(i++,_T("开始"));
    p->m_HChar.SetAt(i++,_T("结束"));
    p->m_HChar.SetAt(i++,_T("操作员"));


    
}

以上函数在VC6,VS2010中使用良好.在VS2017,VS2013中则不需要这么做.

 

补充说明,前面写的是上个月的心得,后面又有新的发现,其实是这么回事,列表控件的属性设置如果为不可见,则VC6,VS2010与VS2017没啥区别,都不必后面的那段修改字段,只需要前面的就可以了,如果属性设置为可见,那么VS2017也需要后面这段.其实VC6,VS2010,VS2013,2017是完全一样的.不存在版本差异.只是属性设置的问题,为免误导嫌疑,特此补充说明.

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zzzzzmonkey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值