近日工作遇到一个问题,在某个treeview控件中使用键盘的上下箭头按键选择树节点,使到面版右面相应切换到具体的界面时候,发现在某几个节点时会突然丢失焦点,出现了灰色选择条的现象。焦点到底去哪里呢,从表象来看毫无头绪。

正郁闷之制突然想到了vc6.0中附带的一个工具spy++。此工具可以跟踪界面上的任何控件窗体,以及任何与此窗体有关的window消息。而且使用简单。事实胜于雄辩,立即行动。用spy++监视treeview的窗口消息。而且把需要监视的消息设置为全部(晕阿,太多的消息会看傻人的。不过怕有遗漏,所以只好设置全部,后来发现可以只监视wm_killfocus和wm_setfocus两个消息,这可以大大减少检查量)。现在spy++按需求都配置好了,开始工作。立马切换会要监视的treeview控件上,继续选择不同的节点,不多久焦点又丢失了。我马上切换回spy++监视画面,查找良久果然发现了wm_killfocus消息。检查此消息是对哪个窗体发得(得到此窗体的句柄,然后用spy++查找界面上所有控件看是否有此句柄得控件。最后查出此窗口句柄就是treeview右面的面版)。

总结,当treeview中某个节点被选择后,焦点会切换离开treeview到达右面相应出现的面版。怀疑是底层作的好事,这就不多追究了,底层的事情还管阿,还不累死人啊,知道原因就好了。

解决方案,强制把焦点留在treeview上面。哈哈,奈我何阿,见代码
void CUsrManDlg::OnSelchangedTreeUsrman(NMHDR *pNMHDR, LRESULT *pResult)
{

 LPNMTREEVIEW pNMTreeView = reinterpret_cast<LPNMTREEVIEW>(pNMHDR);
 DWORD dwItemId = pNMTreeView->itemNew.lParam;
 ShowSubDlg(dwItemId);

 //由于在treeview里面上下移动的时候,某些节点上会丢失了焦点,原因是焦点跑到右边的版面中得控件上了,所以下面一句代码是强制把焦点流在treeview上。
 m_treeUsrMan.SetFocus();
 
 *pResult = 0;
}







posted on 2006-01-11 11:34 Jeffrey.Coding 阅读(410) 评论(0)  编辑 收藏 引用 所属分类: 技术点

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理