MFC :: Chapter 8 (컨트롤 및 리소스 I) - 101번째 이야기
리스트 컨트롤(List Control)
우리가 List Control을 가장 흔히 볼 수 있는 것은 윈도우 탐색기이다. 윈도우 탐색기의 오른쪽의 폴더의 내용을 보여주는 곳이 List Control이다. 정확히 얘기하자면 리스트 뷰라고 할 수 있지만 내부적인 제어는 같다. 탐색기를 살펴보면 [보기] 메뉴를 선택할 때, 큰 아이콘, 아이콘, 간단히, 자세히 이렇게 네 가지를 선택할 수 있다. 이것은 List Control의 스타일 속성 설정에 의한 것이다.
MFC에서 List Contol 클래스는 CListCtrl이다. CListCtrl 클래스는 CWnd 클래스를 상속받아 생성되었다. 이 말은 List Control은 윈도우의 일종이라는 사실이다. 그리고 윈도우의 속성을 가지고 있기 때문에 특정 윈도우의 자식 윈도우로 생성될 수 있다. 따라서 대화상자에서 List Control을 추가하여 사용하는 것은 내부적으로 대화상자의 자식 윈도우로서 List Control이 생성된다는 얘기이다. 이 이야기는 List Control에 국한되는 것이 아니라 모든 컨트롤 클래스가 이에 적용되는 것이다. 컨트롤들은 일반적인 윈도우의 속성에 추가적으로 각 컨트롤마다의 특성을 지니고있다. 각 컨트롤의 특성을 제어하는 것은 각자의 멤버 함수를 통해서 가능하다.
List Control 클래스의 일반적인 제어는 칼럼의 추가와 삭제, 아이템의 추가와 삭제, 아이템 설정, 아이템의 정렬, 스타일의 변경 등이 있다.
LV_COLUMN 구조체
LV_COLUMN은 칼럼을 설정하거나 생성하기 위해 사용되는 구조체이다. 이 구조체의 원형은 다음과 같다.
typedef struct _LVCOLUMN {
UINT mask;
int fmt;
int cx;
LPTSTR pszText;
int cchTextMax;
int iSubItem;
} LVCOLUMN, FAR *LPLVCOLUMN;
( mask : 구조체의 다른 멤버들의 기능 유효와 플래그
fmt : 칼럼에 서브 아이템 텍스트와 칼럼 표제의 정렬
cx : 픽셀이나 칼럼의 폭
pszText : 칼럼 제목의 문자열
cchTextMax : 칼럼 제목 문자열의 버퍼 크기
iSubItem : 칼럼과 관련된 서브 아이템의 인덱스 )
CListCtrl::InsertColumn() 함수
InsertColumn() 함수는 List Control에 새로운 열을 삽입하는 함수로 원형은 다음과 같다.
int InsertColumn(int nCol, const LVCOLUMN* pColmn);
( nCol : 새로운 열의 인덱스
pColumn : 새로운 열의 속성을 내포하는 LVCOLUMN의 주소 )
CListCtrl::SetExtendedStyle() 함수
SetExtendedStyle() 함수는 List Control의 스타일을 확장시키는 함수로 원형은 다음과 같다.
DWORD SetExtendedStyle(DWORD dwNewStyle);
( dwNewStyle : List Control에 사용되는 확장 스타일의 조합)
* 자주 쓰이는 확장 스타일
CListCtrl::GetItemCount() 함수
GetItemCount() 함수는 List Control의 아이템 수를 얻기 위해 호출하는 함수로 원형은 다음과 같다.
int GetItemCount();
LV_ITEM 구조체
LV_ITEM은 List Control 아이템의 속성을 얻거나 명시하는 구조체이다. 이 구조체의 원형은 다음과 같다.
typedef struct _LVITEM {
UINT mask;
int iItem;
int iSubItem;
UINT state;
UINT stateMask;
LPTSTR pszText;
int cchTextMax;
int iImage;
LPARAM lParam;
} LVITEM, FAR *LPLVITEM
( mask : 유효한 항목에 대한 마스크
iItem : 삽입 위치
iSubItem : 서브 칼럼 인덱스
state : 리스트 항목의 상태
stateMask : 유효한 상태 비트에 대한 마스크
pszText : 항목 텍스트
cchTexMax : 텍스트의 최대 길이
iImage : 이미지 인덱스
lParam : 항목과 관련된 32비트 변수 )
CListCtrl::InsertItem() 함수
InsertItem() 함수는 List Control에 아이템을 추가하기 위해 호출하는 함수로 원형은 다음과 같다.
int InsertItem(const LVITEM* pItem);
( pItem : 아이템의 속성을 명시한 LVITEM 구조체의 포인터 )
CListCtrl::SetItem() 함수
SetItem() 함수는 명시된 List Control의 아이템의 속성을 설정하기 위해 호출하는 함수로 원형은 다음과 같다.
BOOL SetItem(LVITEM* pItem);
( pItem : 새로운 아이템 속성을 내포하는 LVITEM 구조체의 포인터 )
CListCtrl::GetItemText() 함수
GetItemText() 함수는 List Control 아이템이나 서브 아이템의 텍스트를 회수하는 함수로 원형은 다음과 같다.
CString GetItemText(int nItem, int nSubItem) const;
( nItem : 회수될 텍스트 아이템의 인덱스
nSubItem : 회수될 텍스트 서브 아이템을 명시 )
CListCtrl::DeleteItem() 함수
DeleteItem() 함수는 List Control로부터 아이템을 삭제하기 위해 호출하는 함수로 원형은 다음과 같다.
BOOL DeleteItem(int nItem);
( nItem : 삭제될 아이템의 인덱스 )
CListCtrl::SetItemText() 함수
SetItemText() 함수는 List Control 아이템이나 서브 아이템의 텍스트를 변경하는 함수로 원형은 다음과 같다.
BOOL SetItemText(int nItem, int nSubItem, LPTSTR lpszText);
( nItem : 변경될 텍스트 아이템의 인덱스
nSubItem : 변경될 텍스트 서브 아이템을 명시
lpszText : 변경될 텍스트 )
GetWindowLong() 함수
GetWindowLong() 함수는 명시된 윈도우에 대한 정보를 얻는다. 이 함수는 또한 여분의 윈도우 메모리에 명시된 오프셋 32비트 값을 회수한다. 이 함수의 원형은 다음과 같다.
LONG GetWindowLong(HWND hWnd, int nIndex);
( hWnd : 윈도우의 핸들
nIndex : 회수되어지는 값의 오프셋, nIndex는 다음의 표 중에서 하나의 값을 가진다 )
SetWindowLong() 함수
SetWindowLong() 함수는 명시된 윈도우의 속성을 변경한다. 또한 이 함수는 여분의 윈도우 메모리에 명시된 오프셋 32비트 값을 설정한다. 이 함수의 원형은 다음과 같다.
LONG SetWindowLong(HWND hWnd, int nIndex, LONG dwNewLong);
( hWnd : 윈도우의 핸들
nIndex : 설정되어지는 값의 오프셋, nIndex는 위의 표 중에서 하나의 값을 가진다
dwNewLong : 변경되는 새로운 값 )
트리 컨트롤(Tree Control)
Tree Control은 계층구조를 가진 데이터나 항목을 표현하는 컨트롤로서, 표현하고자 하는 정보를 일정한 기준으로 분류하여 주어진 정보를 전달하고자 할 때 유용하게 사용된다. 한글로 "나무"라는 것은 뿌리, 줄기, 잎과 계층적인 관계를 가지면서도 유사성 있는 정보를 가지고 있으므로 이러한 정보들을 표현할 때 Tree Control이 적합하다.
또한 정보의 일관성 있는 분류이외에 데이터의 관계를 뚜렷이 표현할 수 있기 때문에 많이 사용되고 있다.
Tree Control의 각 항목들을 노드(Node)라 하며 이 노드는 레이블과 비트맵 이미지로 구성된다. 그리고 각 노드 앞에 + 기호가 있다면 하위 노드가 존재하고 또한 확장을 하여 하위 노드를 검색할 수 있다. 노드가 확장이 되면 + 기호는 - 기호를 변환된다. 윈도우 시스템에서 많이 접해 보았기 때문에 익숙한 내용일 것이다.
Tree Control에서 가장 제어하기 어려운 점은 표현하고자 하는 데이터가 항상 변한다는데 있다. 그래서 이런 가변적인 데이터를 표현하고자 한다면 세세한 프로그래밍과 제어가 필요하다는 것이다.
TV_INSERTSTRUCT 구조체
TV_INSERTSTRUCT은 Tree Control에 새로운 아이템을 추가하기 위해 사용되는 정보를 포함하는 구조체이다. 이 구조체의 원형은 다음과 같다.
typedef struct tagTVINSERTSTRUCT {
HTREEITEM hParent;
HTREEITEM hInsertAfter;
TVITEM item;
} TVINSERTSTRUCT, FAR *LPTVINSERTSTRUCT;
( hParent : 상위 항목의 핸들
hInsertAfter : 삽입 노드의 위치
item : 삽입될 노드의 정보 )
CTreeCtrl::InsertItem() 함수
InsertItem() 함수는 Tree Control에 아이템을 삽입하는 함수로 원형은 다음과 같다.
HTREEITEM InsertItem(LPTVINSERTSTRUCT lpInsertStruct);
( lpInsertStruct : 삽입될 Tree Control 아이템의 속성을 명시하는 TV_INSERTSTRUCT 구조체의 포인터 )
CTreeCtrl::GetItemText() 함수
GetItemText() 함수는 명시된 Tree Control 아이템의 텍스트를 반환하는 함수로 원형은 다음과 같다.
CString GetItemText(HTREEITEM hItem) const;
( hItem : 반환될 텍스트 아이템의 핸들 )
CTreeCtrl::Expand() 함수
Expand() 함수는 자식 노드의 리스트를 확장하기 위해 호출하는 함수이다. 원형은 다음과 같다.
BOOL Expand(HTREEITEM hItem, UINT nCode);
( hItem : 확장되는 트리 아이템의 핸들
nCode : 주어질 행위에 형태를 표시하는 플래그이고 이 플래그는 다음의 표 중에서 하나의 값을 가진다 )
CTreeCtrl::SetItemText() 함수
SetItemText() 함수는 Tree Control 아이템의 텍스트를 변경하는 함수로 원형은 다음과 같다.
BOOL SetItemText(HTREEITEM hItem, LPCSTR lpszItem);
( hItem : 변경될 텍스트 아이템의 인덱스
lpszItem : 변경될 텍스트 )
CTreeCtrl::DeleteItem() 함수
DeleteItem() 함수는 Tree Control로부터 아이템을 삭제하기 위해 호출하는 함수로 원형은 다음과 같다.
BOOL DeleteItem(HTREEITEM hItem);
( hItem : 삭제될 트리 아이템의 핸들 )
우리가 List Control을 가장 흔히 볼 수 있는 것은 윈도우 탐색기이다. 윈도우 탐색기의 오른쪽의 폴더의 내용을 보여주는 곳이 List Control이다. 정확히 얘기하자면 리스트 뷰라고 할 수 있지만 내부적인 제어는 같다. 탐색기를 살펴보면 [보기] 메뉴를 선택할 때, 큰 아이콘, 아이콘, 간단히, 자세히 이렇게 네 가지를 선택할 수 있다. 이것은 List Control의 스타일 속성 설정에 의한 것이다.
MFC에서 List Contol 클래스는 CListCtrl이다. CListCtrl 클래스는 CWnd 클래스를 상속받아 생성되었다. 이 말은 List Control은 윈도우의 일종이라는 사실이다. 그리고 윈도우의 속성을 가지고 있기 때문에 특정 윈도우의 자식 윈도우로 생성될 수 있다. 따라서 대화상자에서 List Control을 추가하여 사용하는 것은 내부적으로 대화상자의 자식 윈도우로서 List Control이 생성된다는 얘기이다. 이 이야기는 List Control에 국한되는 것이 아니라 모든 컨트롤 클래스가 이에 적용되는 것이다. 컨트롤들은 일반적인 윈도우의 속성에 추가적으로 각 컨트롤마다의 특성을 지니고있다. 각 컨트롤의 특성을 제어하는 것은 각자의 멤버 함수를 통해서 가능하다.
List Control 클래스의 일반적인 제어는 칼럼의 추가와 삭제, 아이템의 추가와 삭제, 아이템 설정, 아이템의 정렬, 스타일의 변경 등이 있다.
LV_COLUMN 구조체
LV_COLUMN은 칼럼을 설정하거나 생성하기 위해 사용되는 구조체이다. 이 구조체의 원형은 다음과 같다.
typedef struct _LVCOLUMN {
UINT mask;
int fmt;
int cx;
LPTSTR pszText;
int cchTextMax;
int iSubItem;
} LVCOLUMN, FAR *LPLVCOLUMN;
( mask : 구조체의 다른 멤버들의 기능 유효와 플래그
fmt : 칼럼에 서브 아이템 텍스트와 칼럼 표제의 정렬
cx : 픽셀이나 칼럼의 폭
pszText : 칼럼 제목의 문자열
cchTextMax : 칼럼 제목 문자열의 버퍼 크기
iSubItem : 칼럼과 관련된 서브 아이템의 인덱스 )
CListCtrl::InsertColumn() 함수
InsertColumn() 함수는 List Control에 새로운 열을 삽입하는 함수로 원형은 다음과 같다.
int InsertColumn(int nCol, const LVCOLUMN* pColmn);
( nCol : 새로운 열의 인덱스
pColumn : 새로운 열의 속성을 내포하는 LVCOLUMN의 주소 )
CListCtrl::SetExtendedStyle() 함수
SetExtendedStyle() 함수는 List Control의 스타일을 확장시키는 함수로 원형은 다음과 같다.
DWORD SetExtendedStyle(DWORD dwNewStyle);
( dwNewStyle : List Control에 사용되는 확장 스타일의 조합)
* 자주 쓰이는 확장 스타일
|
확장 스타일 |
내 용 |
| LVS_EX_CHECKBOXES | List Control 아이템에 대해 체크박스 활성화 |
| LVS_EX_FLATSB | List Control의 편편한 스크롤바를 가진다 |
| LVS_EX_FULLROWSELECT | 아이템이 선택되면 모든 서브 아이템이 하이라이트 된다 |
| LVS_EX_GRIDLINES | 아이템과 서브아이템 주위에 그리드가 생긴다 |
| LVS_EX_HEADERDRAGDROP | 드래그 앤드 드롭을 가능하게 한다 |
CListCtrl::GetItemCount() 함수
GetItemCount() 함수는 List Control의 아이템 수를 얻기 위해 호출하는 함수로 원형은 다음과 같다.
int GetItemCount();
LV_ITEM 구조체
LV_ITEM은 List Control 아이템의 속성을 얻거나 명시하는 구조체이다. 이 구조체의 원형은 다음과 같다.
typedef struct _LVITEM {
UINT mask;
int iItem;
int iSubItem;
UINT state;
UINT stateMask;
LPTSTR pszText;
int cchTextMax;
int iImage;
LPARAM lParam;
} LVITEM, FAR *LPLVITEM
( mask : 유효한 항목에 대한 마스크
iItem : 삽입 위치
iSubItem : 서브 칼럼 인덱스
state : 리스트 항목의 상태
stateMask : 유효한 상태 비트에 대한 마스크
pszText : 항목 텍스트
cchTexMax : 텍스트의 최대 길이
iImage : 이미지 인덱스
lParam : 항목과 관련된 32비트 변수 )
CListCtrl::InsertItem() 함수
InsertItem() 함수는 List Control에 아이템을 추가하기 위해 호출하는 함수로 원형은 다음과 같다.
int InsertItem(const LVITEM* pItem);
( pItem : 아이템의 속성을 명시한 LVITEM 구조체의 포인터 )
CListCtrl::SetItem() 함수
SetItem() 함수는 명시된 List Control의 아이템의 속성을 설정하기 위해 호출하는 함수로 원형은 다음과 같다.
BOOL SetItem(LVITEM* pItem);
( pItem : 새로운 아이템 속성을 내포하는 LVITEM 구조체의 포인터 )
CListCtrl::GetItemText() 함수
GetItemText() 함수는 List Control 아이템이나 서브 아이템의 텍스트를 회수하는 함수로 원형은 다음과 같다.
CString GetItemText(int nItem, int nSubItem) const;
( nItem : 회수될 텍스트 아이템의 인덱스
nSubItem : 회수될 텍스트 서브 아이템을 명시 )
CListCtrl::DeleteItem() 함수
DeleteItem() 함수는 List Control로부터 아이템을 삭제하기 위해 호출하는 함수로 원형은 다음과 같다.
BOOL DeleteItem(int nItem);
( nItem : 삭제될 아이템의 인덱스 )
CListCtrl::SetItemText() 함수
SetItemText() 함수는 List Control 아이템이나 서브 아이템의 텍스트를 변경하는 함수로 원형은 다음과 같다.
BOOL SetItemText(int nItem, int nSubItem, LPTSTR lpszText);
( nItem : 변경될 텍스트 아이템의 인덱스
nSubItem : 변경될 텍스트 서브 아이템을 명시
lpszText : 변경될 텍스트 )
GetWindowLong() 함수
GetWindowLong() 함수는 명시된 윈도우에 대한 정보를 얻는다. 이 함수는 또한 여분의 윈도우 메모리에 명시된 오프셋 32비트 값을 회수한다. 이 함수의 원형은 다음과 같다.
LONG GetWindowLong(HWND hWnd, int nIndex);
( hWnd : 윈도우의 핸들
nIndex : 회수되어지는 값의 오프셋, nIndex는 다음의 표 중에서 하나의 값을 가진다 )
|
값 |
내 용 |
| GWL_EXSTYLE | 확장된 윈도우의 스타일을 회수한다 |
| GWL_STYLE | 윈도우의 스타일을 회수한다 |
| GWL_WNDPROC | 윈도우의 프로시저의 주소를 회수한다 |
| GWL_HINSTANCE | 애플리케이션 인스턴스의 핸들을 회수한다 |
| GWL_HWNDPARENT | 부모 윈도우의 핸들을 회수한다 |
| GWL_ID | 윈도우의 ID를 회수한다 |
| GWL_USERDATA | 윈도우에 연관된 32비트 값을 회수한다 |
SetWindowLong() 함수
SetWindowLong() 함수는 명시된 윈도우의 속성을 변경한다. 또한 이 함수는 여분의 윈도우 메모리에 명시된 오프셋 32비트 값을 설정한다. 이 함수의 원형은 다음과 같다.
LONG SetWindowLong(HWND hWnd, int nIndex, LONG dwNewLong);
( hWnd : 윈도우의 핸들
nIndex : 설정되어지는 값의 오프셋, nIndex는 위의 표 중에서 하나의 값을 가진다
dwNewLong : 변경되는 새로운 값 )
트리 컨트롤(Tree Control)
Tree Control은 계층구조를 가진 데이터나 항목을 표현하는 컨트롤로서, 표현하고자 하는 정보를 일정한 기준으로 분류하여 주어진 정보를 전달하고자 할 때 유용하게 사용된다. 한글로 "나무"라는 것은 뿌리, 줄기, 잎과 계층적인 관계를 가지면서도 유사성 있는 정보를 가지고 있으므로 이러한 정보들을 표현할 때 Tree Control이 적합하다.
또한 정보의 일관성 있는 분류이외에 데이터의 관계를 뚜렷이 표현할 수 있기 때문에 많이 사용되고 있다.
Tree Control의 각 항목들을 노드(Node)라 하며 이 노드는 레이블과 비트맵 이미지로 구성된다. 그리고 각 노드 앞에 + 기호가 있다면 하위 노드가 존재하고 또한 확장을 하여 하위 노드를 검색할 수 있다. 노드가 확장이 되면 + 기호는 - 기호를 변환된다. 윈도우 시스템에서 많이 접해 보았기 때문에 익숙한 내용일 것이다.
Tree Control에서 가장 제어하기 어려운 점은 표현하고자 하는 데이터가 항상 변한다는데 있다. 그래서 이런 가변적인 데이터를 표현하고자 한다면 세세한 프로그래밍과 제어가 필요하다는 것이다.
TV_INSERTSTRUCT 구조체
TV_INSERTSTRUCT은 Tree Control에 새로운 아이템을 추가하기 위해 사용되는 정보를 포함하는 구조체이다. 이 구조체의 원형은 다음과 같다.
typedef struct tagTVINSERTSTRUCT {
HTREEITEM hParent;
HTREEITEM hInsertAfter;
TVITEM item;
} TVINSERTSTRUCT, FAR *LPTVINSERTSTRUCT;
( hParent : 상위 항목의 핸들
hInsertAfter : 삽입 노드의 위치
item : 삽입될 노드의 정보 )
CTreeCtrl::InsertItem() 함수
InsertItem() 함수는 Tree Control에 아이템을 삽입하는 함수로 원형은 다음과 같다.
HTREEITEM InsertItem(LPTVINSERTSTRUCT lpInsertStruct);
( lpInsertStruct : 삽입될 Tree Control 아이템의 속성을 명시하는 TV_INSERTSTRUCT 구조체의 포인터 )
CTreeCtrl::GetItemText() 함수
GetItemText() 함수는 명시된 Tree Control 아이템의 텍스트를 반환하는 함수로 원형은 다음과 같다.
CString GetItemText(HTREEITEM hItem) const;
( hItem : 반환될 텍스트 아이템의 핸들 )
CTreeCtrl::Expand() 함수
Expand() 함수는 자식 노드의 리스트를 확장하기 위해 호출하는 함수이다. 원형은 다음과 같다.
BOOL Expand(HTREEITEM hItem, UINT nCode);
( hItem : 확장되는 트리 아이템의 핸들
nCode : 주어질 행위에 형태를 표시하는 플래그이고 이 플래그는 다음의 표 중에서 하나의 값을 가진다 )
|
플래그 값 |
내 용 |
| TVE_COLLAPSE | 트리 리스트를 축소시킨다 |
| TVE_COLLAPSERESET | 트리 리스트를 축소시키고 자식 노드를 제거한다 |
| TVE_EXPAND | 트리 리스트를 확장시킨다 |
| TVE_TOGGLE | 트리 리스트가 현재 확장되어 있으면 축소시키고 축소된 상태면 트리 리스트를 확장시킨다 |
CTreeCtrl::SetItemText() 함수
SetItemText() 함수는 Tree Control 아이템의 텍스트를 변경하는 함수로 원형은 다음과 같다.
BOOL SetItemText(HTREEITEM hItem, LPCSTR lpszItem);
( hItem : 변경될 텍스트 아이템의 인덱스
lpszItem : 변경될 텍스트 )
CTreeCtrl::DeleteItem() 함수
DeleteItem() 함수는 Tree Control로부터 아이템을 삭제하기 위해 호출하는 함수로 원형은 다음과 같다.
BOOL DeleteItem(HTREEITEM hItem);
( hItem : 삭제될 트리 아이템의 핸들 )


Practice8_1.rar
댓글을 달아 주세요.