본문 바로가기
코드/c/c++

리스트 컨트롤 유용한 정보

by WeZZ 2009. 10. 29.


리스트 컨트롤 유용한 정보^^ CONTROL UI

2006/06/14 14:15

복사 http://blog.naver.com/isolationism/30005347970

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;
 
}