CListCtrl에 컬럼 넣기
페이지 정보
본문
윈도우 탐색기를 보면 크기, 종류, 변경한 날짜 라는 컬럼이 있는데, 제 프로그램에도 이런 식으로 컬럼을 만들고 싶습니다.
먼저 'LV_COLUMN lvcomumn'이라고 변수를 지정합니다.
▶ LV_COLUMN의 구조
typedef struct _LV_COLUMN {
UINT mask;
int fmt;
int cx;
LPSTR pszText;
int cchTextMax;
int iSubItem;
} LV_COLUMN
이렇게 정의된 LV_COLUMN 구조체의 첫 번째 인자인 'UINT mask'로 구조체 멤버변수의 유효여부를 지정할 수 있는데, 이때 값은 하나 이상일 수도 있고, 아무런 값을 갖지 않을 수도 있습니다. 두 번째 'int fmt'는 멤버변수에 따라 정렬방식 (LVCFMT_CENTER : 가운데 정렬, LVCFMT_LEFT : 왼쪽 정렬, LVCFMT_RIGHT : 오른쪽 정렬)을 결정할 수 있습니다. 리스트 뷰 컨트롤의 맨 왼쪽에 있는 컬럼은 왼쪽 정렬입니다.
그리고 'int cx'는 컬럼 넓이로 픽셀 단위이고, 'LPSTR pszText'는 컬럼의 맨 위에 들어가는 컬럼명을 가진 스트링 포인터입니다. 'int cchTextMax'는 pszText에서 얻은 버퍼의 크기를 지정해 줄 수 있는데 꼭 지정할 필요는 없습니다. 그리고 'int iSubItem'은 컬럼의 인덱스입니다. 여기서 iSubItem을 변경하면 이름, 크기, 종류, 변경한 날짜의 순서를 바꿀 수 있습니다.
이렇게 구조체의 내용을 넣은 다음 CListCtrl의 멤버함수인 int InsertColumn(int nCol, const LV_COLUMN* pColumn)을 사용하면 컬럼을 삽입할 수 있습니다.
void CMyList::FillColumn()
{
CRect rect;
LV_COLUMN lvcolumn;
TCHAR rgtsz[4][10] = {_T("이름"), _T("크기"), _T("종류"), _T("변경날짜")};
m_listctrl.GetClientRect(&rect);
for(int i=0; i<4; i++) { // 4는 컬럼의 개수
lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM |
LVCF_TEXT | LVCF_WIDTH;
lvcolumn.fmt = LVCFMT_LEFT;
lvcolumn.pszText = rgtsz[i];
lvcolumn.iSubItem = i;
lvcolumn.cx = rect.Width() / 4; // 4는 컬럼의 개수
m_listctrl.InsertColumn(i, &lvcolumn);
// CListCtrl m_listctrl 으로 선언해 준다.
}
}
구조체를 사용하지 않고 다음처럼 직접 값을 넣어도 됩니다.
int InsertColumn(int nCol, LPCTSTR lpszColumnHeading,
int nFormat = LVCFMT_LEFT, int nWidth = ?, int nSubItem = ?)
먼저 'LV_COLUMN lvcomumn'이라고 변수를 지정합니다.
▶ LV_COLUMN의 구조
typedef struct _LV_COLUMN {
UINT mask;
int fmt;
int cx;
LPSTR pszText;
int cchTextMax;
int iSubItem;
} LV_COLUMN
이렇게 정의된 LV_COLUMN 구조체의 첫 번째 인자인 'UINT mask'로 구조체 멤버변수의 유효여부를 지정할 수 있는데, 이때 값은 하나 이상일 수도 있고, 아무런 값을 갖지 않을 수도 있습니다. 두 번째 'int fmt'는 멤버변수에 따라 정렬방식 (LVCFMT_CENTER : 가운데 정렬, LVCFMT_LEFT : 왼쪽 정렬, LVCFMT_RIGHT : 오른쪽 정렬)을 결정할 수 있습니다. 리스트 뷰 컨트롤의 맨 왼쪽에 있는 컬럼은 왼쪽 정렬입니다.
그리고 'int cx'는 컬럼 넓이로 픽셀 단위이고, 'LPSTR pszText'는 컬럼의 맨 위에 들어가는 컬럼명을 가진 스트링 포인터입니다. 'int cchTextMax'는 pszText에서 얻은 버퍼의 크기를 지정해 줄 수 있는데 꼭 지정할 필요는 없습니다. 그리고 'int iSubItem'은 컬럼의 인덱스입니다. 여기서 iSubItem을 변경하면 이름, 크기, 종류, 변경한 날짜의 순서를 바꿀 수 있습니다.
이렇게 구조체의 내용을 넣은 다음 CListCtrl의 멤버함수인 int InsertColumn(int nCol, const LV_COLUMN* pColumn)을 사용하면 컬럼을 삽입할 수 있습니다.
void CMyList::FillColumn()
{
CRect rect;
LV_COLUMN lvcolumn;
TCHAR rgtsz[4][10] = {_T("이름"), _T("크기"), _T("종류"), _T("변경날짜")};
m_listctrl.GetClientRect(&rect);
for(int i=0; i<4; i++) { // 4는 컬럼의 개수
lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM |
LVCF_TEXT | LVCF_WIDTH;
lvcolumn.fmt = LVCFMT_LEFT;
lvcolumn.pszText = rgtsz[i];
lvcolumn.iSubItem = i;
lvcolumn.cx = rect.Width() / 4; // 4는 컬럼의 개수
m_listctrl.InsertColumn(i, &lvcolumn);
// CListCtrl m_listctrl 으로 선언해 준다.
}
}
구조체를 사용하지 않고 다음처럼 직접 값을 넣어도 됩니다.
int InsertColumn(int nCol, LPCTSTR lpszColumnHeading,
int nFormat = LVCFMT_LEFT, int nWidth = ?, int nSubItem = ?)
댓글목록
등록된 댓글이 없습니다.