///////////////////////////////////////////////// // 1. 리스트컨트롤에 사용할 정보 구조체를 설정한다. ///////////////////////////////////////////////// typedef struct _ListCtrlInfo { int nSize; // 열개수 int* iLstCtrlCx; // 열크기 char** achLstCtrlHeaderName; // 열이름 int* dwLstCtrlAlign; // 열정렬 } ListCtrlInfo; ///////////////////////////////////////////////// // 2. 클래스 변수로 구조체 변수를 선언한다. ///////////////////////////////////////////////// ListCtrlInfo m_listinfo; ///////////////////////////////////////////////// // 3. 클래스 생성자에 리스트 컨트롤 정보를 입력한다. ///////////////////////////////////////////////// static char *achLstCtrlHeaderName[] = { "A", "Name", "Code", "Size", "Type", "Files", "Description", "Registed"}; static DWORD dwLstCtrlAlign[] = { LVCFMT_LEFT, LVCFMT_LEFT, LVCFMT_LEFT, LVCFMT_RIGHT, LVCFMT_LEFT, LVCFMT_RIGHT, LVCFMT_LEFT, LVCFMT_CENTER}; static int iLstCtrlCx[] = { 25, 209, 114, 68, 51, 44, 85, 120 }; m_listinfo.achLstCtrlHeaderName = achLstCtrlHeaderName; m_listinfo.dwLstCtrlAlign = dwLstCtrlAlign; m_listinfo.iLstCtrlCx = iLstCtrlCx; m_listinfo.nSize = 8; ///////////////////////////////////////////////// // 4. 클래스 초기화 함수에 정보를 초기화 한다. ///////////////////////////////////////////////// for( int i=0;i<m_listinfo.nSize;i++) { m_list.InsertColumn(i, m_listinfo.achLstCtrlHeaderName, m_listinfo.dwLstCtrlAlign, m_listinfo.iLstCtrlCx ); } m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES|LVS_EX_SUBITEMIMAGES); m_list.SetCallbackMask(LVIS_FOCUSED); ///////////////////////////////////////////////// // 5. 첨부된 이미지를 등록하고 IDB_SORTUP, IDB_SORTDOWN 으로 ID를 변경한다. ///////////////////////////////////////////////// ///////////////////////////////////////////////// // 6. 리스트 레코드에 아이콘을 사용한다면 아이콘을 등록한다. ///////////////////////////////////////////////// CImageList imglist; imglist.Create(16, 16, ILC_COLOR32, 0, 6 ); imglist.SetBkColor( RGB( 255, 255, 255 ) ); SHFILEINFO sfi; TCHAR szResult[MAX_PATH] = { 0, }; HINSTANCE hInstance; HFILE h; char *extname[5] = {"dummy.avi", "dummy.mp3", "dummy.html", "dummy.txt", "dummy.jpg"}; for ( int t=0; t<5; t++) { // temp file create h = _lcreat( extname[t], 0); _lclose(h); // get icon handle hInstance = FindExecutable( extname[t], NULL, szResult ); SHGetFileInfo( szResult , 0, &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SMALLICON); // add to imagelist imglist.Add( sfi.hIcon ); memset( szResult, 0, MAX_PATH ); // delete temp file DeleteFile( extname[t] ); } // get specific file icon handle SHGetFileInfo( _T("*.zip") , 0, &sfi, sizeof(SHFILEINFO), SHGFI_USEFILEATTRIBUTES | SHGFI_ICON | SHGFI_SMALLICON | SHGFI_ADDOVERLAYS); // add to imagelist imglist.Add( sfi.hIcon ); // set imagelist to list control m_List.SetImageList( &imglist, LVSIL_SMALL ); // free imagelist imglist.Detach(); ///////////////////////////////////////////////// // 7. 컬럼 클릭시 정렬 화살표를 나타내기 위해 이미지를 설정한다. ///////////////////////////////////////////////// CBitmap upArrow, downArrow; CImageList m_arrow; upArrow.LoadBitmap(IDB_SORTUP); downArrow.LoadBitmap(IDB_SORTDOWN); m_arrow.Create( 9, 5, ILC_COLOR32 | ILC_MASK, 2, 0 ); m_arrow.Add( &upArrow , RGB( 255, 0, 255 )); m_arrow.Add( &downArrow, RGB( 255, 0, 255 )); CHeaderCtrl* pHeader = m_List.GetHeaderCtrl(); pHeader->SetImageList( &m_arrow ); m_arrow.Detach(); ///////////////////////////////////////////////// // 8. 컬럼 클릭시 정렬을 위해 OnColumnclick을 오버라이딩한다. ///////////////////////////////////////////////// // set sort infomation static int nSortedCol = -1; static bool bSortAscending = true; static bool bAllCheck = true; LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); if (pNMLV->iSubItem == nSortedCol) { bSortAscending = !bSortAscending; } else { bSortAscending = TRUE; } nSortedCol = pNMLV->iSubItem; CListCtrlSort csc(&m_list, nSortedCol); // 체크 박스가 있을 경우, 모두 체크 하거나 모두 해제 if (pNMLV->iSubItem == 0) { for ( int i=0; i<m_list.GetItemCount(); i++ ) { m_list.SetCheck( i, bAllCheck ); } bAllCheck = ! bAllCheck; } else switch (pNMLV->iSubItem) { // 일반 컬럼일 경우, 컬럼의 타입에 따라 소팅클래스 호출 // dtNULL : // dtINT : // 일반 수비교(정수) // dtSTRING : // 일반 문자열 // dtDATETIME, // OLE DATETIME 형 // dtDEC, // Float 형 수비교 // dtCOMMAINT, // dtDWORD // SetItemData 의 DWORD 비교 case 1: case 2: case 4: case 6: case 7: SetIndicatorOnColumn( pNMLV->iSubItem , bSortAscending ); csc.Sort(bSortAscending, CListCtrlSort::dtSTRING); break; case 3: SetIndicatorOnColumn( pNMLV->iSubItem, bSortAscending ); csc.Sort( bSortAscending, CListCtrlSort::dtDWORD ); break; } ///////////////////////////////////////////////// // 9. 해당 cpp 파일에 소팅 클래스를 인클루드 한다. ///////////////////////////////////////////////// #include "ListCtrlSort.h" ///////////////////////////////////////////////// // 10. 정렬시 이미지를 나타내기 위한 함수를 만든다. // void SetIndicatorOnColumn(int Col, bool asc) ///////////////////////////////////////////////// CHeaderCtrl* pHeader = m_list.GetHeaderCtrl(); HDITEM hItem; for(int i=0; i<pHeader->GetItemCount(); i++) { // get column size RECT rect; pHeader->GetItemRect( i, &rect ); // init and get hditem structure memset( &hItem, 0, sizeof( HDITEM )); pHeader->GetItem(i, &hItem); if (i == Col) { hItem.mask = HDI_TEXT | HDI_FORMAT | HDI_WIDTH | HDI_IMAGE | HDI_FORMAT; hItem.fmt = HDF_STRING | HDF_BITMAP | HDF_BITMAP_ON_RIGHT | HDF_IMAGE; hItem.pszText = m_listinfo.achLstCtrlHeaderName[i]; hItem.cchTextMax = strlen( m_listinfo.achLstCtrlHeaderName[i] ) + 1; hItem.cxy = rect.right-rect.left; if ( asc ) hItem.iImage = 0; else hItem.iImage = 1; pHeader->SetItem(i, &hItem); } else { hItem.mask = HDI_TEXT | HDI_FORMAT | HDI_WIDTH; hItem.fmt = m_listinfo.dwLstCtrlAlign[i] | HDF_STRING; hItem.pszText = m_listinfo.achLstCtrlHeaderName[i]; hItem.cchTextMax = strlen( m_listinfo.achLstCtrlHeaderName[i] ) + 1; hItem.cxy = rect.right-rect.left; pHeader->SetItem(i, &hItem); } } ///////////////////////////////////////////////// // 11. 레코드를 삽입한다. ///////////////////////////////////////////////// // 아이콘이 들어갈 경우 LVITEM item; item.mask = LVIF_TEXT | LVIF_IMAGE; item.iItem = i; item.iSubItem = 1; item.pszText = _T(""); item.iImage = ; // 이미지리스트 인덱스 m_list.SetItem( &item ); // 아이콘이 안 들어갈 경우 m_list.SetItemText ( i, 3, _T("") );

사용자 삽입 이미지
사용자 삽입 이미지
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기