WS_EX_TRANSPARENT - Что это на самом деле делает? - PullRequest
3 голосов
/ 29 мая 2011

В моем проекте я создаю форму с непрозрачностью, контролируемой пользователем.Если форма была полностью прозрачной, события мыши «проваливались» (без моего вмешательства), иначе моя форма обрабатывала их.

После прочтения этого вопроса и переопределения свойства CreateParams, чтобы установить флаг WS_EX_TRANSPARENT в моей форме, теперь он позволяет проваливать события мыши, когда непрозрачность имеет любое значение <255. </p>

Это именно то, что я хочу, но меня беспокоит то, что я не понимаю, почему это работает.

Из того, что я прочитал, WS_EX_TRANSPARENT предназначен для того, чтобы сделать форму прозрачной с помощью 'кража битов из формы под ним в методе Paint, поэтому:

  1. Метод Paint моей формы и все элементы управления в нем никогда не должны вызываться, верно?Поскольку WS_EX_TRANSPARENT должен заставить Windows переопределять их, так почему это влияет на обработку ввода, а не на отрисовку моей формы?

  2. Непрозрачность не должна влиять на обработку событий мыши, так какесли переопределяется Paint, «локальная» непрозрачность не должна иметь значения, нет?

Может кто-нибудь объяснить, что делает этот флаг на самом деле ?Как это работает?

Ответы [ 2 ]

4 голосов
/ 29 мая 2011

WS_EX_TRANSPARENT заставляет ваши события (например, щелчки мыши) падать через ваше окно, среди прочего. Непрозрачность - это отдельная концепция, она инструктирует оконный менеджер применять alphablending при рисовании вашей формы. Эти две вещи не связаны, но когда вы комбинируете их, вы получаете эффект, который вам нужен в вашем случае.

Итак:

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

  2. Непрозрачность не имеет никакого отношения к событиям мыши, как описано в первом абзаце.

0 голосов
/ 29 мая 2011

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

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

Таким образом, он не только меняет уровень визуального отображения.прозрачность, но это также меняет поведение.Интересно, где бы вы прочитали иначе?

[править]

Разве у Windows в C # просто нет свойства opacity?

...