CListCtrl排序 unicode vs2008

简介:
1. CCZLogAnalysisDlg类外面添加如下代码:
typedef struct tag_ListSortNode
{
         CListCtrl* pList;
         int nOrder;
         int nColum;
 
}LISTSORTNODE,*PLISTSORTNODE;
 
2. CCZLogAnalysisDlg.h头部文件添加如下代码:
//CListCtrl控件LVN_COLUMNCLICK函数的声明:
afx_msg void OnLvnColumnclickListdatainfo(NMHDR *pNMHDR, LRESULT *pResult);
//回调函数的声明:
static int CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort);
//结构体的声明:
LISTSORTNODE m_tSortColumns[3];
 
3. CCZLogAnalysisDlg.cpp源文件添加如下代码:
void CCZLogAnalysisDlg::OnLvnColumnclickListdatainfo(NMHDR *pNMHDR, LRESULT *pResult)
{
         //LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
         //// TODO: 在此添加控件通知处理程序代码
 
         //*pResult = 0;
 
         NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
         // TODO: Add your control notification handler code here
         //获取列的排序数据
         PLISTSORTNODE pItem = &m_tSortColumns[pNMListView->iSubItem];
         pItem->pList        = &m_ListCtrl;
         pItem->nColum       = pNMListView->iSubItem;
         if ( pItem->nOrder == 0 )
         {
                   pItem->nOrder = 1;
         }
         else
         {
                   pItem->nOrder = 0;
         }
 
         m_ListCtrl.SortItems(CompareFunc,(LPARAM)pItem);
         *pResult = 0;
}
int CALLBACK CCZLogAnalysisDlg::CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort)
{
         PLISTSORTNODE pItem =(PLISTSORTNODE)lParamSort;
         CListCtrl*   list =pItem->pList;
         int          isub =pItem->nColum;
         LVFINDINFO findInfo;
         findInfo.flags = LVFI_PARAM;
         findInfo.lParam = lParam1;
         int iItem1      = list->FindItem(&findInfo, -1);
         findInfo.lParam = lParam2;
         int iItem2      = list->FindItem(&findInfo, -1);
 
         CString strItem1 =list->GetItemText(iItem1,isub);
         CString strItem2 =list->GetItemText(iItem2,isub);
 
         const wchar_t* cItem1 = NULL;
         const wchar_t* cItem2 = NULL;
         cItem1 = strItem1.GetBuffer(sizeof(strItem1));
         cItem2 = strItem2.GetBuffer(sizeof(strItem2));
 
         ////判断是否比较列是否为数值
         //if ( isub == 2 )
         //{
         //      int nNum1 = atoi( strItem1 );
         //      int nNum2 = atoi( strItem2 );
         //      if(pItem->nOrder == 0)
         //               return nNum1>nNum2 ? 1 : -1;
         //      else
         //               return nNum1>nNum2 ? -1 : 1;
         //}
         //else
         //{
         //      if(pItem->nOrder == 0)
         //               return strcmp(strItem2, strItem1);
         //      else
         //               return -strcmp(strItem2, strItem1);
         //}
         if ( isub != 2 )
         {
                   if(pItem->nOrder == 0)
                            return wcscmp(cItem2, cItem1);
                   else
                            return -wcscmp(cItem2, cItem1);
         }
}
 
4.最重要的一步:
在控件InsertItem与SetItemText函数之间添加SetItemData函数。
 
//添加ListCtrl数据
int nRet;    //m_ListCtrl为控件对应变量
nRet = m_ListCtrl.InsertItem( m_ListCtrl.GetItemCount( ), _T("http://www.a3gs.com ") );
//设置一个唯一的Item数据,否则无法排序
m_ListCtrl.SetItemData( nRet, 0 );
m_ListCtrl.SetItemText( nRet, 1, _T("天使知识授理厂") );
m_ListCtrl.SetItemText( nRet, 2, _T("100") );
 
nRet = m_ListCtrl.InsertItem( m_ListCtrl.GetItemCount( ), _T("http://www.a3gs.com") );
m_ListCtrl.SetItemData( nRet, 1 );
m_ListCtrl.SetItemText( nRet, 1, _T("Android") );
m_ListCtrl.SetItemText( nRet, 2, _T("20") );
 


本文转自 韬光星夜 51CTO博客,原文链接:http://blog.51cto.com/xfqxj/1130686,如需转载请自行联系原作者
相关文章
Unicode 上角标下角标,可用于代码字符串中
Unicode 上角标下角标,可用于代码字符串中
|
安全 Windows
Window下Unicode字符与多字节字符的转换方法
第一个就是宽字符到多字节字符转换函数,函数原型如下: int WideCharToMultiByte( UINT CodePage, DWORD dwFlags, LPCWSTR lpWideCharStr, int cchWideChar, LPSTR lpMultiByteStr, int cbMultiByte, LPCSTR lpDefaultChar, LPBOOL lpUsedDefaultChar ); 此函数把宽字符串转换成指定的新的字符串,如ANSI,UTF8等,新字符串不必是多字节字符集。
1090 0
|
算法 存储
C实现字符排列
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/46437485 用已知字符串s中的字符,生成由其中n个字符组成的所有字符的排列。
605 0
|
6月前
给kprobe添加字符数据显示方式
给kprobe添加字符数据显示方式
|
数据安全/隐私保护
UITextView/UITextField检测并过滤Emoji表情符号
UITextView/UITextField检测并过滤Emoji表情符号
20天刷题计划-567. 字符串的排列
二、思路分析: 判断 s2 中判断是否包含 s1 的排列, 而子串必须是连续的,所以要求的 s2 子串的长度跟 s1 长度必须相等。。这道题主要用到思路是:滑动窗口. 创建两个数组, 数组一存放字符串一中各字母的个数,数组二存放字符串2中各字母的个数; 开始时,先将两数组中前n个(n是字符串1的长度)字符数目,加入到两个数组中,判断是否相等; 若不包含子串排列,则窗口右移一格,数组2中的字母个数随之变化; 初始化取得第一个滑动窗口的目标值 继续滑动窗口,每往前滑动一次,需要删除一个和添加一个元素
|
测试技术
字符串的排列
    题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab、cba。 求整个字符串的排列,可以看成两步: 首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。
801 0