фокус потерян после двойного щелчка в виде дерева - PullRequest
2 голосов
/ 01 ноября 2019

Мы используем в нескольких местах CTreeCtrl (TreeView) и принимаем двойной щелчок для открытия диалогов, связанных с узлом двойного щелчка.

Открытое диалоговое окно теряет фокус после открытия, так как древовидное представление кажетсязаставить быть сфокусированным в конце обработки двойного щелчка.

Наш сценарий:

  1. пользователь дважды щелкает по узлу
  2. дерево фокусируется ивыбирает элемент в своем дереве
  3. дерево, содержащее окно, получает уведомление NM_DBLCLK для дерева и реагирует на двойной щелчок, открывая диалоговое окно или дочернее окно MDI в нашей среде MDI
  4. открытое диалоговое окно / дочернее окно MDI фокусируется после открытия
  5. представление дерева снова фокусируется

Даже если мы используем в (3) (обработчик уведомлений) возвращаемое поле результатаненулевое значение для предотвращения обработки по умолчанию, (5) происходит, и древовидное представление снова фокусируется, элемент снова выбирается.

Буду очень признателен за подсказку о способе решения этой проблемы, поскольку очень раздражает, что только что открытое диалоговое окно или окно теряет фокус сразу после открытия.

Заранее спасибо!

1 Ответ

2 голосов
/ 02 ноября 2019

Такое поведение не произойдет, если вы создадите модальное диалоговое окно, потому что родительское окно немедленно отключается и диалог получает фокус. Но в диалоговом окне без режима может возникнуть мерцание, и диалоговое окно теряет фокус.

Для диалогового окна без режима используйте 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;
}
...