주 창에서 탭 컨트롤을 만드는 방법
이 섹션의 예에서는 탭 컨트롤을 만들고 애플리케이션 주 창의 클라이언트 영역에 표시하는 방법을 보여 줍니다. 애플리케이션은 탭 컨트롤의 표시 영역에 세 번째 창(정적 컨트롤)을 표시합니다. 부모 창은 WM_SIZE 메시지를 처리할 때 탭 컨트롤과 정적 컨트롤을 배치하고 크기를 조정합니다.
이 예에는 각 요일에 대해 하나씩 총 7개의 탭이 있습니다. 사용자가 탭을 선택하면 애플리케이션은 정적 컨트롤에 해당 날짜의 이름을 표시합니다.
알아야 하는 작업
기술
필수 구성 요소
- C/C++
- Windows 사용자 인터페이스 프로그래밍
지침
주 창에서 탭 컨트롤 만들기
다음 함수는 탭 컨트롤을 만들고 각 요일에 대한 탭을 추가합니다. 요일의 이름은 IDS_SUNDAY(애플리케이션의 리소스 헤더 파일에 정의됨)부터 시작하여 연속적으로 번호가 매겨진 문자열 리소스로 정의됩니다. 부모 창과 탭 컨트롤은 모두 WS_CLIPSIBLINGS 창 스타일을 가져야 합니다. 애플리케이션의 초기화 함수는 주 창을 만든 후 이 함수를 호출합니다.
#define DAYS_IN_WEEK 7
// Creates a tab control, sized to fit the specified parent window's client
// area, and adds some tabs.
// Returns the handle to the tab control.
// hwndParent - parent window (the application's main window).
//
HWND DoCreateTabControl(HWND hwndParent)
{
RECT rcClient;
INITCOMMONCONTROLSEX icex;
HWND hwndTab;
TCITEM tie;
int i;
TCHAR achTemp[256]; // Temporary buffer for strings.
// Initialize common controls.
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_TAB_CLASSES;
InitCommonControlsEx(&icex);
// Get the dimensions of the parent window's client area, and
// create a tab control child window of that size. Note that g_hInst
// is the global instance handle.
GetClientRect(hwndParent, &rcClient);
hwndTab = CreateWindow(WC_TABCONTROL, L"",
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
0, 0, rcClient.right, rcClient.bottom,
hwndParent, NULL, g_hInst, NULL);
if (hwndTab == NULL)
{
return NULL;
}
// Add tabs for each day of the week.
tie.mask = TCIF_TEXT | TCIF_IMAGE;
tie.iImage = -1;
tie.pszText = achTemp;
for (i = 0; i < DAYS_IN_WEEK; i++)
{
// Load the day string from the string resources. Note that
// g_hInst is the global instance handle.
LoadString(g_hInst, IDS_SUNDAY + i,
achTemp, sizeof(achTemp) / sizeof(achTemp[0]));
if (TabCtrl_InsertItem(hwndTab, i, &tie) == -1)
{
DestroyWindow(hwndTab);
return NULL;
}
}
return hwndTab;
}
다음 함수는 탭 컨트롤의 표시 영역에 있는 정적 컨트롤을 만듭니다. 애플리케이션의 초기화 함수는 주 창과 탭 컨트롤을 만든 후 이 함수를 호출합니다.
정적 컨트롤은 탭 컨트롤의 표시 영역에 위치하지만 자식이 아닌 탭 컨트롤의 형제입니다. 이렇게 하면 정적 컨트롤이 공유 부모 창의 탭 순서에 참여할 수 있습니다. 정적 컨트롤에는 중요하지 않지만 버튼과 같은 키보드 액세스 가능 컨트롤로 대체되는 경우 사용하는 것이 좋습니다.
// Creates a child window (a static control) to occupy the tab control's
// display area.
// Returns the handle to the static control.
// hwndTab - handle of the tab control.
//
HWND DoCreateDisplayWindow(HWND hwndTab)
{
HWND hwndStatic = CreateWindow(WC_STATIC, L"",
WS_CHILD | WS_VISIBLE | WS_BORDER,
100, 100, 100, 100, // Position and dimensions; example only.
GetParent(hwndTab), NULL, g_hInst, // g_hInst is the global instance handle
NULL);
return hwndStatic;
}
다음 함수 예는 애플리케이션의 창 프로시저에서 호출됩니다. 애플리케이션은 WM_SIZE 메시지를 처리할 때 OnSize
함수를 호출하여 주 창의 클라이언트 영역에 맞게 탭 컨트롤의 위치를 지정하고 크기를 조정합니다.
탭이 선택되면 탭 컨트롤은 TCN_SELCHANGE 알림 코드를 지정하는 WM_NOTIFY 메시지를 보냅니다. 애플리케이션의 OnNotify
함수는 정적 컨트롤의 텍스트를 설정하여 이 알림 코드를 처리합니다.
// Handles the WM_SIZE message for the main window by resizing the
// tab control.
// hwndTab - handle of the tab control.
// lParam - the lParam parameter of the WM_SIZE message.
//
HRESULT OnSize(HWND hwndTab, LPARAM lParam)
{
RECT rc;
if (hwndTab == NULL)
return E_INVALIDARG;
// Resize the tab control to fit the client are of main window.
if (!SetWindowPos(hwndTab, HWND_TOP, 0, 0, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), SWP_SHOWWINDOW))
return E_FAIL;
return S_OK;
}
// Handles notifications from the tab control, as follows:
// TCN_SELCHANGING - always returns FALSE to allow the user to select a
// different tab.
// TCN_SELCHANGE - loads a string resource and displays it in a static
// control on the selected tab.
// hwndTab - handle of the tab control.
// hwndDisplay - handle of the static control.
// lParam - the lParam parameter of the WM_NOTIFY message.
//
BOOL OnNotify(HWND hwndTab, HWND hwndDisplay, LPARAM lParam)
{
TCHAR achTemp[256]; // temporary buffer for strings
switch (((LPNMHDR)lParam)->code)
{
case TCN_SELCHANGING:
{
// Return FALSE to allow the selection to change.
return FALSE;
}
case TCN_SELCHANGE:
{
int iPage = TabCtrl_GetCurSel(hwndTab);
// Note that g_hInst is the global instance handle.
LoadString(g_hInst, IDS_SUNDAY + iPage, achTemp,
sizeof(achTemp) / sizeof(achTemp[0]));
LRESULT result = SendMessage(hwndDisplay, WM_SETTEXT, 0,
(LPARAM) achTemp);
break;
}
}
return TRUE;
}
관련 항목