CListCtrl 유용한 것들 (펌)

2016. 1. 19. 17:05IT-개발/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)
{
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);
}
}
}
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;