MFC)使TreeCtrl失去其项目焦点

时间:2016-05-22 15:09:04

标签: c++ mfc

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

但是,如果用户不断点击同一项目,则不会发生该消息。

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

我该怎么做?

2 个答案:

答案 0 :(得分:2)

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

如果你想要解决这个问题,你必须自己动手。

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

答案 1 :(得分:1)

当一个项目被选中的TREECTRL将得到通知的唯一情况是:TVN_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.
    

}