티스토리 뷰
탭 컨트롤 각 탭에 같은 컨트롤을 사용하는 경우 참조 :
각 탭마다 다른 컨트롤을 사용해야 한다면,
Dialog 추가해서 속성에 Border : None, Style : Child 로 설정하고
Dialog 에 원하는 컨트롤 추가해서 클래스 만들어 각 탭에 등록한다.
추가한 Dialog 클래스가 C주문Dlg와 C실시간Dlg 를 C시간Dlg 에 있는 탭컨트롤 위에 표시하는 경우라면 아래 코드처럼 한다.
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
37
38
39
40
41
42
43
44
45
46
47
48 |
class C시간Dlg : public CDialogEx
{
public:
void 탭추가();
private:
CTabCtrl m_TabCtrl;
C주문Dlg* m_p주문Dlg;
C실시간Dlg* m_p실시간Dlg;
public:
afx_msg void OnTcnSelchangeTabDanil(NMHDR *pNMHDR, LRESULT *pResult);
};
void C시간Dlg::탭추가()
{
m_TabCtrl.InsertItem(0, TEXT("정보"));
m_TabCtrl.InsertItem(1, TEXT("실시간정보"));
m_TabCtrl.SetCurSel(0);
CRect rect;
m_TabCtrl.GetWindowRect(&rect);
m_p주문Dlg = new C주문Dlg(this); // 탭에 등록할 dialog 동적 생성
m_p주문Dlg->Create(IDD_DIALOG_TAB_ORDER, &m_TabCtrl); // C주문Dlg 의 ID가 온다.
m_p주문Dlg->MoveWindow(0, 25, rect.Width(), rect.Height());
m_p주문Dlg->ShowWindow(SW_SHOW);
m_p단일가실시간Dlg = new C실시간Dlg(this);
m_p단일가실시간Dlg->Create(IDD_DIALOG_TAB_REAL, &m_TabCtrl);
m_p단일가실시간Dlg->MoveWindow(0, 25, rect.Width(), rect.Height());
m_p단일가실시간Dlg->ShowWindow(SW_HIDE);
}
void C시간Dlg::OnTcnSelchangeTabDanil(NMHDR *pNMHDR, LRESULT *pResult)
{
int nSel = m_TabCtrl.GetCurSel(); // 탭 선택에 따른 Dialog표시
switch (nSel)
{
case 0:
m_p주문Dlg->ShowWindow(SW_SHOW);
m_p시간Dlg->ShowWindow(SW_HIDE);
break;
case 1:
m_p주문Dlg->ShowWindow(SW_HIDE);
m_p실시간Dlg->ShowWindow(SW_SHOW);
break;
}
*pResult = 0;
} |
cs |
주의>
당연한거지만, 23행의 IDD_DIALOG_TAB_ORDER 는 C주문Dlg 의 ID 이여야 한다.
다른곳에서 코드 가져오는 경우 ID값을 엉뚱하게 지정하면 컴파일은 성공해도 실행 시 DDX 에서 예외발생한다.
추가>
위 코드 각 24행, 29행 바로 아래 ShowWindow()호출하기 전에
m_p주문Dlg->Get주문List()->MoveWindow(0, 0, rect.Width(), rect.Height());
를 추가해서 Dialog와 CListCtrl 사이 여백 제거를 위해 CListCtrl 를 의 MoveWindow() 이동시킨다.
만약, 수평 스크롤바가 필요할때는 rect.Height()-20 을 하고
수직 스크롤바가 필요하면 rect.Width()-20 을 해주면 된다.