Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > модальное окно для двух владельцев, как делать?


Автор: victor79 26.3.2010, 21:33
есть в моей программе два независимых окна,  и на панели пуска по ним отображается две иконки.
По нажатию кнопки на одном из окон всплывает модальное окошко, привязанное к тому окну, на котором нажали.
И вот хочу я сделать так, что бы оно было модальным для обоих окон. Для этого второе окно я блокирую - EnableWindow(hwnd, 0)
Но остаются следующие проблемы.
1. Если щелкнуть по иконке на панели пуска другого окна (которое EnableWindow(hwnd, 0)), то оно все же активизируется,
  мне приходится на событии WM_ACTIVATE делать SetActiveWindow(hModalWindow). Но иконка на панели пуска не хочет пережиматься на ту, которая для первого окна.
2. И есть ли какая нибудь функция, что бы при этом заголовок модального окна помигал, так же как если я щелкаю по владельцу модального окна?

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

модальное окно крутит свой цикл обработки сообщений и в главный цикл возвращает управление только по закрытию
  (получается что-то вроде как если вызывать MessageBox, только окна свои вместо мессаджа)

делаю на mingw и никаких visual классов неиспользую - только винапи.

Автор: BEOWOLF 28.3.2010, 03:40
Вообще иерархия окон - строгое дерево, так что двух родителей одновременно быть не может. Но зато их можно переназначить. Так что можно попробовать вот такой вариант - написать допустим в классе статический HWND hdlgModal этого модального диалога, или глобалный HWND hdlgModal, и когда приходит WM_ACTIVATE на какое-нибудь окно в панели задач, то пишешь в процедуре там 
Код

case WM_ACTIVATE:
  if (wParam && IsWindow(hdlgModal)) SetParent(hdlgModal, hWnd);
  ...
  break;

Автор: victor79 28.3.2010, 11:46
Ваш совет навел меня на более совершенную мысль - при событии WM_SETCURSOR lParam = WM_L/RBUTTONDOWN подменяю все hwnd кроме модального на владельца модального - и получается то что нужно - мигает модальное окно, и владелец остается тем же.
Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)