本来认为 CTreeCtrl类 在ASCII环境下与在UNICODE环境下略有不同 但现在发现我错了,两者还是相同的

 

    我在把asc转换为UNICODE过程中,发现树控件的消息触发略有些不同

   

    TVN_ITEMEXPANDING 和 TVN_ITEMEXPANDED 消息 在节点第一次调用Expand时触发 ,触发后,为该节点设置TVIS_EXPANDEDONCE 状态

    但是,在实验中我发现,UNICODE环境下,SelectItem(htree) 也会触发该消息,而在ASC环境中,SelectItem则不会触发

    而且:

    在UNICODE环境中,要收缩某节点时,必须先用SelectItem选择改节点后,才能收缩

 

 

    在ASC环境中,第一次调用Expand时,首先触发消息TVN_ITEMEXPANDING 和 TVN_ITEMEXPANDED 消息,然后设置TVIS_EXPANDEDONCE 状态,最后扩展根据参数扩展或收缩改节点

 

   在UNICODE环境中,第一次调用Expand时,首先触发消息TVN_ITEMEXPANDING 和 TVN_ITEMEXPANDED 消息,然后设置TVIS_EXPANDEDONCE 状态,但是到此为止了。他并不扩展或收缩改节点,而是必须再次调用Expand才可以

 

   不知道,是不是VS2005的BUG所致,还是什么其他原因,实在是奇怪

 

  ASC环境下代码:

 

 

void CLeftView::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO: 在此添加控件通知处理程序代码
 
	CshowImageDoc *pDoc=GetDocument();
	CPoint pt;
	pt=GetCurrentMessage()->pt;
	GetTreeCtrl().ScreenToClient(&pt);
	UINT uFlag = 0;
	HTREEITEM hCurSel = GetTreeCtrl().GetSelectedItem();
	HTREEITEM hItem = GetTreeCtrl().HitTest(pt, &uFlag);
	if(hItem)
	{
		if(hCurSel != hItem)
		{
			GetTreeCtrl().SelectItem(hItem);
		}
			
		GetTreeCtrl().Expand(hItem,TVE_TOGGLE);
	    pDoc->ModifyIcon(hItem);	
	}  
}

 

 

unicode环境下的代码

void CUnicodeTree::OnNMClick(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO: 在此添加控件通知处理程序代码
	*pResult = 0;
	CMagazineEditDoc *pDoc=GetDocument();
	CPoint pt;
	pt=GetCurrentMessage()->pt;
	GetTreeCtrl().ScreenToClient(&pt);
	UINT uFlag = 0;
	HTREEITEM hCurSel = GetTreeCtrl().GetSelectedItem();
	HTREEITEM hItem = GetTreeCtrl().HitTest(pt, &uFlag);
	if(hItem)
	{
        if ((GetTreeCtrl().GetItemState(hItem,TVIS_EXPANDEDONCE )&TVIS_EXPANDEDONCE )!=0 ) //判断是否扩展过一次,若是直接调用EXPAND
		{

			GetTreeCtrl().SelectItem(hItem); //收缩节点时,必须先选择改节点
			GetTreeCtrl().Expand(hItem,TVE_TOGGLE);
		}
		else{ // 若该节点还未扩展过,首先利用第一个Expand触发TvnItemexpanding消息,然后利用第二个Expand将其扩展
			GetTreeCtrl().Expand(hItem,TVE_TOGGLE);
			GetTreeCtrl().Expand(hItem,TVE_TOGGLE);
		}
		if(hCurSel != hItem)
		{
			GetTreeCtrl().SelectItem(hItem); //将选择放在最后 ,否则 若是第一次展开时, 遇到选择SelectItem 也会触发TvnItemexpanding消息
		}
		pDoc->ModifyIcon(hItem);
	}
}

 

 

注: 原来理解错了 ,  两者并没有不同

 

而是,我将自己的程序加到别人的程序中时出现的问题

现在才发现错误原因: 别人的程序响应了OnTvnSelchanged 消息 ,而且那个消息处理函数中调用了  ctrl.Expand(hParentItem,TVE_EXPAND);
,一开始没注意,害得我还以为是两者环境下 CTreeCtrl运行机制不同呢

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清水迎朝阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值