MFC) 使 TreeCtrl 失去其项目焦点

MFC) Making TreeCtrl loses its item focus

本文关键字:项目 焦点 失去 TreeCtrl MFC      更新时间:2023-10-16

我已经使用TVN_SELCHANGED消息来找出用户在项目树(菜单)中选择的内容。

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

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

我该怎么做?

TVN_SELCHANGE无济于事。不会更改任何内容,因此不会发送通知。即使这对我来说也没有意义。如果用户单击已选择的项目,UI 应该怎么做?无。。。我猜。

如果你想处理这个问题,你必须自己做。

  • 您可以使用WM_LBUTTONDOWN或NM_CLICK来跟踪点击。
  • 而不是使用TVM_HITTEST来检查用户单击的内容。
  • 现在您可以比较当前选择(TVM_GETNEXTITEM并检查TVGN_CARET)
  • 比较新旧选择。
  • 毕竟,将单击传递给默认处理程序。

TreeCtrl 在选择项目时收到通知的唯一时间是:TVN_SELCHANGE。如果选择相同,这将无济于事。但是还有另一种方法可以得到通知。在使用 TreeCtrl 的对话框类中添加预翻译消息命令,并添加下面编写的代码。

//---------------------------------------------------------------------------
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.
    
}