由于项目需要列表,所以从网上下了一个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是完全一样的.不存在版本差异.只是属性设置的问题,为免误导嫌疑,特此补充说明.