ListCtrl KnowHow
오후 3:41 2000-04-06 조경민
==========================================

1. 특정 ROW 포커스 주기
2. 특정 ROW로 가기
3. 헤더 컬럼수 얻어오기
4. 컬럼의 너비를 이쁘게 주기
5. 한줄 쭉 선택되게 하기, 그리드 라인 주기
6. 선택한 아이템(ROW)를 지우기
7. 두 아이템을 스왑 하기
8.기존에 선택되어있는 것을 해체하기



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

'KB > MFC/Win32' 카테고리의 다른 글

윈도우 타이틀 깜빡거리게 하기  (0) 2004.03.19
msword 오토메이션 예  (0) 2004.03.19
다이얼로그 비활성화 되었을때 그냥 숨기기  (0) 2004.03.19
UDP 소켓 다루기  (3) 2004.03.19
#pragma  (0) 2004.03.19

+ Recent posts