CTreeCtrl的一个小技巧

前两天从网上(http://www.techsoft.no/bendik/)下载了一个CTreeCtrl得一个继承类,可以实现多选功能,不过有一个小问题,就是多选右键弹出菜单后,多选的的item显示出了问题:对着其中的一个selected item右键,会发现最后选中的那个item的选中状态(蓝色背景)没有了,感觉很奇怪,并且发现该项还在选中的列表中。于是跟踪一下(一上午)。发现了一个小窍门可以解决此问题:

利用itemTVIS_DROPHILITED状态,具体代码如下:

 

     vector<HTREEITEM> vcItems;

         HTREEITEM hSelItem = pTreeCtrl->GetFirstSelectedItem();

         while(hSelItem)

         {

              vcItems.push_back(hSelItem);

              hSelItem = pTreeCtrl->GetNextSelectedItem(hSelItem);

         }

 

         for(vector<HTREEITEM>::iterator it = vcItems.begin(); it != vcItems.end(); ++it)

         {

              pTreeCtrl->SetItemState(*it, TVIS_DROPHILITED, TVIS_DROPHILITED);

         }   

 

         menu.TrackPopupMenu(TPM_LEFTALIGN, ptHere.x, ptHere.y, m_pParentWnd);

 

         for(vector<HTREEITEM>::iterator it = vcItems.begin(); it != vcItems.end(); ++it)

         {

              pTreeCtrl->SetItemState(*it, ~TVIS_DROPHILITED, TVIS_DROPHILITED);

         }   

 

在要弹出菜单前,先记录所有的item state, 然后设置TVIS_DROPHILITED状态,然后在弹出菜单后复原即可。

这里的弹出菜单,如果换成弹出dialogbox也会有类似问题。解决方法同上代码。

 

总结:这里没有什么技巧可言,就是觉得这个问题应该能够解决,测试了半天终于搞定了,验证了那句老话,坚持就是胜利。

你可能感兴趣的:(测试,iterator)