rt

解决方案 »

  1.   

    不知道为什么,点击父节点子节点不选中
    代码如下:
    void CNavDlg::OnNMClickTree1(NMHDR *pNMHDR, LRESULT *pResult)
    {
    // TODO: 在此添加控件通知处理程序代码
    NM_TREEVIEW* pHdr = (NM_TREEVIEW*)pNMHDR;
    *pResult = 0;
    CPoint point;
    UINT uFlag;
    GetCursorPos(&point);
    ScreenToClient(&point); HTREEITEM item = m_mytree.HitTest(point, &uFlag);
    if((item) && (TVHT_ONITEMSTATEICON & uFlag))   
    {   
    BOOL bCheck = m_mytree.GetCheck(item);
    SetItemCheckState(item, !bCheck);
    }   
    }void CNavDlg::SetItemCheckState(HTREEITEM item, BOOL bCheck)
    {
    SetChildCheck(item, bCheck);
    SetParentCheck(item, bCheck);
    }
    void CNavDlg::SetChildCheck(HTREEITEM item, BOOL bCheck)
    {
    HTREEITEM child = m_mytree.GetChildItem(item);
    while(child)
    {
    m_mytree.SetCheck(child, bCheck);
    SetChildCheck(child, bCheck);
    child = m_mytree.GetNextItem(child, TVGN_NEXT);
    }
    }
    void CNavDlg::SetParentCheck(HTREEITEM item, BOOL bCheck)
    {
    HTREEITEM parent = m_mytree.GetParentItem(item);
    if(parent == NULL)
    return; if(bCheck)
    m_mytree.SetCheck(parent, bCheck);
    else
    {
    HTREEITEM bro = m_mytree.GetNextItem(item, TVGN_NEXT);
    BOOL bFlag = false;
    while(bro)
    {
    if(m_mytree.GetCheck(bro))
    {
    bFlag = true;
    break;
    }
    bro = m_mytree.GetNextItem(bro, TVGN_NEXT);
    }
    if(!bFlag)
    {
    bro = m_mytree.GetNextItem(item, TVGN_PREVIOUS);
    while(bro)
    {
    if(m_mytree.GetCheck(bro))
    {
    bFlag = true;
    break;
    }
    bro = m_mytree.GetNextItem(bro, TVGN_PREVIOUS);
    }
    }
    if(!bFlag)
    m_mytree.SetCheck(parent, false);
    }
    SetParentCheck(parent, bCheck);
    }
      

  2.   

    有进到SetItemCheckState()里面吗?