티스토리 뷰

프로그래밍/MFC

MFC 탭 컨트롤

에어버스 2016. 7. 9. 12:10
MFC 탭 컨트롤

동일한 화면 영역에 서로 다른 내용을 표시하려고 할때 유용하다.

1. 탭 컨트롤 스타일

- Alignment
탭의 정렬 방식을 나타내는 Right Justify(기본값), Fixed Width, Ragged Right 3가지가 있다.

- Focus
탭이 키보드 포커스를 가질 수 있는 방법에 따라 Default(마우스 또는 키보드), OnButton Down(마우스), Never(키보드 포커스를 가지지 않음) 3 종류가 있다. 포커스를 가진 탭은 빗금 표시가 생긴다.

- Buttons
탭이 버튼 형태로 표시된다.

- TooTips
각각의 탭에 대해 툴팁을 생성한다.

- Border
탭 컨트롤 주식에 경계선을 그린다.

- Multiline
탭의 개수가 많을 경우 여러 줄로 표시할 수 있도록한다.

- Owner draw fixed
부모 윈도우가 탭을 다시 그릴 수 있도록한다. 하지만 이 경우에는 고정 길이으 탭만 가능하고, 부모 윈도우는 WM_MEASUREITEM 과 WM_DRAWITEM 메시지를 처리해야 한다.

- Force label left
Alignment 스타일에서 Fixed Width 를 선택한 경우에만 사용할 수 있으며, 이이콘과 레이블을 무도 왼쪽 정렬한다.

- Force icon left
Alignment 스타일에서 Fixed Width 를 선택한 경우에만 사용할 수 있으며, 이이콘은 왼쪽 정렬하고, 레이블은 가운데 정렬한다.

- HotTrack
마우스 커서가 지나갈때 탭의 레이블 색상이 바뀐다.

- Buttom
탭을 바닥에 표시한다.

- MultiSelect
Buttons 스타일을 설정한 경우에만 사용할 수 있으며, Ctrl키를 이용해서 여러개의 탭을 선택할 수 있도록 한다.

- Scroll opposite
현재 선택한 탭을 포함하는 줄을 제외한 나머지 탭을 모두 반대쪽으로 이동 시킨다.

- Vertical
탭을 왼쪽에 표시한다. 이 스타일과 Bottoms 스타일을 모두 설장하면 탭을 오른쪽에 표시한다.

<탭 건트롤은 WM_NOTIFY 통지 메시지를 발생키시며 이때 통지 코드와 의미>

통지코드 

의미 

 TCN_SELCHANGING 

 탭 선택이 변경되기 직전이다. 

 TCN_SELCHANGE 

 탭 선택이 변경되었다. 

2. 탭 컨트롤 클래스

- 탭에 사용할 이미지 리스트 설정하기

1
CImageList* CTabCtrl::SetImageList(CImageList* pImageList);
cs

탭 이미지를 사용할 경우 이 함수를 이용하여 탭 컨트롤에서 사용할 이미지를 넘겨준다.

- 탭 추가하기

1
2
3
LONG CTabCtrl::InsertItem(int nItem, TCITEM* pTabCtrlItem);
LONG CTabCtrl::InsertItem(int nItem, LPCTSTR lpszItem);
LONG CTabCtrl::InsertItem(int nItem, LPCTSTR lpszItem, int nImage);
cs

nItem : 탭의 인덱스 (0 부터 시작), 일반적으로 TCITEM 구조체에 추가할 탭에 대한 모든 정보를 채워서 1행 함수를 호출하면 되지만 2행, 3행 함수를 사용하면 좀더 간단히 탭을 추가할 수 있다.

lpszItem : 새로운 탭에 표시할 텍스트(레이블)

nImage : 탭에 표시할 이미지로서 이미지 리스트에서의 인덱스 값을 주면된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
TCITEM tcitem; // 구조체 이용해서 탭 추가
tcitem.mask = TCIF_TEXT;
tcitem.pszText = L"Tab #0";
m_tab.InsertItem(0, &tcitem);
tcitem.pszText = L"Tab #1";
m_tab.InsertItem(1, &tcitem);
tcitem.pszText = L"Tab #2";
m_tab.InsertItem(2, &tcitem);
 
// 구조체 탭 추가보다 간단
m_tab.InsertItem(0, L"Tab #0");
m_tab.InsertItem(0, L"Tab #0");
m_tab.InsertItem(0, L"Tab #0");
cs

- 탭 선택 변경과 선택된 탭 알아내기

1
2
int CTabCtrl::SetCurSel(int nItem);
int CTabCtrl::GetCurSel();
cs

nItem : 선택할 탭의 인덱스 (0 부터 시작)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class CMFCApplication15View : public CFormView
{
...
public:
    CTabCtrl m_tab;
    CEdit m_edit;
    afx_msg void OnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult);
};
 
BEGIN_MESSAGE_MAP(CMFCApplication15View, CFormView)
    ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, &CMFCApplication15View::OnSelchangeTab1)
END_MESSAGE_MAP()
 
void CMFCApplication15View::OnInitialUpdate()
{
...
    CImageList il; // 탭에 사용할 이미지 리스트를 설정
    il.Create(IDB_BITMAP1, 161, RGB(255255255));
    m_tab.SetImageList(&il);
    il.Detach();
    m_tab.InsertItem(0, L"Tab #0"0); // 3개의 탭을 추가
    m_tab.InsertItem(1, L"Tab #1"0);
    m_tab.InsertItem(2, L"Tab #2"0);
    m_tab.SetCurSel(1);
    m_edit.SetWindowTextW(L"1번째 탭을 선택했습니다.");
}
 
void CMFCApplication15View::OnSelchangeTab1(NMHDR *pNMHDR, LRESULT *pResult)
{
    int nIndex = m_tab.GetCurSel();
    CString str;
    str.Format(L"%d번째 탭을 선택했습니다.", nIndex);
    m_edit.SetWindowTextW(str);
    *pResult = 0;
}
 
cs

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31