前两天从网上(http://www.techsoft.no/bendik/)下载了一个CTreeCtrl得一个继承类,可以实现多选功能,不过有一个小问题,就是多选右键弹出菜单后,多选的的item显示出了问题:对着其中的一个selected item右键,会发现最后选中的那个item的选中状态(蓝色背景)没有了,感觉很奇怪,并且发现该项还在选中的列表中。于是跟踪一下(一上午)。发现了一个小窍门可以解决此问题:
利用item的TVIS_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也会有类似问题。解决方法同上代码。
总结:这里没有什么技巧可言,就是觉得这个问题应该能够解决,测试了半天终于搞定了,验证了那句老话,坚持就是胜利。