MFC 리스트컨트롤

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)
{
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 += “rn”;
totalTxt += str;
TRACE1(“Item %d was selected!n”, nItem);
}
}
}

BOOL __ClipCopy(char *txt)
{
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;

}

 
 
출처 : http://blog.naver.com/isolationism/30005347970