在树视图中双击后焦点丢失
focus lost after double click in tree view
我们在几个地方使用 CTreeCtrl (TreeView) 并接受双击以打开与双击节点相关的对话框。
打开的对话框在打开后失去焦点,因为树视图似乎在双击处理结束时强制聚焦。
我们的场景:
- 用户双击一个节点
- 树视图获得焦点并在其树中选择一个项目
- 包含 window 的树视图收到树视图的 NM_DBLCLK 通知,并通过打开对话框或 MDI child window 对双击作出反应我们的 MDI 环境
- 打开的dialog/MDIchildwindow打开后获得焦点
- 树视图再次获得焦点
即使我们在 (3)(通知处理程序)中使用返回非零值的结果字段来阻止其余的默认处理,(5) 发生并且树视图再次获得焦点,选中的项目再次.
我真的很感激任何关于解决这个问题的方法的提示,因为这真的很烦人,一个刚刚打开的对话框或 window 在打开后立即失去焦点。
提前致谢!
如果您创建模态对话框,则不会发生此行为,因为父 window 会立即被禁用并且对话框会获得焦点。但是使用无模式对话框,可能会出现闪烁,对话框失去焦点。
对于无模式对话框,使用PostMessage
或SetTimer
以便在处理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;
}
我们在几个地方使用 CTreeCtrl (TreeView) 并接受双击以打开与双击节点相关的对话框。
打开的对话框在打开后失去焦点,因为树视图似乎在双击处理结束时强制聚焦。
我们的场景:
- 用户双击一个节点
- 树视图获得焦点并在其树中选择一个项目
- 包含 window 的树视图收到树视图的 NM_DBLCLK 通知,并通过打开对话框或 MDI child window 对双击作出反应我们的 MDI 环境
- 打开的dialog/MDIchildwindow打开后获得焦点
- 树视图再次获得焦点
即使我们在 (3)(通知处理程序)中使用返回非零值的结果字段来阻止其余的默认处理,(5) 发生并且树视图再次获得焦点,选中的项目再次.
我真的很感激任何关于解决这个问题的方法的提示,因为这真的很烦人,一个刚刚打开的对话框或 window 在打开后立即失去焦点。
提前致谢!
如果您创建模态对话框,则不会发生此行为,因为父 window 会立即被禁用并且对话框会获得焦点。但是使用无模式对话框,可能会出现闪烁,对话框失去焦点。
对于无模式对话框,使用PostMessage
或SetTimer
以便在处理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;
}