C++ MFC)使TreeCtrl失去其项目焦点

C++ MFC)使TreeCtrl失去其项目焦点,c++,mfc,C++,Mfc,我使用TVN_SELCHANGED消息来了解用户在项目树(菜单)中选择了什么 但是,如果用户持续单击同一项,则不会出现该消息 我希望treeCtrl因发生TVN_SELCHANGED而丢失其项目选择。 (换句话说,即使用户连续单击同一项,我也希望使事件发生) 我该怎么做呢?TVN\u SELCHANGE不会有帮助。未更改任何内容,因此不会发送通知。甚至对我来说也没有意义。如果用户单击已选择的项目,UI应该做什么?没有什么。。。我猜 如果你想处理这件事,你必须自己做 您可以使用WM_LBUTTO

我使用TVN_SELCHANGED消息来了解用户在项目树(菜单)中选择了什么

但是,如果用户持续单击同一项,则不会出现该消息

我希望treeCtrl因发生TVN_SELCHANGED而丢失其项目选择。 (换句话说,即使用户连续单击同一项,我也希望使事件发生)


我该怎么做呢?

TVN\u SELCHANGE不会有帮助。未更改任何内容,因此不会发送通知。甚至对我来说也没有意义。如果用户单击已选择的项目,UI应该做什么?没有什么。。。我猜

如果你想处理这件事,你必须自己做

  • 您可以使用WM_LBUTTONDOWN或NM_CLICK来跟踪单击
  • 然后使用TVM_HITTEST检查用户单击的内容
  • 现在您可以比较当前选择(TVM_GETNEXTITEM并检查TVGN_插入符号)
  • 比较新旧选择
  • 毕竟,将单击传递给默认处理程序

选择项目时,TreeCtrl唯一收到通知的时间是:TVN\u SELCHANGE。如果选择了相同的选项,这将没有帮助。但还有另一种方法可以得到通知。 在使用TreeCtrl的对话框类中添加PreTranslateMessage命令,并添加下面编写的代码

//---------------------------------------------------------------------------

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子类化