메시지 맵에 통지 메시지를 추가시킨다.
ON_NOTIFY(HDN_ITEMCLICKA, 0, OnHdnItemclick) ON_NOTIFY(HDN_ITEMCLICKW, 0, OnHdnItemclick)
헤더에함수 정의를 해준다.
afx_msg void OnHdnItemclick(NMHDR *pNMHDR, LRESULT *Result); static int CALLBACK SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
헤더에 필요한 관련 구조체화 변수를 public 형식으로 추가해준다.
BOOL m_bAscending; struct HSORTITEM { CListCtrl* pSortItem; int iColumn; };
함수를 구현한다.
void CFileList::OnHdnItemclick(NMHDR *pNMHDR, LRESULT *pResult) { LPNMHEADER phdr = NULL; phdr = reinterpret_cast<LPNMHEADER>(pNMHDR); HSORTITEM item; item.iColumn = phdr->iItem; item.pSortItem = this; // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. SortItems(SortFunc, (LPARAM)&item); m_bAscending = !m_bAscending; } int CALLBACK CFileList::SortFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { HSORTITEM* pItem = (HSORTITEM*)lParamSort; CFileList *pListCtrl = (CFileList*)pItem->pSortItem; BOOL bascending = pListCtrl->m_bAscending; LVFINDINFO info1, info2; info1.flags = LVFI_PARAM; info1.lParam = lParam1; info2.flags = LVFI_PARAM; info2.lParam = lParam2; int irow1 = pListCtrl->FindItem(&info1,-1); int irow2 = pListCtrl->FindItem(&info2,-1); CString strItem1 = pListCtrl->GetItemText(irow1, pItem->iColumn); CString strItem2 = pListCtrl->GetItemText(irow2, pItem->iColumn); // 특정 필드에 숫자가 있다면 이런방식도 나쁘지 않다. 조건은 편하게 걸면 된다. if(pItem->iColumn == 1) { int nRetVal = 0; int size1 = _ttoi(strItem1); int size2 = _ttoi(strItem2); if(size1 == size2) nRetVal = 0; if(size1 < size2) nRetVal = -1; if(size1 > size2) nRetVal = 1; return bascending? nRetVal : -nRetVal; } return bascending? _tcscmp(strItem1, strItem2) : -_tcscmp(strItem1, strItem2); }
댓글 남기기