2019-02-01

MFC第三方库XTP实现列表内容排序

作者:administrator 所属分类 - 前端美工

之前接坑了个项目,大致是项目是使用XTToolkitPro这个库,要求大致是给这个东西实现内容排序。刚开始觉得很简单,后面发现其实是有坑点在里面的。这里共享给大家。

首先是由于这个古老的库,实在是太古老了,只适合在VS2010之类的IDE使用,并且编译器版本不应该高于MSVC10,所以需要适度修改兼容新的编译器和链接器。经过修改以后,这个库支持MSVC14.2编译器并且打开不崩溃了。这里给几个“无法解析xxx”的解决办法:

  • // 把这个加入stdafx.h(如果有的话)

#if _MSC_VER>=1900

_ACRTIMP_ALT FILE* __cdecl __acrt_iob_func(unsigned);
extern "C"
FILE* __cdecl __iob_func(unsigned i) {
return __acrt_iob_func(i);
}

#endif

  • 将#ifdef _UNICODE这个宏删除,如图,这样就可以在VS2017编译使用了,但是编译以后,有的项目仍然会崩溃,就需要更改lib里面的一些内容了。

XTP这个库,很多人的印象是某著名开源远控使用的库,这个库非常古老,而且问题很多,BUG也经常有。而且,我的项目“有幸”遇到了一个严重的问题,就是分组之后无法自动排序,而手动排序也无法获取到列的指针(或者获取到了,调用任何方法都会崩溃)。只能退而求其次,让客户点击排序的时候显示一个对话框,再按照要求排序了。

ON_NOTIFY(XTP_NM_REPORT_SORTORDERCHANGED, IDC_REPORT, OnReportItemClick)

本来是使用这个回调响应的,结果这个回调到函数上面,就出现了一堆问题。于是改成了如下方法绕弯子实现。

void CEnterpriseControlDlg::OnReportItemClick(NMHDR * pNotifyStruct, LRESULT * /result/)
{
XTP_NM_REPORTRECORDITEM* pItemNotify = (XTP_NM_REPORTRECORDITEM*)pNotifyStruct; sortdlg sdlg; if (Sort_Down)Sort_Down = FALSE; else Sort_Down = TRUE; sdlg.SortMethod = &SortMethod; sdlg.DoModal(); for (int i = 0; i < m_wndReport.GetRecords()->GetCount(); i++) { CXTPReportRecord *pRecord = m_wndReport.GetRecords()->GetAt(i); pRecordSort = pRecord; SortItemGroupEx(); pRecord->SetExpanded(TRUE); } m_wndReport.Populate(); // PopulateReport();
}

按照这个方法,总算解决了排序的问题,本来10分钟就能解决的问题,硬是用了一天。上面的代码大概是响应排序点击事件,然后可以获取要排序的列表,再调用自己的排序函数(我的排序函数是自己实现的,大家也可以按照自己的思路实现)。

总的来说,不推荐使用MFC和MFC的第三方类库,问题多而且性能不怎么好。加上很多闭源类库并不支持64位,这里推荐使用SDL之类的开源界面库,简单粗暴,也比MFC之类的先进,亦有社区去维护。

隐藏