접기
{
HTREEITEM hRoot = m_wndClassView.InsertItem(_T("메쉬 객체"), 0, 0);
m_wndClassView.SetItemState(hRoot, TVIS_BOLD, TVIS_BOLD);
//HTREEITEM hClass = m_wndClassView.InsertItem(_T("Wall"), 1, 1, hRoot);
//트리에 아이템을 추가(이름, 이미지index, ,해당 노드의 부모노드)
HTREEITEM hClass = m_wndClassView.InsertItem(_T("Wall"), 1, 1, hRoot);
HTREEITEM hWall = m_wndClassView.InsertItem(_T("Walls"), 3, 3, hClass);
m_wndClassView.InsertItem(_T("Wall"), 6, 6, hWall);
m_wndClassView.Expand(hRoot, TVE_EXPAND);
}
접기
//여기서 클래스뷰에서 사용할 리소스 비트맵을 로드한다.
void CClassView::OnChangeVisualStyle()
접기
{
m_ClassViewImages.DeleteImageList();
UINT uiBmpId = theApp.m_bHiColorIcons ? IDB_CLASS_VIEW_24 : IDB_CLASS_VIEW;
CBitmap bmp;
if (!bmp.LoadBitmap(uiBmpId))
{
TRACE(_T("비트맵을 로드할 수 없습니다. %x\n"), uiBmpId);
ASSERT(FALSE);
return;
}
BITMAP bmpObj;
bmp.GetBitmap(&bmpObj);
UINT nFlags = ILC_MASK;
nFlags |= (theApp.m_bHiColorIcons) ? ILC_COLOR24 : ILC_COLOR4;
m_ClassViewImages.Create(16, bmpObj.bmHeight, nFlags, 0, 0);
m_ClassViewImages.Add(&bmp, RGB(255, 0, 0));
m_wndClassView.SetImageList(&m_ClassViewImages, TVSIL_NORMAL);
m_wndToolBar.CleanUpLockedImages();
m_wndToolBar.LoadBitmap(theApp.m_bHiColorIcons ? IDB_SORT_24 : IDR_SORT, 0, 0, TRUE /* 잠금 */);
}
접기
여기서부터 엄청난 삽질을 한 내용입니다. 이거 알아내면서 난 바보인가를 수도없이 외치곤 했습니다;;
CClassView는 DockkingPanel클래스를 상속받았습니다. 멤버변수로 m_wndViewTree를 통해 트리뷰를 컨트롤 할 수가 있습니다. 그런데 트리뷰로부터의 컨트롤 통지메세지를 어떻게 처리해야 할까요??
저는 일단 OnNotify()에서 체크해보았으나 메세지가 안오더군요..-_-
그래서 CViewTree클래스에서 TVC_SELCHANGED의 메세지맵을 정의하고 여기서 다음과 같이 처리했습니다.
접기
1. 사용자 정의 메세지를 작성한다.
#define WM_TREE_SELCHANGED WM_USER+3 //트리 선택메세지
2. CClassView에 메세지맵을 생성한다.
- ClassView.h
afx_msg LRESULT OnSelchangedTree(WPARAM wParam, LPARAM lParam);
- ClassView.cpp
ON_MESSAGE(WM_TREE_SELCHANGED, &CClassView::OnSelchangedTree)
LRESULT CClassView::OnSelchangedTree(WPARAM wParam, LPARAM lParam)
{
//wParam : NMHDR *, lParam : LRESULT
CString str;
LPNMTREEVIEW NMTreeView = (LPNMTREEVIEW)wParam;
if (m_wndClassView.m_hWnd == NULL)
return 0; str = m_wndClassView.GetItemText(NMTreeView->itemNew.hItem);
AfxMessageBox(str);
}
3. CViewTree에 원하는 메세지 핸들러를 정의해서 발생하는 데이터를 부모로 넘긴다.
void CViewTree::OnTvnSelchanged(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
GetParent()->SendNotifyMessage(WM_TREE_SELCHANGED, (WPARAM)pNMTreeView, (LPARAM)pResult);
*pResult = 0;
}
접기