CListCtrl 유용한 것들 (펌)
2016. 1. 19. 17:05ㆍIT-개발/winapi 및 MFC
반응형
펌.원작 : http://sanaigon.tistory.com/149
1. 특정 ROW 포커스 주기 2. 특정 ROW로 가기 3. 헤더 컬럼수 얻어오기 4. 컬럼의 너비를 이쁘게 주기 5. 한줄 쭉 선택되게 하기, 그리드 라인 주기 6. 선택한 아이템(ROW)를 지우기 7. 두 아이템을 스왑 하기 8.기존에 선택되어있는 것을 해체하기 9. 리스트컨트롤내 모든 항목을 선택하기 10. 리스트컨트롤내 모든 항목을 선택해제 하기 11. 리스트컨트롤에 선택된 항목을 클립보드에 저장하기. 1. 특정 ROW 포커스 주기 --------------------------------------------------- 리스트 컨트롤에서 어떤 특정 Row를 선택하게 하고 싶을때 ( 이때 선택뿐아니라 포커스도 가야 한다. 포커스가 간다는 의미는 다음에 키다운을 하면 바로 부드럽게 다음 아이템을 가리키도록 하는 것이다 ) ListView_SetItemState (pListCtrl->GetSafeHwnd(), // handle to listview 10, // index to listview item LVIS_FOCUSED | LVIS_SELECTED, // item state 0x000F); //mask 위와 같이 코딩하면 된다. 2. 특정 ROW로 가기 --------------------------------------------------- 만일 원하는 Row를 스크롤을 하던 어떻게 하든 화면에 보이게 하고 싶을때 pListCtrl->EnsureVisible(15, TRUE); 이렇게 하면 된다. 3. 헤더 컬럼수 얻어오기 --------------------------------------------------- 헤더 컬럼의 갯수를 알고 싶을때 CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0); int nColumnCount = pHeader->GetItemCount(); 또는 pList->GetHeaderCtrl()을 통해서 얻어올수 도 있다. 4. 컬럼의 너비를 이쁘게 주기 --------------------------------------------------- 공백없이 잘 채워 준다. 부모 다이얼로그의 OnSize에서 void CAttrListDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); // TODO: Add your message handler code here if( IsWindow( z_AttrList.m_hWnd )) { z_AttrList.MoveWindow( 0, 0, cx, cy ); z_AttrList.SetColumnWidth(1 , LVSCW_AUTOSIZE_USEHEADER); } } 5. 한줄 쭉 선택되게 하기, 그리드 라인 주기 --------------------------------------------------- z_AttrList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT); 6. 선택한 아이템(ROW)를 지우기 --------------------------------------------------- CDWordArray m_anDragIndexes; // 선택한 아이템을 기억하는 배열 int CAttrList::fnRemoveItem() { m_anDragIndexes.RemoveAll(); POSITION pos = GetFirstSelectedItemPosition(); while (pos) { m_anDragIndexes.Add(GetNextSelectedItem(pos)); } int nSize = m_anDragIndexes.GetSize(); int nRet = -1; if( nSize ) nRet = m_anDragIndexes[0]; while( nSize-- ) DeleteItem( m_anDragIndexes[nSize] ); m_anDragIndexes.RemoveAll(); return nRet; } 7. 두 아이템을 스왑 하기 --------------------------------------------------- void CAttrList::fnSwapItem( int nItem1, int nItem2 ) { int hi = nItem2; int lo = nItem1; CStringArray rowText; LV_ITEM lvitemlo, lvitemhi; CHeaderCtrl* pHeaderCtrl = GetHeaderCtrl(); int nColCount =pHeaderCtrl->GetItemCount(); rowText.SetSize( nColCount ); int i; for( i=0; i<nColCount; i++) rowText[i] = GetItemText(lo, i); lvitemlo.mask = LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvitemlo.iItem = lo; lvitemlo.iSubItem = 0; lvitemlo.stateMask = LVIS_CUT | LVIS_DROPHILITED | LVIS_FOCUSED | LVIS_SELECTED | LVIS_OVERLAYMASK | LVIS_STATEIMAGEMASK; lvitemhi = lvitemlo; lvitemhi.iItem = hi; GetItem( &lvitemlo ); GetItem( &lvitemhi ); for( i=0; i<nColCount; i++) SetItemText(lo, i, GetItemText(hi, i)); lvitemhi.iItem = lo; SetItem( &lvitemhi ); for( i=0; i<nColCount; i++) SetItemText(hi, i, rowText[i]); lvitemlo.iItem = hi; SetItem( &lvitemlo ); } 8.기존에 선택되어있는 것을 해체하기 ----------------------------------- int nOldItem = GetSelectionMark(); if( nOldItem > 0 ) SetItemState( nOldItem , 0, LVIS_SELECTED); 9. 리스트컨트롤내 모든 항목을 선택하기 ----------------------------------- void OnSelectAll() { // Make sure the focus is set to the list view control. m_list.SetFocus(); int n = 0; int nLast = m_list.GetItemCount(); for (;n < nLast;n++) { m_list.SetItemState(n, LVIS_SELECTED, LVIS_SELECTED); //ASSERT(m_list.GetItemState(n, LVIS_SELECTED) == LVIS_SELECTED); } } 10. 리스트컨트롤내 모든 항목을 선택해제 하기 ----------------------------------- void OnUnSelectAll() { m_list.SetFocus(); // Select all of the items that are completely visible. int n = 0; int nLast = m_list.GetItemCount(); for (;n < nLast;n++) { //현재 선택되어 있는 항목만, 선택해제 if(m_list.GetItemState(n, LVIS_SELECTED) == LVIS_SELECTED){ m_list.SetItemState(n, 0, LVIS_SELECTED); m_list.SetItemState(n, 0, LVIS_FOCUSED); //포커스 해제 } } } 11. 리스트컨트롤에 선택된 항목을 클립보드에 저장하기. ----------------------------------- CListCtrl m_list; void OnSelectCopy() { CString str; __CopyTextFromGrid(str); __ClipCopy((LPSTR)(LPCSTR)str); } void __CopyTextFromGrid(CString& totalTxt) BOOL __ClipCopy(char *txt){ int m_Cols = 2; totalTxt.Empty(); POSITION pos = m_list.GetFirstSelectedItemPosition(); if (pos == NULL) TRACE0("No items were selected!\n"); else { while (pos) { int nItem = m_list.GetNextSelectedItem(pos); CString str; str.Empty(); int i =0; for(i=0; i<m_Cols; i++) { if(i==0) str=m_list.GetItemText((int)nItem, i); else str += m_list.GetItemText((int)nItem, i); str += " \t"; } str += "\r\n"; totalTxt += str; TRACE1("Item %d was selected!\n", nItem); } } } { HGLOBAL hglbCopy; char* lptstrCopy; if (!::OpenClipboard(AfxGetMainWnd()->GetSafeHwnd())) return FALSE; EmptyClipboard(); hglbCopy = GlobalAlloc(GMEM_MOVEABLE, strlen(txt)+1); if (hglbCopy == NULL) { CloseClipboard(); return FALSE; } lptstrCopy =(char*)GlobalLock(hglbCopy); memcpy(lptstrCopy, txt, strlen(txt)+1); //lptstrCopy[strlen(txt)] = 0; GlobalUnlock(hglbCopy); SetClipboardData(CF_TEXT, hglbCopy); CloseClipboard(); return TRUE; } |
'IT-개발 > winapi 및 MFC' 카테고리의 다른 글
SeDebugPrivilege 권한 갖기~ (0) | 2016.03.06 |
---|---|
(펌) 현재 프로세스의 권한과 상관없이 자식 프로세스를 관리자 또는 일반 사용자 권한으로 실행하기 (0) | 2016.03.06 |
RAW socket 생성 Error - 원인은 관리자 권한 문제 (0) | 2015.11.24 |
CComboBox dynamic 생성 / AddString (0) | 2015.11.18 |
CStatic ...이리저리사용하기 (1) (0) | 2015.10.02 |