Имеется окно, на нём заданётся прямоугольная область RECT.
Окно должно вести себя так как будто эта область из него "вырезана", но в то
же время является видимой. Все программы расположенные под местом дырки должны вести себя так как будто бы сверху них нет никаких других окон. Т.е. должен корректно отрабатываться ввод мышки, ввод с клавиатуры, установка фокуса, установка вида
курсора и т.д.
У меня есть кое-какие соображения, но они мне пока не очень нравятся. Буду благодарен за любую идею.
P.S: Чистый winapi,работать должно на 2000/XP/2003
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте.
А>Имеется окно, на нём заданётся прямоугольная область RECT. А>Окно должно вести себя так как будто эта область из него "вырезана", но в то А>же время является видимой. Все программы расположенные под местом дырки должны вести себя так как будто бы сверху них нет никаких других окон. Т.е. должен корректно отрабатываться ввод мышки, ввод с клавиатуры, установка фокуса, установка вида А>курсора и т.д.
А>У меня есть кое-какие соображения, но они мне пока не очень нравятся. Буду благодарен за любую идею.
А>P.S: Чистый winapi,работать должно на 2000/XP/2003
см. SetWindowRgn
Используя эту функцию можно создать окно лубой формы с нужным Вам поведением!
Re[2]: Область в окне, прозрачная для сообщений
От:
Аноним
Дата:
17.06.04 07:42
Оценка:
Здравствуйте, kmn, Вы писали:
kmn>см. SetWindowRgn kmn>Используя эту функцию можно создать окно лубой формы с нужным Вам поведением!
Спасибо за быстрый ответ, но это не совсем то что нужно. Я не хочу сделать окно произвольной формы. Мне надо, чтобы внешне в окне не было вырезанной области. Этот RECT должен быть прозрачным только для сообщений, и их должны обрабатывать окна, которые под этим окном.
Здравствуйте, Аноним, Вы писали:
А>Спасибо за быстрый ответ, но это не совсем то что нужно. Я не хочу сделать окно произвольной формы. Мне надо, чтобы внешне в окне не было вырезанной области. Этот RECT должен быть прозрачным только для сообщений, и их должны обрабатывать окна, которые под этим окном.
Здравствуйте, Аноним, Вы писали:
А>Спасибо за быстрый ответ, но это не совсем то что нужно. Я не хочу сделать окно произвольной формы. Мне надо, чтобы внешне в окне не было вырезанной области. Этот RECT должен быть прозрачным только для сообщений, и их должны обрабатывать окна, которые под этим окном.
Тогда обрабатывайте WM_NCHITTEST и возвращайте из обработчика HT_TRANSPARENT.
Это приведет к тому, что события от мыши будут уходить окну, лежащему в z-order непосредственно под данным окном.
Hello , you wrote:
> У меня есть кое-какие соображения, но они мне пока не очень нравятся. > > Буду благодарен за любую идею.
Сделать так, чтобы окно целиком не реагировала на мышь просто:
Layered Window + WS_TRANSPARENT_EX
Поэтому видится такое решение:
1) В главном окне все же вырезаем дырку
2) Создаем layered окно чтобы заткнуть дырку.
3) При перемещении/сворачивании/разворачивании главного окна
соответсвующим образом двигаем/сворачиваем второе окно.
А>>Спасибо за быстрый ответ, но это не совсем то что нужно. Я не хочу сделать окно произвольной формы. Мне надо, чтобы внешне в окне не было вырезанной области. Этот RECT должен быть прозрачным только для сообщений, и их должны обрабатывать окна, которые под этим окном.
BS>Тогда обрабатывайте WM_NCHITTEST и возвращайте из обработчика HT_TRANSPARENT. BS>Это приведет к тому, что события от мыши будут уходить окну, лежащему в z-order непосредственно под данным окном.
Не покатит:
HTTRANSPARENT
In a window currently covered by another window in the same thread (the message will be sent to underlying windows in the same thread until one of them returns a code that is not HTTRANSPARENT).
SA>Сделать так, чтобы окно целиком не реагировала на мышь просто: SA>Layered Window + WS_TRANSPARENT_EX SA>Поэтому видится такое решение: SA>1) В главном окне все же вырезаем дырку SA>2) Создаем layered окно чтобы заткнуть дырку. SA>3) При перемещении/сворачивании/разворачивании главного окна SA>соответсвующим образом двигаем/сворачиваем второе окно.