本来认为 CTreeCtrl类 在ASCII环境下与在UNICODE环境下略有不同 但现在发现我错了,两者还是相同的
2011-08-23 15:40
162 查看
我在把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环境下代码:
unicode环境下的代码
注: 原来理解错了 , 两者并没有不同
而是,我将自己的程序加到别人的程序中时出现的问题
现在才发现错误原因: 别人的程序响应了OnTvnSelchanged 消息 ,而且那个消息处理函数中调用了 ctrl.Expand(hParentItem,TVE_EXPAND);
,一开始没注意,害得我还以为是两者环境下 CTreeCtrl运行机制不同呢
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运行机制不同呢
相关文章推荐
- Interview Q&A - 有十二个乒乓球形状、大小相同,其中只有一个重量与其它十一个不同,现在要求用一部没有砝码的天秤称三次,将那个重量异常的球找出来,并且要得出它比其它十一个球较重还是较轻
- 经过多次强攻之后,赫柏带领的军团不仅没能击败鲁卡斯,反而被鲁卡斯打得七零八落,赫柏终于体会到了高阶天之驱逐者的强大实力。 不过,赫柏最终还是找到了鲁卡斯的致命弱点,他发现鲁卡斯喜欢收集上古卷轴,因为上古卷轴能够让鲁卡斯获得神秘之力。 卢卡斯决定使用上古卷轴将卢卡斯引诱到绝域之门,利用绝域之门的力量消灭卢卡斯。 赫柏注意到卢卡斯喜欢收集不同的卷轴,如果总是捡到相同的上古卷轴,它的兴趣就会逐渐降低。
- 有十二个球,大小形状相同。其中一个重量与其他十一个不同,现在要求用一没有砝码的天平称三次找出那个球,并确定特殊球是轻还是重
- 查看字符串在不同编码(ASCII、Unicode、UTF7、UTF8、Default、BigEndianUnicode)下的 Hex
- leetcode之两个数组元素相同还是不同
- API入门系列之二——Unicode还是ASCII
- 算法--MD5--如何保证MD5加密结果在不同的环境下都相同
- 以前也有过楼主这个阶段,工作两年感觉前端不过如此,不过后来还是逐渐突破了。尤其是使用了angularJS后。 现在转去做C++开发,对比后发现前端实在是太简单了,别喷我,个人想法,当初也是觉得JS水
- ANSI,ASCII,Unicode,UTF-8的区别。自认为写得最好的一篇
- unicode和ASCII两种字符环境的区别
- Java md5加密 控制台传入与web传入参数 结果不匹配 || 相同字符串加密结果不同,如何保证JAVA MD5加密结果在不同的环境下都相同
- API入门系列之二 -Unicode还是ASCII
- 尽管是一个CS专业的学生,小B的数学基础很好并对数值计算有着特别的兴趣,喜欢用计算机程序来解决数学问题。现在,她正在玩一个数值变换的游戏。她发现计算机中经常用不同的进制表示同一个数,如十进制数123表达为16进制时只包含两位数7、11(B),用八进制表示时为三位数1、7、3。按不同进制表达时,各个位数的和也不同,如上述例子中十六进制和八进制中各位数的和分别是18和11。
- API入门系列之二 -Unicode还是ASCII
- Unicode与Ascii,感觉还是Unicode强大
- 12个球,外形相同,其中有一个球重量与其余11球不同,如何使用天平尽量少次数的测量找出这个小球且判别它比正常球轻还是重
- Eclipse现在越来越恶心了,会做自认为聪明事,如果发现项目依赖jar包所在的其它项目在同一workspace,会自动加入项目依赖,于是各种坑出来了,发现好多次了。
- 查看字符串在不同编码(ASCII、Unicode、UTF7、UTF8、Default、BigEndianUnicode)下的 Hex
- API入门系列之二 -Unicode还是ASCII
- AndroidManifest占位符(实现根据正式还是测试环境设置不同的app名称)