CListCtrl의 헤더 컨트롤 드래그 & 드랍 및 정렬

//헤더 컨트롤 드래그-앤-드롭 가능
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);
elsenResult = 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;
elsehdItem.fmt |= HDF_SORTUP;
pHeaderCtrl->SetItem(0, &hdItem);
}

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다