탭 컨트롤 정보
탭 컨트롤은 노트북의 구분선 또는 파일 캐비닛의 레이블과 유사합니다. 애플리케이션은 탭 컨트롤을 사용하여 창 또는 대화 상자의 동일한 영역에 대해 여러 페이지를 정의할 수 있습니다. 각 페이지는 사용자가 해당 탭을 선택할 때 애플리케이션이 표시하는 특정 형식의 정보 또는 컨트롤 그룹으로 구성됩니다.
다음 스크린샷에서는 요일에 대한 탭이 포함된 간단한 탭 컨트롤을 보여 줍니다. 화요일 탭이 선택되었습니다.
이 항목은 다음과 같은 섹션으로 구성됩니다.
- 탭 컨트롤 만들기
- 탭 컨트롤 스타일
- 탭 및 탭 특성
- 디스플레이 영역
- 탭 선택
- 탭 컨트롤 이미지 목록
- 탭 크기 및 위치
- 소유자가 그린 탭
- 탭 컨트롤 도구 설명
- 기본 탭 컨트롤 메시지 처리
탭 컨트롤 만들기
CreateWindowEx 함수를 호출하고 WC_TABCONTROL 창 클래스를 지정하여 탭 컨트롤을 만들 수 있습니다. 이 창 클래스는 공용 컨트롤 DLL이 로드될 때 등록됩니다. DLL이 로드되었는지 확인하려면 InitCommonControlsEx 함수를 사용합니다.
Microsoft Visual Studio에서 도구 상자를 사용하여 탭 컨트롤을 만들 수 있습니다.
탭을 추가하고 컨트롤의 모양과 동작에 영향을 미치기 위해 탭 컨트롤에 메시지를 보냅니다. 각 메시지에는 메시지를 명시적으로 보내는 대신 사용할 수 있는 해당 매크로가 있습니다. 탭 컨트롤에서 개별 탭을 사용하지 않도록 설정할 수 없습니다. 그러나 해당 페이지를 사용하지 않도록 설정하여 속성 시트에서 탭 컨트롤을 사용하지 않도록 설정할 수 있습니다.
탭 컨트롤 스타일
컨트롤을 만들 때 탭 컨트롤 스타일을 지정하여 탭 컨트롤에 특정 특성을 적용할 수 있습니다. 예를 들어, 탭 컨트롤에서 탭의 정렬 및 일반 모양을 지정할 수 있습니다.
TCS_BUTTONS 스타일을 지정하여 탭을 단추처럼 보이게 할 수 있습니다. 이 형식의 탭 컨트롤에 있는 탭은 단추 컨트롤과 동일한 함수를 제공해야 합니다. 즉, 탭을 클릭하면 페이지를 표시하는 대신 명령을 수행해야 합니다. 단추 탭 컨트롤의 표시 영역은 일반적으로 사용되지 않으므로 주변에 테두리가 그려지지 않습니다.
TCS_FOCUSONBUTTONDOWN 스타일을 지정하여 클릭하면 탭이 입력 포커스를 받도록 할 수 있습니다. 이 스타일은 일반적으로 TCS_BUTTONS 스타일에만 사용됩니다. TCS_FOCUSNEVER 스타일을 사용하여 탭을 클릭할 때 입력 포커스를 받지 않도록 지정할 수 있습니다.
기본적으로 탭 컨트롤은 한 행의 탭만 표시합니다. 모든 탭을 한 번에 표시할 수 없는 경우 탭 컨트롤은 사용자가 추가 탭을 스크롤하여 볼 수 있도록 업다운 컨트롤을 표시합니다. 필요한 경우 TCS_MULTILINE 스타일을 지정하여 탭 컨트롤이 탭의 여러 행을 표시하도록 할 수 있습니다. 이 스타일을 사용하면 모든 탭을 한 번에 표시할 수 있습니다. TCS_RIGHTJUSTIFY 스타일을 지정하지 않는 한 탭은 각 행 내에서 왼쪽 정렬됩니다. 이 경우 탭의 각 행이 탭 컨트롤의 전체 너비를 채우도록 각 탭의 너비가 늘어납니다.
탭 컨트롤은 해당 아이콘(있는 경우) 및 해당 레이블에 맞게 각 탭의 크기를 자동으로 조정합니다. 모든 탭에 동일한 너비를 제공하려면 TCS_FIXEDWIDTH 스타일을 지정할 수 있습니다. 컨트롤은 가장 넓은 레이블에 맞게 모든 탭의 크기를 조정하거나 TCM_SETITEMSIZE 메시지를 사용하여 특정 너비와 높이를 할당할 수 있습니다. 각 탭 내에서 컨트롤은 아이콘과 레이블을 중앙에 놓고 레이블 왼쪽에 아이콘을 배치합니다. TCS_FORCEICONLEFT 스타일을 지정하여 레이블을 중앙에 두고 아이콘을 왼쪽으로 강제 이동할 수 있습니다. TCS_FORCELABELLEFT 스타일을 사용하여 아이콘과 레이블을 모두 왼쪽 정렬할 수 있습니다. TCS_FIXEDWIDTH 스타일은 TCS_RIGHTJUSTIFY 스타일과 함께 사용할 수 없습니다.
TCS_OWNERDRAWFIXED 스타일을 사용하여 부모 창이 컨트롤의 탭을 그리도록 지정할 수 있습니다. 자세한 내용은 소유자가 그린 탭을 참조하세요.
탭 컨트롤이 TCS_TOOLTIPS 스타일을 사용하여 도구 설명 컨트롤을 만들도록 지정할 수 있습니다. 이에 대한 자세한 내용은 탭 컨트롤 도구 설명을 참조하세요.
탭 및 탭 특성
탭 컨트롤의 각 탭은 아이콘, 레이블 및 애플리케이션 정의 데이터로 구성됩니다. 이 정보는 TCITEM 구조체로 지정됩니다. 탭 컨트롤에 탭을 추가하고, 탭 수를 검색하고, 탭의 콘텐츠를 검색 및 설정하고, 탭을 삭제할 수 있습니다. 탭은 인덱스(0부터 시작)로 식별됩니다.
탭 컨트롤에 탭을 추가하려면 항목의 위치와 TCITEM 구조체의 주소를 지정하는 TCM_INSERTITEM 메시지를 사용합니다. TCM_GETITEM 및 TCM_SETITEM 메시지를 사용하여 기존 탭의 콘텐츠를 검색하고 설정할 수 있습니다. 각 탭에 대해 아이콘, 레이블 또는 둘 다를 지정할 수 있습니다. 탭과 연결할 애플리케이션 정의 데이터를 지정할 수도 있습니다.
TCM_GETITEMCOUNT 메시지를 사용하여 현재 탭 수를 검색하고, TCM_DELETEITEM 메시지를 사용하여 탭을 삭제하고, TCM_DELETEALLITEMS 메시지를 사용하여 탭 컨트롤의 모든 탭을 삭제할 수 있습니다.
애플리케이션 정의 데이터를 각 탭과 연결할 수 있습니다. 예를 들어, 해당 탭과 함께 각 페이지에 대한 정보를 저장할 수 있습니다. 기본적으로 탭 컨트롤은 애플리케이션 정의 데이터에 대해 탭당 4바이트를 추가로 할당합니다. TCM_SETITEMEXTRA 메시지를 사용하여 탭당 추가 바이트 수를 변경할 수 있습니다. 탭 컨트롤이 비어 있을 때만 이 메시지를 사용할 수 있습니다.
애플리케이션 정의 데이터는 TCITEM 구조체의 lParam 멤버에 의해 지정됩니다. 4바이트 이상의 애플리케이션 정의 데이터를 사용하는 경우 자체 구조체를 정의하여 TCITEM 대신 사용해야 합니다. TCM_GETITEM 및 TCM_SETITEM 메시지를 사용하여 탭에 대한 기타 정보를 검색하고 설정하는 것과 동일한 방식으로 애플리케이션 정의 데이터를 검색 및 설정할 수 있습니다.
구조체의 첫 번째 멤버는 TCITEMHEADER 구조체여야 하며 나머지 멤버는 애플리케이션 정의 데이터를 지정해야 합니다. TCITEMHEADER는 lParam 멤버가 없다는 점을 제외하면 TCITEM과 동일합니다. 구조체 크기와 TCITEMHEADER 크기의 차이는 탭당 추가 바이트 수와 같아야 합니다.
디스플레이 영역
탭 컨트롤의 표시 영역은 애플리케이션이 현재 페이지를 표시하는 영역입니다. 일반적으로 애플리케이션은 표시 영역에 맞게 창 크기와 위치를 설정하여 자식 창이나 대화 상자를 만듭니다. 탭 컨트롤의 창 사각형이 주어지면 TCM_ADJUSTRECT 메시지를 사용하여 표시 영역의 경계 사각형을 계산할 수 있습니다.
경우에 따라 표시 영역은 특정 크기(예: 모덜리스 자식 대화 상자의 크기)여야 합니다. 디스플레이 영역의 경계 사각형이 주어지면 TCM_ADJUSTRECT를 사용하여 탭 컨트롤에 해당하는 창 사각형을 계산할 수 있습니다.
탭 선택
사용자가 탭을 선택하면 탭 컨트롤이 WM_NOTIFY 메시지 형식으로 부모 창 알림 코드를 보냅니다. TCN_SELCHANGE 알림 코드는 선택이 변경되기 전에 전송되고 TCN_SELCHANGE 알림 코드는 선택이 변경된 후에 전송됩니다.
나가는 페이지의 상태를 저장하기 위해 TCN_SELCHANGING을 처리할 수 있습니다. 선택 항목이 변경되지 않도록 TRUE를 반환할 수 있습니다. 예를 들어, 컨트롤에 잘못된 설정이 있는 자식 대화 상자에서 전환하고 싶지 않을 수 있습니다.
수신 페이지를 표시 영역에 표시하려면 TCN_SELCHANGE를 처리해야 합니다. 이는 단순히 자식 창에 표시되는 정보를 변경하게 될 수 있습니다. 대부분의 경우 각 페이지는 자식 창이나 대화 상자로 구성됩니다. 이 경우 애플리케이션은 나가는 자식 창이나 대화 상자를 없애거나 숨기고 들어오는 자식 창이나 대화 상자를 만들거나 표시하여 이 알림을 처리할 수 있습니다.
TCM_GETCURSEL 및 TCM_SETCURSEL 메시지를 사용하여 현재 선택을 검색하고 설정할 수 있습니다.
탭 컨트롤 이미지 목록
각 탭에는 탭 컨트롤에 대한 이미지 목록의 인덱스로 지정된 관련 아이콘이 있을 수 있습니다. 탭 컨트롤이 만들어지면 연결된 이미지 목록이 없습니다. 애플리케이션은 ImageList_Create 함수를 사용하여 이미지 목록을 만든 다음 TCM_SETIMAGELIST 메시지를 사용하여 탭 컨트롤에 할당할 수 있습니다.
다른 이미지 목록과 마찬가지로 탭 컨트롤의 이미지 목록에 이미지를 추가할 수 있습니다. 그러나 애플리케이션은 ImageList_Remove 함수 대신 TCM_REMOVEIMAGE 메시지를 사용하여 이미지를 제거해야 합니다. 이 메시지는 각 탭이 이전과 동일한 이미지와 연결된 상태로 유지되도록 합니다.
탭 컨트롤을 삭제해도 연결된 이미지 목록은 삭제되지 않습니다. 이미지 목록은 별도로 제거해야 합니다. 이는 동일한 이미지 목록을 여러 탭 컨트롤에 할당하려는 경우에 유용합니다.
현재 탭 컨트롤과 연결된 이미지 목록에 대한 핸들을 검색하려면 TCM_GETIMAGELIST 메시지를 사용할 수 있습니다.
탭 크기 및 위치
탭 컨트롤의 각 탭에는 크기와 위치가 있습니다. 탭의 크기를 설정하거나, 탭의 경계 사각형을 검색하거나, 지정된 위치에 있는 탭을 결정할 수 있습니다.
고정 너비 및 소유자가 그린 탭 컨트롤의 경우 TCM_SETITEMSIZE 메시지를 사용하여 탭의 정확한 너비와 높이를 설정할 수 있습니다. 다른 탭 컨트롤에서 각 탭의 크기는 탭의 아이콘과 레이블을 기준으로 계산됩니다. 탭 컨트롤에는 테두리를 위한 공간과 추가 여백이 포함됩니다. TCM_SETPADDING 메시지를 사용하여 여백의 두께를 설정할 수 있습니다.
TCM_GETIMRECT 메시지를 사용하여 탭의 현재 경계 사각형을 결정할 수 있습니다. TCM_HITTEST 메시지를 사용하여 지정된 위치에 어떤 탭이 있는지 확인할 수 있습니다.
TCS_MULTILINE 스타일이 있는 탭 컨트롤에서 TCM_GETROWCOUNT 메시지를 사용하여 탭의 현재 행 수를 확인할 수 있습니다.
소유자가 그린 탭
탭 컨트롤에 TCS_OWNERDRAWFIXED 스타일이 있는 경우 부모 창은 WM_DRAWITEM 메시지를 처리하여 탭을 그려야 합니다. 탭 컨트롤은 탭을 그려야 할 때마다 이 메시지를 보냅니다. lParam 매개 변수는 DRAWITEMSTRUCT 구조체의 주소를 지정합니다. 여기에는 탭의 인덱스, 경계 사각형 및 그릴 디바이스 컨텍스트(DC)가 포함됩니다.
기본적으로 DRAWITEMSTRUCT의 itemData 멤버에는 TCITEM 구조체의 lParam 멤버 값이 포함됩니다. 그러나 탭당 애플리케이션 정의 데이터의 양을 변경하면 itemData에 데이터 주소가 대신 포함됩니다. TCM_SETITEMEXTRA 메시지를 사용하여 탭당 애플리케이션 정의 데이터의 양을 변경할 수 있습니다.
탭 컨트롤의 항목 크기를 지정하려면 부모 창이 WM_MEASUREITEM 메시지를 처리해야 합니다. 소유자가 그린 탭 컨트롤의 모든 탭은 크기가 같기 때문에 이 메시지는 한 번만 전송됩니다. 다양한 크기의 소유자가 그린 탭에 대한 탭 컨트롤 스타일이 없습니다. TCM_SETITEMSIZE 메시지를 사용하여 탭의 너비와 높이를 설정할 수도 있습니다.
탭 컨트롤 도구 설명
도구 설명 컨트롤을 사용하여 탭 컨트롤의 각 탭에 대한 간략한 설명을 제공할 수 있습니다. TCS_TOOLTIPS 스타일이 있는 탭 컨트롤은 만들어질 때 도구 설명 컨트롤을 만들고 제거되면 도구 설명 컨트롤을 제거시킵니다. 도구 설명 컨트롤을 만들어 탭 컨트롤에 할당할 수도 있습니다.
탭 컨트롤과 함께 도구 설명 컨트롤을 사용하는 경우 부모 창은 요청 시 각 탭에 대한 설명을 제공하기 위해 TTN_GETDISPINFO 알림 코드를 처리해야 합니다.
둘 이상의 탭 컨트롤과 동일한 도구 설명 컨트롤을 사용하려면 도구 설명 컨트롤을 직접 만들고 TCM_SETTOOLTIPS 메시지를 사용하여 탭 컨트롤에 할당합니다. TCM_GETTOOLTIPS 메시지를 사용하여 탭 컨트롤의 현재 도구 설명 컨트롤에 대한 핸들을 검색할 수 있습니다. 고유한 도구 설명 컨트롤을 만드는 경우 TCS_TOOLTIPS 스타일을 사용하면 안 됩니다.
기본 탭 컨트롤 메시지 처리
이 섹션에서는 탭 컨트롤이 수행하는 메시지 처리에 대해 설명합니다. 탭 컨트롤과 관련된 메시지는 이 설명서의 다른 섹션에서 설명합니다.
메시지 | 수행된 처리 |
---|---|
WM_CAPTURECHANGED | 탭 컨트롤이 마우스 캡처 자체를 해제한 경우 아무 작업도 수행하지 않습니다. 다른 창이 마우스를 캡처하고 단추를 누르고 있으면 명령이 단추를 놓습니다. |
WM_CREATE | 내부 데이터 구조체를 할당하고 초기화합니다. 컨트롤은 TCS_TOOLTIPS 스타일이 지정된 경우 도구 설명 컨트롤을 만듭니다. |
WM_DESTROY | WM_CREATE 처리 중에 할당된 리소스를 해제합니다. |
WM_GETDLGCODE | DLGC_WANTARROWS 및 DLGC_WANTCHARS 값의 조합을 반환합니다. |
WM_GETFONT | 레이블에 사용되는 글꼴에 대한 핸들을 반환합니다. |
WM_KEYDOWN | 방향 키를 처리하고 해당하는 경우 선택 항목을 변경합니다. |
WM_KILLFOCUS | 포커스가 있는 탭을 무효화하여 포커스가 없는 상태를 반영하도록 다시 그립니다. |
WM_LBUTTONDOWN | 도구 설명 컨트롤이 있는 경우 메시지를 전달하고 사용자가 탭을 클릭하면 선택을 변경합니다. 사용자가 단추를 클릭하면 컨트롤은 단추를 다시 그려서 오목한 모양을 만들고 마우스를 캡처합니다. 사용자가 탭이나 단추를 클릭하고 TCS_FOCUSONBUTTONDOWN 스타일이 지정된 경우 컨트롤은 포커스를 자체로 설정합니다. |
WM_LBUTTONUP | 단추를 누른 경우 마우스를 놓습니다. 커서가 단추 위에 있고 누르고 있으면 컨트롤이 그에 따라 선택을 변경하고 단추를 다시 그립니다. |
WM_MOUSEMOVE | 도구 설명 컨트롤이 있는 경우 메시지를 전달합니다. TCS_BUTTONS 스타일이 지정되고 클릭 후 마우스 단추를 누르고 있으면 컨트롤이 해당 단추를 다시 그려 볼록하거나 오목한 모양을 만들 수도 있습니다. |
WM_NOTIFY | 도구 설명 컨트롤에서 보낸 알림 코드를 전달합니다. |
WM_PAINT | 표시 영역 주위에 테두리를 그리고(TCS_BUTTONS 스타일이 지정되지 않은 경우) 잘못된 사각형과 교차하는 모든 탭을 그립니다. 각 탭에 대해 탭 본문을 그린 다음(또는 WM_DRAWITEM 메시지를 부모 창으로 전송) 탭 주위에 테두리를 그립니다. wParam 매개 변수가 NULL이 아닌 경우 컨트롤은 값이 HDC라고 가정하고 해당 디바이스 컨텍스트를 사용하여 그립니다. |
WM_RBUTTONDOWN | 부모 창에 NM_RCLICK 알림 코드를 보냅니다. |
WM_SETFOCUS | 포커스가 있는 탭을 무효화하여 포커스 상태를 반영하도록 다시 그립니다. |
WM_SETFONT | 레이블에 사용되는 글꼴을 설정합니다. |
WM_SETREDRAW | 항목이 삽입 및 삭제될 때, 글꼴이 변경될 때 등에 컨트롤을 다시 그릴지 여부를 결정하는 내부 플래그의 상태를 설정합니다. |
WM_SIZE | 탭의 위치를 다시 계산하고 파트 또는 모든 탭을 강제로 다시 그리기 위해 탭 컨트롤의 파트를 무효화할 수 있습니다. |