헤더 컨트롤 정보
헤더 컨트롤은 일반적으로 텍스트 또는 숫자 열 위에 위치하는 창입니다. 각 열에 대한 제목이 포함되어 있으며 파트로 나눌 수 있습니다. 사용자는 파트를 구분하는 구분선을 끌어서 각 열의 너비를 설정할 수 있습니다. 다음 그림에서는 디렉터리의 파일에 대한 자세한 정보를 제공하는 레이블 지정 열이 있는 헤더 컨트롤을 보여 줍니다.
CreateWindowEx 함수를 사용해 WC_HEADER 창 클래스와 적절한 헤더 컨트롤 스타일을 지정하여 헤더 컨트롤을 만들 수 있습니다. 이 창 클래스는 공용 컨트롤 DLL이 로드될 때 등록됩니다. DLL이 로드되었는지 확인하려면 InitCommonControlsEx 함수를 사용합니다. 헤더 컨트롤을 만든 후 이를 파트로 나누고, 각 파트에 텍스트를 설정하고, 헤더 창 메시지를 사용해 창 모양을 제어할 수 있습니다.
헤더 컨트롤은 목록 상자와 같은 다른 컨트롤의 자식 창으로 만들 수 있습니다. 그러나 부모 컨트롤은 헤더 컨트롤을 인식하지 못하고 헤더에서 차지하는 공간을 허용하지 않아 목록 항목이 헤더 뒤에 표시됩니다. 목록 상자 또는 다른 컨트롤에서 헤더 컨트롤을 사용하려면 모든 항목이 올바른 위치에 표시되도록 부모 컨트롤을 소유자가 그려야 합니다.
목록 보기 컨트롤에는 이미 헤더 컨트롤이 있습니다. 목록 보기 컨트롤용 헤더 컨트롤을 만드는 대신, LVM_GETHEADER 또는 ListView_GetHeader를 사용하여 기존 컨트롤을 검색합니다.
헤더 컨트롤 크기 및 위치
일반적으로 창의 클라이언트 영역과 같은 특정 사각형의 경계 안에 맞도록 헤더 컨트롤의 크기와 위치를 설정해야 합니다. HDM_LAYOUT 메시지를 사용하여 헤더 컨트롤에서 적절한 크기/위치 값을 검색할 수 있습니다.
HDM_LAYOUT을 보낼 때 헤더 컨트롤이 차지할 사각형의 좌표를 포함하고 WINDOWPOS 구조체에 대한 포인터를 제공하는 HDLAYOUT 구조체의 주소를 지정합니다. 컨트롤은 지정된 사각형의 위쪽을 따라 컨트롤을 배치하는 데 적합한 크기와 위치 값으로 WINDOWPOS 구조체를 채웁니다. 높이 값은 컨트롤의 가로 테두리 높이와 현재 컨트롤 디바이스 컨텍스트에 선택된 글꼴의 평균 문자 높이를 합한 값입니다.
HDM_LAYOUT을 사용하여 헤더 컨트롤의 초기 크기와 위치를 설정하려면 컨트롤이 숨겨지도록 컨트롤의 초기 표시 상태를 설정합니다. HDM_LAYOUT을 보내 크기/위치 값을 검색한 후 SetWindowPos 함수를 사용하여 새 크기, 위치 및 표시 상태를 설정할 수 있습니다.
항목
헤더 컨트롤에는 일반적으로 컨트롤의 열을 정의하는 헤더 항목이 여러 개 있습니다. HDM_INSERTITEM 메시지를 컨트롤로 보내 헤더 컨트롤에 항목을 추가합니다. 메시지에는 HDITEM 구조체의 주소가 포함됩니다. 이 구조체는 문자열, 비트맵 이미지, 초기 크기 및 애플리케이션 정의 LPARAM 값을 포함할 수 있는 헤더 항목의 속성을 정의합니다.
항목 HDITEM 구조체의 fmt 멤버에는 컨트롤이 항목의 문자열 또는 비트맵을 표시하는지 여부를 나타내는 HDF_STRING 또는 HDF_BITMAP플래그가 포함될 수 있습니다. 문자열과 비트맵을 모두 표시하려면 HDF_OWNERDRAW 플래그를 포함하도록 fmt 멤버를 설정하여 소유자가 그린 항목을 만듭니다. 또한 HDITEM 구조체는 항목의 사각형에서 문자열 또는 비트맵을 가운데 맞춤할 것인지, 왼쪽이나 오른쪽 맞춤할 것인지를 컨트롤에 알려 주는 서식 플래그를 지정합니다.
HDM_INSERTITEM은 새로 추가된 항목의 인덱스를 반환합니다. 다른 메시지의 인덱스를 사용해 속성을 설정하거나 항목에 대한 정보를 검색할 수 있습니다. HDM_DELETEITEM 메시지를 사용해 삭제할 항목의 인덱스를 지정하여 항목을 삭제할 수 있습니다.
HDM_SETITEM 메시지를 사용해 기존 헤더 항목의 속성과 HDM_GETITEM 메시지를 설정하여 항목의 현재 속성을 검색할 수 있습니다. 헤더 컨트롤의 항목 수를 검색하려면 HDM_GETITEMCOUNT 메시지를 사용합니다.
소유자가 그린 헤더 컨트롤
소유자가 그린 항목으로 지정할 헤더 컨트롤의 개별 항목을 정의할 수 있습니다. 이 기술을 사용하면 헤더 항목의 모양을 달리 제어하는 기능보다 더 많은 컨트롤을 얻을 수 있습니다.
HDM_INSERTITEM 메시지를 사용해 새 소유자가 그린 항목을 헤더 컨트롤 또는 HDM_SETITEM 메시지에 삽입하여 기존 항목을 소유자가 그린 항목으로 변경할 수 있습니다. 두 메시지에는 fmt 멤버가 HDF_OWNERDRAW 값으로 설정되어야 하는 HDITEM 구조체의 주소가 포함됩니다.
헤더 컨트롤에서 소유자가 그린 항목을 그려야 하는 경우 부모 창에 WM_DRAWITEM 메시지를 보냅니다. 메시지의 wParam 매개 변수는 헤더 컨트롤의 자식 창 식별자이고, lParam 매개 변수는 DRAWITEMSTRUCT 구조체의 주소입니다. 부모 창은 구조체의 정보를 사용하여 항목을 그립니다. 헤더 컨트롤에서 소유자가 그린 항목의 경우 DRAWITEMSTRUCT 구조체에 다음 정보가 포함됩니다.
멤버 | 설명 |
---|---|
CtlType | 소유자가 그린 ODT_HEADER 컨트롤 형식입니다. |
CtlID | 헤더 컨트롤의 자식 창 식별자입니다. |
itemID | 그릴 항목의 인덱스입니다. |
itemAction | ODA_DRAWENTIRE 그리기 작업 플래그입니다. |
itemState | 커서가 항목에 있고 마우스 단추가 아래쪽에 있으면 ODS_SELECTED그리기 작업 플래그입니다. 그렇지 않으면 이 멤버는 0입니다. |
hwndItem | 헤더 컨트롤에 대한 핸들입니다. |
hDC | 헤더 컨트롤의 디바이스 컨텍스트에 대한 핸들입니다. |
rcItem | 그릴 헤더 항목의 좌표입니다. 좌표는 컨트롤의 왼쪽 상단 모서리를 기준으로 합니다. |
itemData | 항목과 연결된 애플리케이션 정의 32비트 값입니다. |
헤더 컨트롤 필터
헤더 컨트롤의 HDS_FILTERBAR 창 스타일을 지정하여 열 머리글 아래에 필터 편집 상자를 배치할 수 있습니다. 편집 상자 옆에 필터 단추가 나타납니다. HDN_BEGINFILTEREDIT, HDN_ENDFILTEREDIT, HDN_FILTERBTNCLICK 또는 HDN_FILTERCHANGE 알림 코드에 응답하여 필터링할 수 있습니다.
기본적으로 편집 상자에는 사용자가 텍스트를 입력하라는 메시지가 포함됩니다. Header_ClearFilter 또는 Header_ClearAllFilters를 사용하여 편집 상자를 이 기본 상태로 복원할 수 있습니다.
다음 코드 예제에서는 목록 보기 컨트롤에서 헤더 컨트롤을 검색하고 필터 표시줄을 추가하는 방법을 보여 줍니다.
// hList is the HWND of the list-view control.
HWND hHeader = ListView_GetHeader(hList);
LONG_PTR styles = GetWindowLongPtr(hHeader, GWL_STYLE);
SetWindowLongPtr(g_hHeader, GWL_STYLE, styles | HDS_FILTERBAR);
기본 헤더 컨트롤 메시지 처리
이 섹션에서는 WC_HEADER 창 클래스의 창 프로시저에서 처리하는 창 메시지를 설명합니다.
메시지 | 수행된 처리 |
---|---|
WM_CREATE | 헤더 컨트롤을 초기화합니다. |
WM_DESTROY | 헤더 컨트롤을 초기화하지 않습니다. |
WM_ERASEBKGND | 컨트롤의 현재 배경색을 사용하여 헤더 컨트롤의 배경을 채웁니다. |
WM_GETDLGCODE | DLGC_WANTTAB 및 DLGC_WANTARROWS 값의 조합을 반환합니다. |
WM_GETFONT | 헤더 컨트롤에서 텍스트를 그리는 데 사용되는 현재 글꼴에 대한 핸들을 반환합니다. |
WM_LBUTTONDBLCLK | 마우스 입력을 캡처합니다. 마우스 커서가 구분선에 있으면 컨트롤이 HDN_BEGINTRACK 알림 코드를 보내고 구분선 끌기를 시작합니다. 커서가 항목에 있으면 항목이 눌린 상태로 표시됩니다. |
WM_LBUTTONDOWN | WM_LBUTTONDBLCLK 메시지와 동일합니다. |
WM_LBUTTONUP | 마우스 캡처를 해제합니다. 컨트롤이 마우스 이동을 추적하면 HDN_ENDTRACK 알림 코드를 보내고 헤더 컨트롤을 다시 그립니다. 그렇지 않으면 컨트롤에서 HDN_ITEMCLICK 알림 코드를 보내고 클릭한 헤더 항목을 다시 그립니다. |
WM_MOUSEMOVE | 구분선을 끌면 컨트롤에서 HDN_TRACK 알림 코드를 보내고 항목을 새 위치에 표시합니다. 마우스 왼쪽 단추가 아래쪽에 있고 커서가 항목에 있으면 항목이 눌린 상태로 표시됩니다. |
WM_NCCREATE | 내부 데이터 구조체를 할당하고 초기화합니다. |
WM_NCDESTROY | 헤더 컨트롤이 초기화되지 않으면 헤더 컨트롤에서 할당한 리소스를 해제합니다. |
WM_PAINT | 잘못된 헤더 컨트롤 영역을 그립니다. wParam 매개 변수가 NULL이 아니면 컨트롤에서 값이 HDC라고 가정하고 해당 디바이스 컨텍스트를 사용하여 그립니다. |
WM_SETCURSOR | 커서가 구분선에 있는지, 아니면 헤더 항목에 있는지에 따라 커서 모양을 설정합니다. |
WM_SETFONT | 헤더 컨트롤의 디바이스 컨텍스트로 새 글꼴 핸들을 선택합니다. |