CTreeCtrl 을 사용해서 체크박스를 단후 체크박스를 체크 하면 자식들도 모두 체크 하거나 체크 해제 하고 싶을 경우가 있는데. 이럴때 다음과 같은 방법으로 자식 노드를 재귀호출하여 체크/해제 할수 있다.
먼저 클릭 이벤트를 만들다. 핸들러는 TVN 게열과 NM 계열이 있는데 . 해당 체크 박스를 좌클릭 했을때 자식아이템을 쳌,/ 해제 하기를 원하기 때문에 NM_CLICK 이벤트를 선택한다.
코드는 다음과 같이 한다.
[cpp]
//
// CTreeCtrl에 왼쪽 마우스 이벤트가 발생했을 경우
// 이벤트가 발생한 좌표에 트리아이템이 존재하고 체크박스가 체크된 경우
// 정해진 작업을 수행한다.
//
void [CMainClass]::OnNMClickTreeDevices(NMHDR *pNMHDR, LRESULT *pResult)
{
*pResult = 0;
CPoint point;
UINT nFlags = 0;
GetCursorPos(&point);
::ScreenToClient(m_ctrlTree.m_hWnd, &point);
HTREEITEM hItem = m_ctrlTree.HitTest(point, &nFlags);
// 아이템이 존재하고 체크박스에 이벤트가 발생했다면
if (hItem != NULL && (nFlags & TVHT_ONITEMSTATEICON) != 0)
{
// 해당 아이템이 체크되어 있다면
if (m_ctrlTree.GetCheck(hItem))
{
UnCheckChildItems(hItem);
}
// 해당 아이템이 체크되어 있지 않다면
else
{
CheckChildItems(hItem);
}
}
}
[/cpp]
[cpp]
//
//
// 입력받은 트리아이템의 자식아이템들을 모두 체크한다.
//
void [CMainClass]::CheckChildItems(HTREEITEM hItem)
{
HTREEITEM hChildItem = m_ctrlTree.GetChildItem(hItem);
while (hChildItem != NULL)
{
m_ctrlTree.SetCheck(hChildItem, TRUE);
if (m_ctrlTree.ItemHasChildren(hChildItem))
{
CheckChildItems(hChildItem);
}
hChildItem = m_ctrlTree.GetNextItem(hChildItem, TVGN_NEXT);
}
}
[/cpp]
[cpp]
//
//
// 입력받은 트리아이템의 자식아이템들을 모두 체크 해제한다.
//
void [CMainClass]::UnCheckChildItems(HTREEITEM hItem)
{
HTREEITEM hChildItem = m_ctrlTree.GetChildItem(hItem);
while (hChildItem != NULL)
{
m_ctrlTree.SetCheck(hChildItem, FALSE);
if (m_ctrlTree.ItemHasChildren(hChildItem))
{
UnCheckChildItems(hChildItem);
}
hChildItem = m_ctrlTree.GetNextItem(hChildItem, TVGN_NEXT);
}
}
[/cpp]