이전에 리스트 컨트롤을 이용한 간단한 샘플을 다루어 보았다.
이제 차근 차근 제공되는 메서드를 하나씩 알아가 보자.
전체를 다루기에는 MSDN이 울지 모르니 -_-;;;;; 주요 메서드만 다루어본다.
----------------------------------------------------------------------
CSize ApproximateViewRect(CSize sz= CSize(-1,-1), int iCount= -1) const;
리스트 컨트롤이 양식과 들어있는 아이템을 계산하여 전체 아이템을 표현하기 위하여
얼마만한 공간(픽셀단위)가 필요한지 계산해 주는 메서드.
자주 쓰이진 않지만 스크롤바가 생기지 않도록 폼을 자동생성할 경우등에.. 필요할 수 있다.
sz = 예상한 크기를 넣어주는 것인데, 사실상 동작하지 않는다.
iCount = 아이템을 주어진 갯수일때 공간을 계산한다. -1 디폴트 이면 전체..
----------------------------------------------------------------------COLORREF GetBkColor() const;
BOOL SetBkColor(COLORREF cr);
리스트 컨트롤의 배경색상을 설정하고 가져올 수 있다. 단, 글자가 써지는 영역은 이 배경에
영향을 주지 않으므로 이 설정만 사용하면 모양이 다음과 같이 나온다.
----------------------------------------------------------------------COLORREF GetTextBkColor() const;
BOOL SetTextBkColor(COLORREF cr);
글자의 배경색상을 설정하거나 가져올 수 있다. 단 글자가 써질 영역에만 영향을 미친다.
위의 SetBkColor 과 같이 쓰면 다음 처럼 배경을 깔끔하게 처리할 수있다.
----------------------------------------------------------------------COLORREF GetTextColor() const;
BOOL SetTextColor(COLORREF cr);
글씨의 색상을 설정하거나 가져올 수 있다.
이렇게 리스트 컨트롤은 배경과 글씨, 글씨 배경색상을 설정할 수 있도록 메서드를 미리
제공해 주기 때문에 이전의 컨트롤처럼 색상을 바꾸기 위하여 이것 저것 부가 처리가 필요없다.
----------------------------------------------------------------------CImageList* GetImageList(int nImageList) const;
CImageList* SetImageList(CImageList* pImageList, int nImageListType);
리스트 컨트롤에 이미지 리스트를 연결하거나 가져올 수 있다. 이 함수에 대한 설명은 이전 장에서
진행했으므로 가볍게 생략한다.
----------------------------------------------------------------------
int GetItemCount() const;
현재 리스트 컨트롤에 들어있는 아이템의 갯수를 리턴한다.
----------------------------------------------------------------------
BOOL GetCheck(int nItem) const;
BOOL SetCheck(int nItem, BOOL fCheck = TRUE);
컨트롤에 확장 스타일로 첵크 박스를 달았을 경우, 첵크를 하거나 끄거나 상태값을 읽어옴.
예를 들면
m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);
이렇게 첵크 박스를 달아 놓고..
m_list.SetCheck(1, TRUE);
이런식으로 첵크를 할 수 있음.
----------------------------------------------------------------------DWORD GetExtendedStyle();
DWORD SetExtendedStyle(DWORD dwNewStyle);
리스트 컨트롤에 제공되는 확장 스타일의 정보를 가져오거나 설정할 수 있다.
첵크박스를 달려면 LVS_EX_CHECKBOXES
전체 로우 선택을 할려면 LVS_EX_FULLROWSELECT 등의 옵션을 이용하여
제공되는 범위 내에서 설정을 적용할 수 있다.
만약 이미 적용되어 있는 설정을 제거하려면 다음과 같다.
DWORD dw = m_list.GetExtendedStyle();
dw &= ~LVS_EX_FULLROWSELECT;
m_list.SetExtendedStyle(dw);
----------------------------------------------------------------------
BOOL SetItemPosition(int nItem, POINT pt);
BOOL GetItemPosition(int nItem, LPPOINT lpPoint) const;
아이템의 포지션을 가져오거나, 설정할 수 있다..
아이콘 스타일이나, 스몰 아이콘 스타일일 경우는 사용자가 아이템을 드래그하여
임의의 위치로 옮기거나 하는 것이 가능하다.
즉, 드래그한 아이템의 인덱스와 드래그되는 좌표값을 읽어와서 배치가 가능하다는 이야기.
리스트나 레포트 타입일 경우는 한줄에 한 아이템씩 정해진 위치와 크기가 있기 때문에..
아이템의 좌표를 옮겨 버리면 가려저 보이지 않는다.
----------------------------------------------------------------------
int GetColumnWidth(int nCol) const;
BOOL SetColumnWidth(int nCol, int cx);
이미 만들어져 있는 컬럼의 너비를 설정하거나, 값을 읽어온다.
----------------------------------------------------------------------
BOOL GetItemRect(int nItem, LPRECT lpRect, UINT nCode) const;
현재 주어진 아이템의 인덱스 nItem을 이용하여 영역 정보를 가져온다. 이 영역 정보는 nCode에
따라 값이 달라진다.
LVIR_BOUND 아이템 전체 영역 = 아이콘 + 레이블
LVIR_ICON 아이콘의 영역
LVIR_LABEL 레이블의 영역
----------------------------------------------------------------------
BOOL GetViewRect(LPRECT lpRect) const;
현재 컨트롤이 있는 위치를 기준으로 (0, 0) 아이템이 보여지는 뷰 영역의 상대 좌표값을
읽어온다. 좌표값은 아이템이 보여지기 위한 전체 좌표값이다.
아이콘 및 스몰아이콘 뷰 스타일일 경우만 적용된다.
----------------------------------------------------------------------
int GetTopIndex() const;
int GetCountPerPage() const;
GetTopIndex는 현재 화면에 보여지는 최상위 아이템의 인덱스를 리턴한다.
GetCounterPerPage 는 현재 보여지는 화면(Page)의 아이템 갯수를 리턴한다.
----------------------------------------------------------------------
CSize SetIconSpacing(CSize size);
CSize SetIconSpacing(int cx, int cy);
아이콘과 아이콘의 정렬 간격을 강제로 설정한다. 잘 쓰이지 않는데.. 아이콘이나
스몰 아이콘 뷰 스타일일 경우는 레이블의 길이에 따라 지멋대로 정렬되는 경향이
있기 때문에 이를 강제적으로 셑팅해줄 때 주로 사용된다.
----------------------------------------------------------------------
BOOL GetBkImage(LVBKIMAGE* plvbkImage) const;
BOOL SetBkImage(HBITMAP hbm, BOOL fTile = TRUE, int xOffsetPercent = 0, int yOffsetPercent = 0);
BOOL SetBkImage(LPTSTR pszUrl, BOOL fTile = TRUE, int xOffsetPercent = 0, int yOffsetPercent = 0);
BOOL SetBkImage(LVBKIMAGE* plvbkImage);
배경에 이미지를 깔 수 있다. 말이 좋아 이미지 깔기지.. 그냥 이거 하나로는 야리꾸리한
배경이 나온다. 코드 그루나 프로젝트를 찾아봐도 리스트 뒤에 이미지 깔기는 좀 다른
방법을 이용하여 처리하는 것을 보아도 알 수 있다.
일단 내부적으로 OLE를 이용하므로 AfxOleInit() 를 꼭 호출해 주어야한다.
일단 비트맵은 리소스는 않된다. 이유는 알수 없지만 DIB와 DDB의 차이정도 일까?
m_list.SetBkImage(TEXT("C:\\a.bmp"),TRUE);
처럼 이미지를 직접 파일로 넣어주니 잘된다. 리소스를 넣어줄 때는 리턴값이 0이 나와
에러임을 알수 있는데 GetLastError()로 잡아도 0이 나온다.. -_-;;;;
배경을 깔면 머하나? 글자의 배경색이 지정되기 때문에 이를 제거하지 않으면, 이렇게
얄딱 꾸리한 배경이 된다..
Owner Draw Fixed 스타일을 이용하여 직접 다 그려주지 않으면 현재로써는 방법이 없다. -_-;
(누가 쉬운방법좀 있으면 알려주세요 -_-;;;)
----------------------------------------------------------------------
BOOL GetItem(LVITEM* pItem) const;
BOOL SetItem(const LVITEM* pItem);
BOOL SetItem(int nItem, int nSubItem, UINT nMask, LPCTSTR lpszItem, int nImage, UINT nState, UINT nStateMask, LPARAM lParam);
아이템의 현재 설정되어 있는 값을 가져오거나, 주어진 설정대로 아이템에 적용할 수 있다.
LVITEM 구조체는 이전장에서 설명한 것을 토대로 하고, SetItem의 두번째에 나오는 파라미터는
구조체를 나열해 놓은것에 불과하다.
아래 함수들도 나름대로 기능이 있지만 위의 함수를 사용하기 편하도록 따로 뽑아놓은것에
지나지 않는다.
BOOL SetItemState(int nItem, LVITEM* pItem);
BOOL SetItemState(int nItem, UINT nState, UINT nMask);
UINT GetItemState(int nItem, UINT nMask) const;
CString GetItemText(int nItem, int nSubItem) const;
int GetItemText(int nItem, int nSubItem, LPTSTR lpszText, int nLen) const;
BOOL SetItemText(int nItem, int nSubItem, LPCTSTR lpszText);
BOOL SetItemData(int nItem, DWORD dwData);
DWORD GetItemData(int nItem) const;
----------------------------------------------------------------------
UINT GetSelectedCount() const;
POSITION GetFirstSelectedItemPosition() const;
int GetNextSelectedItem(POSITION& pos) const;
현재 아이템이 선택되어져 있다면, 그 갯수를 가져오거나, 어떤 것들이 선택되어져 있는
그 아이템의 인덱스를 읽어 올 수 있도록 제공해주는 메서드이다. 예를 들면 다음과 같다.
POSITION pos = list.GetFirstSelectedItemPosition();
while(pos)
int iItem = list.GetNextSelectedItem(pos);
이렇게 하여 선택되어진 모든 아이템의 인덱스를 얻어올 수 있다.
----------------------------------------------------------------------------------
이밖에도 여러가지 속성에 관한 메서드가 제공되지만, 그렇게 많이 사용되진 않습니다.
나중에 강좌를 진행하면서 나머지 사용되는 예가 나오면 그 때 그 때 설명을 하겠습니다.
다음은 동작(Operation) 메서드에 대하여 알아보겠습니다.
이제 차근 차근 제공되는 메서드를 하나씩 알아가 보자.
전체를 다루기에는 MSDN이 울지 모르니 -_-;;;;; 주요 메서드만 다루어본다.
----------------------------------------------------------------------
CSize ApproximateViewRect(CSize sz= CSize(-1,-1), int iCount= -1) const;
리스트 컨트롤이 양식과 들어있는 아이템을 계산하여 전체 아이템을 표현하기 위하여
얼마만한 공간(픽셀단위)가 필요한지 계산해 주는 메서드.
자주 쓰이진 않지만 스크롤바가 생기지 않도록 폼을 자동생성할 경우등에.. 필요할 수 있다.
sz = 예상한 크기를 넣어주는 것인데, 사실상 동작하지 않는다.
iCount = 아이템을 주어진 갯수일때 공간을 계산한다. -1 디폴트 이면 전체..
----------------------------------------------------------------------COLORREF GetBkColor() const;
BOOL SetBkColor(COLORREF cr);
리스트 컨트롤의 배경색상을 설정하고 가져올 수 있다. 단, 글자가 써지는 영역은 이 배경에
영향을 주지 않으므로 이 설정만 사용하면 모양이 다음과 같이 나온다.
----------------------------------------------------------------------COLORREF GetTextBkColor() const;
BOOL SetTextBkColor(COLORREF cr);
글자의 배경색상을 설정하거나 가져올 수 있다. 단 글자가 써질 영역에만 영향을 미친다.
위의 SetBkColor 과 같이 쓰면 다음 처럼 배경을 깔끔하게 처리할 수있다.
----------------------------------------------------------------------COLORREF GetTextColor() const;
BOOL SetTextColor(COLORREF cr);
글씨의 색상을 설정하거나 가져올 수 있다.
이렇게 리스트 컨트롤은 배경과 글씨, 글씨 배경색상을 설정할 수 있도록 메서드를 미리
제공해 주기 때문에 이전의 컨트롤처럼 색상을 바꾸기 위하여 이것 저것 부가 처리가 필요없다.
----------------------------------------------------------------------CImageList* GetImageList(int nImageList) const;
CImageList* SetImageList(CImageList* pImageList, int nImageListType);
리스트 컨트롤에 이미지 리스트를 연결하거나 가져올 수 있다. 이 함수에 대한 설명은 이전 장에서
진행했으므로 가볍게 생략한다.
----------------------------------------------------------------------
int GetItemCount() const;
현재 리스트 컨트롤에 들어있는 아이템의 갯수를 리턴한다.
----------------------------------------------------------------------
BOOL GetCheck(int nItem) const;
BOOL SetCheck(int nItem, BOOL fCheck = TRUE);
컨트롤에 확장 스타일로 첵크 박스를 달았을 경우, 첵크를 하거나 끄거나 상태값을 읽어옴.
예를 들면
m_list.SetExtendedStyle(LVS_EX_CHECKBOXES);
이렇게 첵크 박스를 달아 놓고..
m_list.SetCheck(1, TRUE);
이런식으로 첵크를 할 수 있음.
----------------------------------------------------------------------DWORD GetExtendedStyle();
DWORD SetExtendedStyle(DWORD dwNewStyle);
리스트 컨트롤에 제공되는 확장 스타일의 정보를 가져오거나 설정할 수 있다.
첵크박스를 달려면 LVS_EX_CHECKBOXES
전체 로우 선택을 할려면 LVS_EX_FULLROWSELECT 등의 옵션을 이용하여
제공되는 범위 내에서 설정을 적용할 수 있다.
만약 이미 적용되어 있는 설정을 제거하려면 다음과 같다.
DWORD dw = m_list.GetExtendedStyle();
dw &= ~LVS_EX_FULLROWSELECT;
m_list.SetExtendedStyle(dw);
----------------------------------------------------------------------
BOOL SetItemPosition(int nItem, POINT pt);
BOOL GetItemPosition(int nItem, LPPOINT lpPoint) const;
아이템의 포지션을 가져오거나, 설정할 수 있다..
아이콘 스타일이나, 스몰 아이콘 스타일일 경우는 사용자가 아이템을 드래그하여
임의의 위치로 옮기거나 하는 것이 가능하다.
즉, 드래그한 아이템의 인덱스와 드래그되는 좌표값을 읽어와서 배치가 가능하다는 이야기.
리스트나 레포트 타입일 경우는 한줄에 한 아이템씩 정해진 위치와 크기가 있기 때문에..
아이템의 좌표를 옮겨 버리면 가려저 보이지 않는다.
----------------------------------------------------------------------
int GetColumnWidth(int nCol) const;
BOOL SetColumnWidth(int nCol, int cx);
이미 만들어져 있는 컬럼의 너비를 설정하거나, 값을 읽어온다.
----------------------------------------------------------------------
BOOL GetItemRect(int nItem, LPRECT lpRect, UINT nCode) const;
현재 주어진 아이템의 인덱스 nItem을 이용하여 영역 정보를 가져온다. 이 영역 정보는 nCode에
따라 값이 달라진다.
LVIR_BOUND 아이템 전체 영역 = 아이콘 + 레이블
LVIR_ICON 아이콘의 영역
LVIR_LABEL 레이블의 영역
----------------------------------------------------------------------
BOOL GetViewRect(LPRECT lpRect) const;
현재 컨트롤이 있는 위치를 기준으로 (0, 0) 아이템이 보여지는 뷰 영역의 상대 좌표값을
읽어온다. 좌표값은 아이템이 보여지기 위한 전체 좌표값이다.
아이콘 및 스몰아이콘 뷰 스타일일 경우만 적용된다.
----------------------------------------------------------------------
int GetTopIndex() const;
int GetCountPerPage() const;
GetTopIndex는 현재 화면에 보여지는 최상위 아이템의 인덱스를 리턴한다.
GetCounterPerPage 는 현재 보여지는 화면(Page)의 아이템 갯수를 리턴한다.
----------------------------------------------------------------------
CSize SetIconSpacing(CSize size);
CSize SetIconSpacing(int cx, int cy);
아이콘과 아이콘의 정렬 간격을 강제로 설정한다. 잘 쓰이지 않는데.. 아이콘이나
스몰 아이콘 뷰 스타일일 경우는 레이블의 길이에 따라 지멋대로 정렬되는 경향이
있기 때문에 이를 강제적으로 셑팅해줄 때 주로 사용된다.
----------------------------------------------------------------------
BOOL GetBkImage(LVBKIMAGE* plvbkImage) const;
BOOL SetBkImage(HBITMAP hbm, BOOL fTile = TRUE, int xOffsetPercent = 0, int yOffsetPercent = 0);
BOOL SetBkImage(LPTSTR pszUrl, BOOL fTile = TRUE, int xOffsetPercent = 0, int yOffsetPercent = 0);
BOOL SetBkImage(LVBKIMAGE* plvbkImage);
배경에 이미지를 깔 수 있다. 말이 좋아 이미지 깔기지.. 그냥 이거 하나로는 야리꾸리한
배경이 나온다. 코드 그루나 프로젝트를 찾아봐도 리스트 뒤에 이미지 깔기는 좀 다른
방법을 이용하여 처리하는 것을 보아도 알 수 있다.
일단 내부적으로 OLE를 이용하므로 AfxOleInit() 를 꼭 호출해 주어야한다.
일단 비트맵은 리소스는 않된다. 이유는 알수 없지만 DIB와 DDB의 차이정도 일까?
m_list.SetBkImage(TEXT("C:\\a.bmp"),TRUE);
처럼 이미지를 직접 파일로 넣어주니 잘된다. 리소스를 넣어줄 때는 리턴값이 0이 나와
에러임을 알수 있는데 GetLastError()로 잡아도 0이 나온다.. -_-;;;;
배경을 깔면 머하나? 글자의 배경색이 지정되기 때문에 이를 제거하지 않으면, 이렇게
얄딱 꾸리한 배경이 된다..
Owner Draw Fixed 스타일을 이용하여 직접 다 그려주지 않으면 현재로써는 방법이 없다. -_-;
(누가 쉬운방법좀 있으면 알려주세요 -_-;;;)
허접한 글에 비수를 맞았습니다... 푸욱~~ 컥~
아~ 쪼메 더 많이 맞구 싶은데..
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=7703&page=1
역시 머라도 꺼내 놓으면 반응이 와서 너무 좋네요.. 예전 부터 컨트롤 쪽을 쭉 정리해보고
싶어서 시작한 글이지만.. 너무도 부족한게 많고 괜히 쫏기듯이 쓰게되서 아쉬웠는데..
역시 MSDN을 날림 발췌한듯한 글은 비난을 받아 마땅한거 같습니다.
혹시 참고 자료 날라갈까바.. 같이 첨부합니다.
아~ 쪼메 더 많이 맞구 싶은데..
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNO=20&no=7703&page=1
역시 머라도 꺼내 놓으면 반응이 와서 너무 좋네요.. 예전 부터 컨트롤 쪽을 쭉 정리해보고
싶어서 시작한 글이지만.. 너무도 부족한게 많고 괜히 쫏기듯이 쓰게되서 아쉬웠는데..
역시 MSDN을 날림 발췌한듯한 글은 비난을 받아 마땅한거 같습니다.
혹시 참고 자료 날라갈까바.. 같이 첨부합니다.
----------------------------------------------------------------------
BOOL GetItem(LVITEM* pItem) const;
BOOL SetItem(const LVITEM* pItem);
BOOL SetItem(int nItem, int nSubItem, UINT nMask, LPCTSTR lpszItem, int nImage, UINT nState, UINT nStateMask, LPARAM lParam);
아이템의 현재 설정되어 있는 값을 가져오거나, 주어진 설정대로 아이템에 적용할 수 있다.
LVITEM 구조체는 이전장에서 설명한 것을 토대로 하고, SetItem의 두번째에 나오는 파라미터는
구조체를 나열해 놓은것에 불과하다.
아래 함수들도 나름대로 기능이 있지만 위의 함수를 사용하기 편하도록 따로 뽑아놓은것에
지나지 않는다.
BOOL SetItemState(int nItem, LVITEM* pItem);
BOOL SetItemState(int nItem, UINT nState, UINT nMask);
UINT GetItemState(int nItem, UINT nMask) const;
CString GetItemText(int nItem, int nSubItem) const;
int GetItemText(int nItem, int nSubItem, LPTSTR lpszText, int nLen) const;
BOOL SetItemText(int nItem, int nSubItem, LPCTSTR lpszText);
BOOL SetItemData(int nItem, DWORD dwData);
DWORD GetItemData(int nItem) const;
----------------------------------------------------------------------
UINT GetSelectedCount() const;
POSITION GetFirstSelectedItemPosition() const;
int GetNextSelectedItem(POSITION& pos) const;
현재 아이템이 선택되어져 있다면, 그 갯수를 가져오거나, 어떤 것들이 선택되어져 있는
그 아이템의 인덱스를 읽어 올 수 있도록 제공해주는 메서드이다. 예를 들면 다음과 같다.
POSITION pos = list.GetFirstSelectedItemPosition();
while(pos)
int iItem = list.GetNextSelectedItem(pos);
이렇게 하여 선택되어진 모든 아이템의 인덱스를 얻어올 수 있다.
----------------------------------------------------------------------------------
이밖에도 여러가지 속성에 관한 메서드가 제공되지만, 그렇게 많이 사용되진 않습니다.
나중에 강좌를 진행하면서 나머지 사용되는 예가 나오면 그 때 그 때 설명을 하겠습니다.
다음은 동작(Operation) 메서드에 대하여 알아보겠습니다.