【问题标题】:focus lost after double click in tree view在树视图中双击后焦点丢失
【发布时间】:2019-11-02 07:03:45
【问题描述】:

我们在多个地方使用 CTreeCtrl (TreeView) 并接受双击以打开与双击节点相关的对话框。

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

我们的场景:

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

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

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

提前致谢!

【问题讨论】:

  • 您如何“拦截”双击:覆盖OnNotify 或覆盖OnLButtonDblClk?我将后者用于类似的操作(打开一个依赖于节点的对话框),它工作正常。

标签: c++ windows mfc treeview


【解决方案1】:

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

对于无模式对话框,使用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;
}

【讨论】:

  • 非常感谢!你的消息方法就是这么简单,我有点嫉妒了……? 不拦截默认处理,而是通过 PostMessage 在顶部添加自己的处理是一个好方法!
猜你喜欢
  • 2013-11-19
  • 2023-04-10
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多