2010-05-20 2 views
2

Как правило, при создании вспомогательного окна (WS_POPUP) дочернее окно активируется, и родитель деактивируется. Однако, с меню, оба остаются активными. По крайней мере, я предполагаю, что меню активно, по крайней мере, оно имеет фокус.Возможно ли создать вспомогательное окно, которое не дезактивирует родителя?

Пример: нажмите на меню файла в блокноте, появится меню, но окно блокнота по-прежнему выглядит активным.

Можно ли отразить это поведение либо стилем окна, либо ответом на конкретное сообщение?

Благодаря

Другой пример: Combo коробки, кажется, чтобы показать подокно, пока не дезактивировать окно. И вы можете щелкнуть по этому поднабору, сохранив при этом основное окно активации. Любые идеи о том, как захватить класс/стиль этого окна?

+0

OSK.EXE (на экранной клавиатуре) делает это - хотя и глобально - вы могли бы совать со шпилем ++ –

+0

Определенно, как эта идея. Однако, когда я его пробовал, кажется, что он просто активирует предыдущее окно (то есть: верхнее окно все еще теряет активацию). Я пытаюсь создать что-то, что чувствует себя как меню (но выглядит совершенно иначе), и даже мгновенная ошибка потери активации кажется неправильной. – Bob

ответ

3

Выпадающий список в выпадающем списке - это немного взломанный, это всплывающее окно и дочернее окно, я не могу рекомендовать этот подход (сочетание недокументированных стилей и IIRC, это немного неправильно. с «нормальным» плавающим окном/панелью инструментами)

Это оставляет вас с двумя вариантами:

  • WS_EX_NOACTIVATE (Главное окно будет оставаться активным, плавающее окно не является активным)
  • Handle activate messages (оба окна будут выглядеть активный)
+0

Ваша ссылка выглядит привлекательно. Я думал о том, чтобы спуститься по подножию инструментального окна прошлой ночью, но не понял, что их активация не пришла бесплатно. – Bob

+0

Ваша ссылка была именно то, что мне нужно. Большое спасибо. – Bob

+0

Ссылка переведена на: http://www.catch22.net/tuts/docking-toolbars-part-1 –

0

Я удивлен, что создание нового всплывающего окна активирует его. Обычно вам нужно позвонить SetActiveWindow. Однако проверьте WM_ACTIVATE и WM_NCACTIVATE о том, как остановить деактивацию окна.

+0

Скорее всего, я делаю SW_SHOW, а не SW_SHOWNOACTIVATE. Но при этом у меня есть другие вопросы, если вы не возражаете. Знаете ли вы, если у вас есть фокус в окне, которое не активировано (например: если пользователь начинает использовать клавиатуру, я бы хотел, чтобы вверх/вниз работала так же, как в обычном меню)? Или если вы можете запретить активацию клика? – Bob

+0

Не могу сказать, что я это сделал, но меня интересует, как это получается. Попробуйте использовать Spy ++ и изучите сообщения при отображении меню. –

0

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

Большинство позиционирования и активации/деактивации окна выполняется - в конечном счете - посредством вызова SetWindowPos - который всегда отправляет сообщение WM_WINDOWPOSCHANGING, позволяющее окну иметь последнее слово о том, что происходит.

DefWindowProc также активирует собственное окно в ответ на щелчки мыши и так далее.

Результатом всего этого является то, что вполне возможно создать окна, которые никогда не принимают активацию, - это требует широкого понимания того, какие сообщения и ситуации могли привести к активации.

В конечном итоге я могу сказать, что очень удобно иметь настройку отладки, настроенную для удаленной отладки, - чтобы вы могли взаимодействовать с вашим отладчиком, не влияя на состояние активации системы, - и, следовательно, отбрасывать точку останова в окно в вопросах WM_ACTIVATE и просто отлаживать любую ситуацию, приводящую к нежелательной активации.

Если вы хотите справиться с клавиатурным фокусом, это может быть сложнее - обычно фокус присваивается активированному окну, но опять же его обычно DefWindowProc отвечает за назначение обоих. Я просто вижу, что это опасно, поскольку у меня есть одно окно, все еще очевидно активированное, а другое с фокусом. Это сильно смутит любое вспомогательное программное обеспечение.

У меня возникнет соблазн выполнить сообщение об ошибке уровня сообщения в контуре сообщения - Подобно IsDialogMessage - для фильтрации нажатий клавиш, предназначенных для всплывающего окна.

0

Если вы создаете свое всплывающее окно с помощью WS_EX_NOACTIVATE, оно не будет активировано пользователем (вы все равно можете его активировать программно), и поэтому основное окно приложения останется активным.