MFCのリストコントロールでソート処理を行いたいのですが、以下の様に作りましたがソートが行われません。
コールバック関数の引数LPARAM lParam1, LPARAM lParam2,は共に0が入ったままになっています。
わかる人がいましたらぜひ教えて下さい。
lang
1// フォルダ内からOutput_xxxx_xxxx.binファイルを探してリストに登録 2void CSampleDlg::OnEnChangeEdit1() 3{ 4 BOOL bContinue; 5 CFileFind cFind; 6 CString strFile; 7 CString strFolder = szDisplayName; 8 CString strExtension; 9 LVITEM lvi; 10 11 if(strFolder.Right(1) != "\"){ 12 strFolder += "\Output*.bin"; 13 } 14 strFolder += strExtension; 15 16 bContinue = cFind.FindFile(strFolder); 17// 要検証 18 while(bContinue){ 19 int i=0; 20 21 bContinue = cFind.FindNextFile(); 22 23 if(cFind.IsDirectory() == FALSE) 24 { 25 INT i=0, index ; 26 27 strFile = cFind.GetFileName(); 28 29 int f = strFile.Find('_'); 30 int l = strFile.ReverseFind('_'); 31 int e = strFile.ReverseFind('.'); 32 33 // Mid(offset, length) 34 CString csSeq = strFile.Mid(f+1, l-(f+1)); 35 CString csLen = strFile.Mid(l+1, e-(l+1)); 36 37 lvi.mask = LVIF_TEXT; 38 lvi.iItem = i++; 39 lvi.iSubItem = 0; 40 lvi.pszText = (LPTSTR)(LPCTSTR)strFile; 41 if (index = m_xcList.InsertItem(&lvi) == -1) break; 42 43 lvi.iItem = index; 44 lvi.iSubItem = 1; 45 lvi.pszText = const_cast<LPTSTR>(static_cast<LPCTSTR>(csSeq)); 46 if (!m_xcList.SetItem(&lvi)) break; 47 48 lvi.iItem = index; 49 lvi.iSubItem = 2; 50 lvi.pszText = (LPTSTR)(LPCTSTR)csLen; 51 if (!m_xcList.SetItem(&lvi)) break; 52 53 CString sum; 54 sum.Format("%lu", (strtoul(csSeq,NULL,10))+atol(csLen)); 55 lvi.iItem = index; 56 lvi.iSubItem = 3; 57 lvi.pszText = (LPTSTR)(LPCTSTR)sum; 58 if (!m_xcList.SetItem(&lvi)) break; 59 60 } 61 } 62} 63 64// コールバック関数 クラス内に定義する場合はStaticを付ける事 65int CALLBACK CSampleDlg::CompareData(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); 66 67 68// カラムクリックイベント 69void CBinUnitDlg::OnLvnColumnclickList2(NMHDR *pNMHDR, LRESULT *pResult) 70{ 71 LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); // <LPNMLISTVIEW>が必要 72 m_xcList.SortItems( &CBinUnitDlg::CompareData, pNMLV->iSubItem); 73 74 // フラグを逆にする 75 flag = !flag; 76 77} 78 79// ソート 80int CALLBACK CSampleDlg::CompareData(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) 81{ 82 LV_FINDINFO lvf; 83 int idx1 , idx2; 84 TCHAR szBuf1[256],szBuf2[256]; 85 86 87 lvf.flags = LVFI_PARAM ; 88 lvf.lParam = lParam1 ; 89 idx1 = m_xcList.FindItem(&lvf,-1) ; 90 lvf.lParam = lParam2 ; 91 idx2 = m_xcList.FindItem(&lvf,-1) ; 92 memset(szBuf1,0x00,sizeof(szBuf1)); 93 memset(szBuf2,0x00,sizeof(szBuf2)); 94 m_xcList.GetItemText( idx1 , (int)lParamSort , szBuf1 , sizeof(szBuf1)) ; 95 m_xcList.GetItemText( idx2 , (int)lParamSort , szBuf2 , sizeof(szBuf2)) ; 96 97 98 if(flag==TRUE) 99 return(_tcscmp(szBuf1,szBuf2)) ; 100 else 101 return(_tcscmp(szBuf1,szBuf2)* -1) ; 102 103 104} 105
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/02/23 10:35