프로그래밍/VC++

다이얼로그 박스에서 CDirTreeCtrl 사용해서 트리에 폴더 목록 표시하기

panpro 2006. 10. 6. 21:28

샘플 다운로드 :





위와 같이 트리에 폴더 목록을 표시하도록 하자.

다음과 같이 헤더 파일에 CDirTreeCtrl 클래스 형의 인스턴스와 OnSelChangeTree2 함수를 추가하자. 이 함수는 CDirTreeCtrl 트리로부터 발생하는 TVN_SELCHANGED 메시지를 처리하기 위해 사용된다.

// 구현
protected:
HICON m_hIcon;
CDirTreeCtrl m_TreeCtrl2;

// 메시지 맵 함수를 생성했습니다.
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg void OnSelchangedTree2(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()

그리고 전체 폴더 path를 받아오기 위해 m_strPath 변수를 선언한다.
CString	m_strPath;

이제 CPP 파일 내의 메시지 맵에 TVN_SELCHANGED 메시지를 처리하기 위해 등록한다.
BEGIN_MESSAGE_MAP(Ctest13Dlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_NOTIFY(TVN_SELCHANGED, IDC_TREE2, OnSelchangedTree2)
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
END_MESSAGE_MAP()
다음 OnInitDialog() 함수에 다음 코드를 추가해서 화면에 트리가 나타나도록 한다.

// TODO: 여기에 추가 초기화 작업을 추가합니다.
TCHAR szWorkDir[MAX_PATH];

// TODO: Add extra initialization here
// Here we subclass our CDirTreeCtrl
m_TreeCtrl2.Create( WS_CHILD | TVS_LINESATROOT | TVS_HASBUTTONS | WS_VISIBLE | TVS_HASLINES, CRect(0, 0, 300, 330), this, IDC_TREE2 );
m_TreeCtrl2.DisplayTree(NULL, FALSE);


이제 마지막, 트리에서 하나의 폴더를 선택하면 발생하는 이벤트를 처리하는 함수를 구현한다.
/*
트리에서 폴더를 선택하면 발생하는 이벤트 처리
*/
void Ctest13Dlg::OnSelchangedTree2(NMHDR* pNMHDR, LRESULT* pResult)
{
// m_strPath에 현재 위치를 담는다.
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
m_strPath = m_TreeCtrl2.GetFullPath( pNMTreeView->itemNew.hItem );
UpdateData( FALSE );
*pResult = 0;

this->SetWindowText(m_strPath);
}