首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

【请问】怎么响应TreeCtrl控件的CheckBox点击事件?

2014-07-09 
【请教】如何响应TreeCtrl控件的CheckBox点击事件??在对话框程序中,如果TreeCtrl控件是静态放上去的,那么可

【请教】如何响应TreeCtrl控件的CheckBox点击事件??
在对话框程序中,如果TreeCtrl控件是静态放上去的,那么可以修改TreeCtrl控件的OnClickTree函数。
现在我正升级一个别人的程序。他用的是单文档切分窗口,左边的部分派生于TreeView,TreeCtrl控件是用GetTreeCtrl获取的。

我想要响应TreeCtrl控件的CheckBox点击事件。
目前试验的一个办法是:

ON_NOTIFY_REFLECT(NM_CLICK, OnClick)

void CLeftView::OnClick(NMHDR* pNMHDR, LRESULT* pResult) 
{
    根据鼠标坐标判断是否点在Tree上
     HitTest
}

afx_msg void OnClick(NMHDR* pNMHDR, LRESULT* pResult);

但这个消息只在点击到树形控件的某个节点时会触发,点击节点左边的CheckBox则没用,试了其他几个消息也没效果。

请问大家,在这种情况下想要响应CheckBox点击事件,该如何做
[解决办法]
vs2008sp1的那个点击check框可以,看看它是怎么实现的
[解决办法]
我看了下,他是对dockpannel响应的nmclick,不是对treectrl和view
[解决办法]
响应WM_LBUTTONDOWN消息:


void CFolderTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{

SetMsgHandled(FALSE);
UINT uFlags = 0;
HTREEITEM hItem = HitTest(point, &uFlags);

if(!hItem)
return;

if(uFlags&TVHT_ONITEMSTATEICON)
{
        SetMsgHandled(TRUE);
SelectItem(hItem);
if (GetCheckState(hItem)) // 该函数获得是先前节点的选中状态
{
SetItemAndChildrenEmpty(hItem);
SetParentsItemEmpty(hItem);

}
else
{

SetItemAndChildrenFull(hItem);
SetParentsItemFull(hItem);

}


}

}


[解决办法]
引用:
Quote: 引用:

响应WM_LBUTTONDOWN消息:

void CFolderTreeCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{

SetMsgHandled(FALSE);
UINT uFlags = 0;
HTREEITEM hItem = HitTest(point, &uFlags);

if(!hItem)
return;

if(uFlags&TVHT_ONITEMSTATEICON)
{
        SetMsgHandled(TRUE);
SelectItem(hItem);
if (GetCheckState(hItem)) // 该函数获得是先前节点的选中状态
{
SetItemAndChildrenEmpty(hItem);
SetParentsItemEmpty(hItem);

}
else
{

SetItemAndChildrenFull(hItem);
SetParentsItemFull(hItem);

}


}

}


我的是TreeView,不是放在对话框上的静态TreeCtrl


道理一样
[解决办法]
在 OnClick中 HitTest检测

void CSDITreeView::OnClick(NMHDR* pNMHDR, LRESULT* pResult) 
{
  // TODO: Add your control notification handler code here
  CTreeCtrl &treeCtrl = GetTreeCtrl();

  TVHITTESTINFO tvInfo = { 0 };
  //tvInfo.pt = pNMTreeView->ptDrag;
  DWORD pos = GetMessagePos();
  tvInfo.pt.x = LOWORD(pos);
  tvInfo.pt.y = HIWORD(pos);
  ScreenToClient(&tvInfo.pt);    
  
  HTREEITEM hIT = treeCtrl.HitTest(&tvInfo);
  if(hIT && (tvInfo.flags & TVHT_ONITEM) )
  {        
    BOOL bChecked = treeCtrl.GetCheck(hIT);
    if(bChecked)
    {

    }
  }

  *pResult = 0;
}

热点排行