使用CListCtrl::SortItems方法

1.列表控件(CListCtrl)的排序功能不像其它直接调用API就可以完成的功能一样.

它比较复杂.今天将我的一点体会简单地谈一下. 列表控件的顶部有一排按钮,

用户可以通过选择不同的列来对记录进行排序。但是 CListCtrl并没有自动排序的功能,

我们需要自己添加一个用于排序的回调函数来比较两个数据的大小,

此外还需要响应排序按钮被点击的消息。回调函数就好像是一个中断处理函数,

操作系统在符合你设定的条件时自动调用。

2.函数介绍

CListCtrl提供了用于排序的函数
函数原型为:BOOL CListCtrl::SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData);
其中第一个参数为全局排序函数(它就是回调函数)的地址,
第二个参数为用户数据,你可以根据你的需要传递一个数据或是指针。
该函数返回-1,代表第一项排应在第二项前面;
返回1代表第一项排应在第二项后面;
返回0代表两项相等。

 

排序函数原形为: int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
其中第三个参数为调用者传递的数据(即调用SortItems时的第二个参数dwData)。
第一和第二个参数为用于比较的两项的ItemData,

 

3.控件排序的实现

实现功能为单击列表头进行排序。

 

I.在父窗口中对LVN_COLUMNCLICK消息进行处理来实现。

 

II.CPP添加如下代码:

//排序回调函数实现
static int CALLBACK MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
    CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
     CString strItem1 = pListCtrl->GetItemText(lParam1, 0);
     CString strItem2 = pListCtrl->GetItemText(lParam2, 0); 
 

     LPCTSTR s1=(LPCTSTR)strItem1;
     LPCTSTR s2=(LPCTSTR)strItem2;

       return  strcmp(s2,s1);
 }


void C***::OnColumnclickList(NMHDR* pNMHDR, LRESULT* pResult)
{
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; 

    //  ******设置列表项的序号                 (特别注意)

    //  ******插入列表项时没有对该值进行设置

    //  ******必须在此设置;否则排序失败

   for(int i=0;i<m_listCtrl2.GetItemCount();i++)  

    m_listCtrl2.SetItemData(i,i);

    m_listCtrl2.SortItems(MyCompareProc2,(DWORD)&m_listCtrl2);

 

    *pResult = 0;


当你点击列表控件的表头时,此时它会向父窗口发送LVN_COLUMNCLICK消息,

此时响应函数OnColumnclickList(),

在该函数里面再调用列表控件的SortItems()成员函数,

它会自动调用排序函数,

完成排序功能

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您可以使用以下步骤将CGridCtrl的数据导出为Excel: 1. 遍历CGridCtrl的行和列,将数据存储在一个二维数组中。 2. 使用Microsoft Excel对象模型创建一个Excel应用程序对象。 3. 创建一个新的工作簿对象。 4. 在工作簿对象中创建一个工作表对象。 5. 将二维数组中的数据写入工作表对象中。 6. 使用SaveAs方法将工作簿保存为Excel文件。 以下是示例代码: ```c++ void ExportToExcel(CGridCtrl& gridCtrl, CString filePath) { // 获取行数和列数 int rowCount = gridCtrl.GetRowCount(); int colCount = gridCtrl.GetColumnCount(); // 创建二维数组存储数据 CStringArray* data = new CStringArray[rowCount]; for (int i = 0; i < rowCount; i++) { data[i].SetSize(colCount); for (int j = 0; j < colCount; j++) { data[i][j] = gridCtrl.GetItemText(i, j); } } // 创建Excel应用程序对象 CComPtr<IDispatch> pExcelApp; CoCreateInstance(CLSID_ExcelApplication, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pExcelApp); // 创建新的工作簿对象 CComPtr<IDispatch> pWorkbooks; pExcelApp->GetIDispatch(TRUE, (void**)&pWorkbooks); CComPtr<IDispatch> pWorkbook; pWorkbooks->Invoke1(L"Add", &vtMissing, &pWorkbook); // 创建工作表对象 CComPtr<IDispatch> pWorksheets; pWorkbook->GetIDispatch(TRUE, (void**)&pWorksheets); CComPtr<IDispatch> pWorksheet; pWorksheets->Invoke1(L"Item", &CComVariant(1), &pWorksheet); // 写入数据 CComVariant vData; vData.vt = VT_ARRAY | VT_VARIANT; SAFEARRAY* psa = SafeArrayCreateVector(VT_VARIANT, 0, rowCount * colCount); for (int i = 0; i < rowCount; i++) { for (int j = 0; j < colCount; j++) { CComVariant v(data[i][j]); SafeArrayPutElement(psa, &((long[]){i, j}), &v); } } vData.parray = psa; CComPtr<IDispatch> pRange; pWorksheet->GetIDispatch(TRUE, (void**)&pRange); pRange->PutProperty(0x00000022, vData); // 保存文件 CComVariant vFilePath(filePath); pWorkbook->Invoke1(L"SaveAs", &vFilePath, &vtMissing); // 释放资源 pWorksheet.Release(); pWorksheets.Release(); pWorkbook.Release(); pWorkbooks.Release(); pExcelApp.Release(); SafeArrayDestroy(psa); delete[] data; } ``` 请注意,此代码需要添加一些头文件和变量声明,以及正确的COM初始化和清理代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

allenjiao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值