Создание нескольких диалогов MFC через COM, странное поведение - PullRequest
0 голосов
/ 28 апреля 2010

Обновлено: см. этот другой поток . Вместо этого все эти COM-компоненты не являются частью проблемы.


Одно из наших приложений имеет интерфейс COM, который запускает диалоговое окно, например:

STDMETHODIMP CSomeClass::LaunchDialog(BSTR TextToDisplay)
{
  CDialog *pDlg = new CSomeDialog(TextToDisplay);
  pDlg->BringWindowToTop();
}

По какой-то причине, когда COM-метод вызывается сервером несколько раз одновременно, мы получаем странное поведение:

  • Мы получаем несколько диалогов, но только одна запись на панели задач
  • Диалоговый Z-порядок основан на созданном порядке и не может быть изменен ... первый созданный диалог всегда отображается под вторым, 2-й под 3-м и т. Д., Даже если вы перетаскиваете их
  • если было создано N диалогов, закрытие одного из них закрывает его, а все остальные создаются впоследствии. например, если 5 диалоговых окон создано, и вы закрываете третий, # 3, # 4, # 5 все закрываются.

Это похоже на то, что диалоги - это братья и сестры, но я не вижу ничего странного. Возможно, это связано с COM, или это странная проблема MFC / Win32?

EDIT: если метод интерфейса вызывается несколько раз по отдельности, он работает как положено. Только когда серверный компонент отправляет несколько через один раз, он, кажется, портит. Может быть виноваты потоки / тайминги?

EDIT2: Я поставил этот вход в систему:

std::stringstream ss;
HWND self = dlg->m_hWnd;
HWND parent = dlg->GetParent() ? dlg->GetParent()->m_hWnd : 0;
ss<<"Dlg created'. HWND = "<<self<<", Parent = "<<parent<<std::endl;
OutputDebugString(ss.str().c_str());

Это дало:

  • Dlg создан. HWND = 0013014A, родитель = 00000000
  • Dlg создан. HWND = 001B0390, родитель = 0013014A
  • Dlg создан. HWND = 000B03B0, родитель = 001B0390

Очевидно, что проблема 1039 * состоит в том, что диалоги становятся дочерними элементами друг для друга. Но вопрос , ПОЧЕМУ ?! Кажется, Windows делает это автоматически ...

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

1 Ответ

0 голосов
/ 28 апреля 2010

Звучит так, будто первое диалоговое окно установлено как владелец второго, а второе - как владелец третьего. Можете ли вы изменить инициализацию диалога, чтобы явно указать владельца окна? Есть ли окно, которое имеет смысл назначать? Возможно, окно рабочего стола, если все они предназначены для верхнего уровня?

Если вы хотите иметь доступ ко всем трем (или более), то они должны быть немодальными. Попробуйте использовать Create(CSomeClass::IDD, CWnd::GetDesktopWindow()), и вы должны увидеть родственные диалоги, все из которых отображаются на панели задач.

...