// CTreeCtrl *m_fileTreeCtrl is a member of CDemoTreeDlg dialog.
// CDemoTreeDlg dialog will handle the TVN_KEYDOWN and NM_CLICK messages
BEGIN_MESSAGE_MAP(CDemoTreeDlg, CDialog)
ON_MESSAGE(TREE_VIEW_CHECK_STATE_CHANGE, OnTreeViewCheckStateChange)
ON_NOTIFY(NM_CLICK, IDC_FILESYS_TREE, &CDemoTreeDlg::OnNMClickFileSysTree)
ON_NOTIFY(TVN_KEYDOWN, IDC_FILESYS_TREE, &CDemoTreeDlg::OnTvnKeydownFileSysTree)
END_MESSAGE_MAP()
// handle mouse click on check box
void CDemoTreeDlg::OnNMClickFileSysTree(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: Add your control notification handler code here
HTREEITEM item;
UINT flags;
// verify that we have a mouse click in the check box area
DWORD pos = GetMessagePos();
CPoint point(LOWORD(pos), HIWORD(pos));
m_fileTreeCtrl->ScreenToClient(&point);
item = m_fileTreeCtrl->HitTest(point, &flags);
if(item && (flags & TVHT_ONITEMSTATEICON))
{
// handle state change here or post message to another handler
// Post message state has changed…
// PostMessage(TREE_VIEW_CHECK_STATE_CHANGE,0,(LPARAM)item);
}
*pResult = 0;
}
// handle key press on check box
void CDemoTreeDlg::OnTvnKeydownFileSysTree(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMTVKEYDOWN pTVKeyDown = reinterpret_cast<LPNMTVKEYDOWN>(pNMHDR);
// TODO: Add your control notification handler code here
// we only want to handle the space key press
if(pTVKeyDown->wVKey==VK_SPACE)
{
// Determine the selected tree item.
HTREEITEM item = m_fileTreeCtrl->GetSelectedItem();
if(item!=NULL)
{
// handle state change here or post message to another handler
// Post message state has changed…
// PostMessage(TREE_VIEW_CHECK_STATE_CHANGE,0,(LPARAM)item);
}
}
*pResult = 0;
}
In many cases it is better to handle the check box change in a central place after the change. To do this we can define a custom message that will be called when a check box state has changed:
// define a custom message
#define TREE_VIEW_CHECK_STATE_CHANGE (WM_USER + 100)
// implementation for TREE_VIEW_CHECK_STATE_CHANGE message handler
LRESULT CDemoTreeDlg::OnTreeViewCheckStateChange(WPARAM wParam, LPARAM lParam)
{
// Handle message here…
HTREEITEM changedItem = (HTREEITEM)lParam;
int checkState = m_fileTreeCtrl->GetCheck(changedItem);
// Do something with check state change information…
}