双击树状视图后失去焦点

时间:2019-11-01 13:11:42

标签: c++ windows mfc treeview

我们在几处使用CTreeCtrl(TreeView)并接受双击以打开与双击节点有关的对话框。

打开的对话框在打开后会失去焦点,因为树形视图似乎会在双击处理结束时强制聚焦。

我们的情况:

  1. 用户双击节点
  2. 树形视图获得焦点并在其树形结构中选择一个项目
  3. 包含树视图的窗口会收到该树视图的NM_DBLCLK通知,并通过在我们的MDI环境中打开对话框或MDI子窗口来对双击做出反应
  4. 打开的对话框/ MDI子窗口在打开后变得焦点
  5. 树状视图再次聚焦

即使我们在(3)(通知处理程序)中使用结果字段返回非零值来防止其余的默认处理,(5)也会发生,并且树视图再次获得焦点,再次选择该项目。

我非常感谢有任何解决此问题的方法的提示,因为它确实很烦人,刚打开的对话框或窗口在打开后立即失去了焦点。

谢谢!

1 个答案:

答案 0 :(得分:2)

如果创建模式对话框,则不会发生此行为,因为父窗口将立即被禁用,并且对话框将获得焦点。但是在无模式对话框中,可能会出现闪烁,并且对话框失去焦点。

对于无模式对话框,请使用PostMessageSetTimer,以便在处理TreeView消息后打开无模式对话框。示例:

#define WM_USER_MSG1 WM_USER + 1

BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
    ON_MESSAGE(WM_USER_MSG1, create_dialog)
    ...
END_MESSAGE_MAP()

void CMyWnd::OnDblClick(NMHDR*, LRESULT* pResult)
{
    PostMessage(WM_USER_MSG1, 0, 0);
    *pResult = 0;
}

LRESULT CMyWnd::create_dialog(WPARAM, LPARAM)
{
    if(!m_dlg.GetSafeHwnd())
        m_dlg.Create(IDD_DIALOG_X, this);
    m_dlg.ShowWindow(SW_SHOW);
    return 0;
}