Можно ли создать подокно, которое не будет деактивировать родителя? - PullRequest
2 голосов
/ 20 мая 2010

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

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

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

Спасибо

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

Ответы [ 4 ]

3 голосов
/ 21 мая 2010

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

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

0 голосов
/ 21 мая 2010

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

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

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

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

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

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

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

0 голосов
/ 21 мая 2010

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

0 голосов
/ 21 мая 2010

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

...