我在对话框里加了一个树形列表框控件,选中check boxes属性。响应了鼠标单击事件。想要实现点击列表项时为其加上标记,但结果总是第一次点击时没有反应,在第二次点击(点击任何项)时才把第一次点击的项前加上标记,也就时说总有一个滞后,不知为什么?
代码如下:
void CLineChoise::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult) 
{
// TODO: Add your control notification handler code here
CTreeCtrl * treeCtrl=(CTreeCtrl *)GetDlgItem(IDC_TREE);
HTREEITEM treeitem=treeCtrl->GetSelectedItem();
treeCtrl->SetCheck(treeitem,true);
*pResult = 0;
}

解决方案 »

  1.   

    你的GetSelectedItem得到的是上次的Item,可用下面代码:
    CPoint point;
    GetCursorPos(&point);
    CTreeCtrl * treeCtrl=(CTreeCtrl *)GetDlgItem(IDC_TREE);
    treeCtrl->ScreenToClient(&point);
    HTREEITEM hItem=treeCtrl->HitTest(point);
    treeCtrl->SetCheck(treeitem,true);
      

  2.   

    谢谢wangjinwang!但是,现在我点击项前的加号,标记也会发生变化,这不是我所希望的,该如何解决?另外,现在点击最底项下面的空白区域就会出错退出,该如何解决?多谢!如果该问题解决,该帖愿再加50分!
      

  3.   

    或者
    CTreeCtrl * treeCtrl=(CTreeCtrl *)GetDlgItem(IDC_TREE);CPoint point;
    GetCursorPos(&point);
    CRect lpRect;
    //得到Item的文本区的大小
    BOOL bRet= GetItemRect(hItem, &lpRect, TRUE);//hItem是HTREEITEM ,Item的句柄
    BOOL bRet= lpRect.PtInRect( &point );//判断点的位置是否在Item de text上
    if(bRet)
    {
        treeCtrl->SetCheck(treeitem,true);}