我的Treeview,鼠标点击结点时,为何点不准?我已经知道原因,但我不知道要怎么解决。
选择tree的结点的代码大概如下:
void CFileTreeView::OnLButtonDown(UINT nFlags, CPoint point)
{
UINT position=0;
//得到当前结点的句柄(m_itm)
m_itm=treeFile.HitTest(point,&position);
if(position&TVHT_ONITEM ) //如果点在了选项上,即点在树结点的图标上
{
treeFile.SelectItem(m_itm);//其中m_itm表示当前点击的结点的句柄
DeleteChildItem(m_itm);//当m_itm结点有孩子结点,并处于展开状态时,每次显示时,删除原有子结点的操作
......//下面的操作就是为m_itm添加子结点的操作,并显示出来
......
}
}
上面代码的关键是DeleteChildItem()这个函数,即每次点击m_itm结点时,我要删除掉这个结点的孩子结点(设计要求决定),执行完这个函数后,我要立即为m_itm这个结点添加孩子结点(相当于刷新)。
如果我的tree没有上下的滚动条,上面的代码完全正常。可是当出现上下的滚动条后(展开结点后,子结点可能会比较多,tree会自动添加滚动条)。再执行上面的代码,会出现点击位置不准确的情况,鼠标点击的位置会跑焦点(我想这不太容易用语言表达清楚)
经过测试,我的分析如下:因为删除子结点后,还没等我添加新的子结点,这时上下的滚动条可能会暂时消失(因为删除掉子结点后,可能就不再需要滚动条了,树的客户区大小足以显示所有的结点),通过测试也能知道当前的结点确实是m_itm(假设这个结点的text为"文件夹1"),可是奇怪的是,从界面上看,当前的结点却不是m_itm("文件夹1),而是点在了别处。
怎么解决这个问题呢?谢谢 ~~~