树控件的节点单选的问题?

redjuly 2005-10-11 01:40:02
加载一了一棵树以后,用如下代码实现节点的单选,但是发现如果在上下两个节点之间快速钩选的时候,出现两个节点同时被选上。原因在哪里呢?

首先添加树控件消息
ON_NOTIFY(NM_CLICK, IDC_TREE, OnClickTree)

实现函数为
void CMyDlg::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult)
{
UINT uFlags=0;
CPoint point = GetCurrentMessage()->pt;
m_treeCtrl.ScreenToClient(&point);
HTREEITEM hItem = m_treeCtrl.HitTest(point, &uFlags);

if (hItem!=NULL)
{
m_treeCtrl.SelectItem(hItem);
if(uFlags&TVHT_ONITEMSTATEICON)
{
if(m_hCheckedItem != NULL && m_hCheckedItem != hItem )
m_treeCtrl.SetCheck(m_hCheckedItem, FALSE);
m_hCheckedItem = hItem;
}
}
*pResult = 0;
}
// hCheckedItem 初始化为NULL
...全文
293 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
redjuly 2005-10-13
  • 打赏
  • 举报
回复
作了折中处理
最后在得到选中的item数组的时候做了判断
如果超过两个给出提示就是了
结了,谢谢各位
zxyjyzxyjy 2005-10-12
  • 打赏
  • 举报
回复
找到原因了,不就解决了,重新刷新一下不就行了,不过每次都刷新真不是味。
redjuly 2005-10-12
  • 打赏
  • 举报
回复
可惜 treectrl 没有 cleck_changeed 的消息,否则就知道系统到底是选中了哪个item了
redjuly 2005-10-12
  • 打赏
  • 举报
回复
点击的速度一定要快
最好在两个 checkbox 之间快速点击
分析了一下可能是下面的情况,假设情况发生在两个box分别为 A和B的,发生两次
间隔时间和位置相差很短的点击
1) 初始:A not checked,B checked
2)  第一次点击:点击在 A、B的中间,此时程序通过 hittest 判断选中了 A, 所以将 B unchecked B  ,
但系统内部认为我们点击的是 B,而此时B已经被Unchecked了,所以退出 click
函数的时候,B重新被系统check起来,不过此时,我们已经把 m_hCheckedItem
标记为 A 了,这样B的信息便丢失了.
3) 第二个点击:正常的电击 A,此时 A 为 m_hCheckedItem 同时没有被选中
将A选中

上面都是我的猜测.
goodboyws 2005-10-12
  • 打赏
  • 举报
回复
奇怪,我一直没发现你的问题,按说应该不会这样
redjuly 2005-10-12
  • 打赏
  • 举报
回复
赫赫,刷新也不行啊。
不知道什么原因了。

redjuly 2005-10-11
  • 打赏
  • 举报
回复
有可能是界面刷新的问题
那个 m_treeCtrl.SetCheck(m_hCheckedItem, FALSE);
执行过了,但是界面上没有改变
SAM2002 2005-10-11
  • 打赏
  • 举报
回复
周星星
goodboyws 2005-10-11
  • 打赏
  • 举报
回复
刚才做了个demo,真没发现你的问题,可能我反映不够快吧
======================
感觉当鼠标在上下两个checkbox之间的时候,会选择一个checkbox是有点问题
=====================
不是这个问题
zxyjyzxyjy 2005-10-11
  • 打赏
  • 举报
回复
看了你的代码了,知道这个问题,应该出在HTREEITEM hItem = m_treeCtrl.HitTest(point, &uFlags);语句上了,你在if (hItem!=NULL)
{
这里测试一下,如果点击很快每次都进入了这个语句块的话,你在
m_treeCtrl.SelectItem(hItem);后面再加上这样一句m_treeCtrl.HitTest(point, &uFlags);来测试。

如果没时这个语句块的话,那找到问题的原因就有办法解决。
redjuly 2005-10-11
  • 打赏
  • 举报
回复
to zxyjyzxyjy(星星):
去掉 if(uFlags&TVHT_ONITEMSTATEICON) 也没有用的
如果是速度很慢的去点击,用我的代码完全没有问题的
问题在于快速的点击鼠标
就会出现相邻的两个同时被选上了

demo很简单
您可以试一试建一个 dialog based的工程试试看
一定要在相邻两个checkbox快速的点击

zxyjyzxyjy 2005-10-11
  • 打赏
  • 举报
回复
意思就成为只要你选一个项目,则打上V,另一个取消它。
zxyjyzxyjy 2005-10-11
  • 打赏
  • 举报
回复
实在不行,你把那个条件去掉,不要
if(uFlags&TVHT_ONITEMSTATEICON)
redjuly 2005-10-11
  • 打赏
  • 举报
回复
也有可能和双击操作混在一起了也有关
redjuly 2005-10-11
  • 打赏
  • 举报
回复
感觉当鼠标在上下两个checkbox之间的时候,会选择一个checkbox是有点问题
redjuly 2005-10-11
  • 打赏
  • 举报
回复
to zxyjyzxyjy(星星) :
thx
but the same ,no good ......
zxyjyzxyjy 2005-10-11
  • 打赏
  • 举报
回复
或者改为
if( uFlags & (TVHT_ONITEMSTATEICON|TVHT_TOLEFT))试试
zxyjyzxyjy 2005-10-11
  • 打赏
  • 举报
回复

if(uFlags&TVHT_ONITEMSTATEICON)
改为
if(uFlags&TVHT_ONITEM
试试
redjuly 2005-10-11
  • 打赏
  • 举报
回复
刚才忘记把前面的ONCLICK 的代码屏蔽了
tvn_selchange应该不能起作用的吧?
因为我要操作的对象是treeitem前面的checkbox
而我试了一下 checkbox 的选择不会激发 tvn_selchange消息
redjuly 2005-10-11
  • 打赏
  • 举报
回复
试了一下,在 TVN_SELCHANGED的响应函数里面什么都没有加
还是会在上下两个选择框快速点击时候
出现两个框同时被选中的问题
怀疑是不是mfc的类库有bug
加载更多回复(1)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧