CListCtrl의 헤더 컨트롤 드래그 & 드랍 및 정렬 DarkKaiser, 2010년 5월 18일2023년 9월 6일 //헤더 컨트롤 드래그-앤-드롭 가능 DWORD dwExStyle = m_List.GetExtendedStyle(); m_List.SetExtendedStyle(dwExStyle | LVS_EX_HEADERDRAGDROP ); // 헤더 컨트롤을 통한 정렬을 가능하도록 한다. m_bAscending = FALSE; m_List.SortItems(&CHeadCtrlDemoDlg::CompareItem, (DWORD_PTR)this); UpdateArrow(); // 헤더 컨트롤의 HDN_ITEMCLICK 메시지 핸들러 void CHeadCtrlDemoDlg::OnHdnItemclickList1(NMHDR *pNMHDR, LRESULT *pResult) { LPNMHEADER phdr = reinterpret_cast<LPNMHEADER>(pNMHDR); if(phdr->iItem == 0) { m_bAscending = !m_bAscending; UpdateArrow(); m_List.SortItems(&CHeadCtrlDemoDlg::CompareItem, (DWORD_PTR)this); } *pResult = 0; } // 헤더 컨트롤 정렬 비교 콜백 함수 int CALLBACK CHeadCtrlDemoDlg::CompareItem(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { CHeadCtrlDemoDlg* pDlg = (CHeadCtrlDemoDlg*)lParamSort; LVFINDINFO lvFind1, lvFind2; lvFind1.flags= LVFI_PARAM; lvFind1.lParam= lParam1; lvFind2.flags= LVFI_PARAM; lvFind2.lParam= lParam2; int nIndex1 = pDlg->m_List.FindItem(&lvFind1); int nIndex2 = pDlg->m_List.FindItem(&lvFind2); CString strText1 = pDlg->m_List.GetItemText(nIndex1, 0); CString strText2 = pDlg->m_List.GetItemText(nIndex2, 0); int nResult = 0; if(pDlg->m_bAscending)nResult = strText2.Compare(strText1); else nResult = strText1.Compare(strText2); return nResult; } // 헤더 컨트롤의 Up/Down 화살표 변경 함수 void CHeadCtrlDemoDlg::UpdateArrow(void) { CHeaderCtrl* pHeaderCtrl = m_List.GetHeaderCtrl(); HDITEM hdItem; TCHAR szBuffer[256]; ::ZeroMemory(&hdItem, sizeof(hdItem)); ::ZeroMemory(szBuffer, 256); hdItem.mask = -1; hdItem.pszText = szBuffer; hdItem.cchTextMax = 256; pHeaderCtrl->GetItem(0, &hdItem); hdItem.fmt &= ~(HDF_SORTDOWN | HDF_SORTUP); if(m_bAscending)hdItem.fmt |= HDF_SORTDOWN; else hdItem.fmt |= HDF_SORTUP; pHeaderCtrl->SetItem(0, &hdItem); } C/C++/VC++