C++ MFC)使TreeCtrl失去其项目焦点
我使用TVN_SELCHANGED消息来了解用户在项目树(菜单)中选择了什么 但是,如果用户持续单击同一项,则不会出现该消息 我希望treeCtrl因发生TVN_SELCHANGED而丢失其项目选择。 (换句话说,即使用户连续单击同一项,我也希望使事件发生)C++ MFC)使TreeCtrl失去其项目焦点,c++,mfc,C++,Mfc,我使用TVN_SELCHANGED消息来了解用户在项目树(菜单)中选择了什么 但是,如果用户持续单击同一项,则不会出现该消息 我希望treeCtrl因发生TVN_SELCHANGED而丢失其项目选择。 (换句话说,即使用户连续单击同一项,我也希望使事件发生) 我该怎么做呢?TVN\u SELCHANGE不会有帮助。未更改任何内容,因此不会发送通知。甚至对我来说也没有意义。如果用户单击已选择的项目,UI应该做什么?没有什么。。。我猜 如果你想处理这件事,你必须自己做 您可以使用WM_LBUTTO
我该怎么做呢?TVN\u SELCHANGE不会有帮助。未更改任何内容,因此不会发送通知。甚至对我来说也没有意义。如果用户单击已选择的项目,UI应该做什么?没有什么。。。我猜 如果你想处理这件事,你必须自己做
- 您可以使用WM_LBUTTONDOWN或NM_CLICK来跟踪单击李>
- 然后使用TVM_HITTEST检查用户单击的内容李>
- 现在您可以比较当前选择(TVM_GETNEXTITEM并检查TVGN_插入符号)
- 比较新旧选择李>
- 毕竟,将单击传递给默认处理程序
//---------------------------------------------------------------------------
BOOL MyDlgClass::PreTranslateMessage(MSG* pMsg)
{
UINT msgValue = pMsg->message;
//here I have compared L button down event, you can use any
//mouse/keyboard event that you want to compare.
if (msgValue == WM_LBUTTONDOWN)
{
CPoint point;
point.x = (int)(short)LOWORD(pMsg->lParam);
point.y = (int)(short)HIWORD(pMsg->lParam);
OnLButtonDown(pMsg->message, point);
}
}
void MyDlgClass::OnLButtonDown(UINT nType, CPoint point)
{
UINT uFlags;
HTREEITEM hItem = m_treeCtrl.HitTest(point, &uFlags);
if ((hItem != NULL) && (TVHT_ONITEMBUTTON & uFlags))
{
return;
}
//TVHT_ONITEMBUTTON detects if user has clicked + or - button of tree
//view.
//Add code to perform your operations on hItem.
}
当选择更改时,
TVN_SELCHANGED
将发布到控件的父控件。我想不出一个场景,当选择没有改变时,您需要得到这个通知。为什么你需要得到虚假的TVN\u SELCHANGED
通知,即使没有发生更改?这个问题并不反映你的要求。或者,NM\u单击而不是WM\u LBUTTONDOWN,这样你就不必对CTreeCtrl子类化