Полупрозрачный контрол
От: Lonkar  
Дата: 11.04.11 07:50
Оценка:
Требуется сделать контрол (например, кнопку) в виде картинки, которая содержит прозрачные, полупрозрачные и непрозрачные области произвольной формы.
Есть ли стандартный механизм для дочерних окон наподобие WS_EX_LAYERED и UpdateLayeredWindow?

Для отсечения прозрачной области воспользовался SetWindowRgn.
А вот с полупрозрачностью возникли проблемы:
1) WM_PAINT почему-то приходит в "неправильном" порядке (сверху вниз), в итоге при сворачивании/разворачивании окна фоном оказывается другое приложение.
2) Полупрозрачный контрол не отслеживает изменения содержимого окна и не перерисовывается, когда надо.

Пробовал использовать WS_EX_TRANSPARENT, но с ним контрол видно только после ресайза окна.

Пока единственная мысль кэшировать фон и при каждом изменении содержимого окна его обновлять, но это муторно и быстро работать не будет
Re: Полупрозрачный контрол
От: okman Беларусь https://searchinform.ru/
Дата: 11.04.11 08:13
Оценка:
Здравствуйте, Lonkar, Вы писали:

L>Требуется сделать контрол (например, кнопку) в виде картинки, которая содержит прозрачные, полупрозрачные и непрозрачные области произвольной формы.

L>Есть ли стандартный механизм для дочерних окон наподобие WS_EX_LAYERED и UpdateLayeredWindow?

L>Для отсечения прозрачной области воспользовался SetWindowRgn.

L>А вот с полупрозрачностью возникли проблемы:
L>1) WM_PAINT почему-то приходит в "неправильном" порядке (сверху вниз), в итоге при сворачивании/разворачивании окна фоном оказывается другое приложение.
L>2) Полупрозрачный контрол не отслеживает изменения содержимого окна и не перерисовывается, когда надо.

L>Пробовал использовать WS_EX_TRANSPARENT, но с ним контрол видно только после ресайза окна.


L>Пока единственная мысль кэшировать фон и при каждом изменении содержимого окна его обновлять, но это муторно и быстро работать не будет


Увы, WS_EX_LAYERED и WS_CHILD несовместимы.
Могу только посоветовать нарисовать фрагменты GUI в памяти заранее (с прозрачностью),
чтобы при их перерисовке не тратить на это время.
Re[2]: Полупрозрачный контрол
От: Lonkar  
Дата: 11.04.11 08:49
Оценка:
Здравствуйте, okman, Вы писали:
O>Могу только посоветовать нарисовать фрагменты GUI в памяти заранее (с прозрачностью),
O>чтобы при их перерисовке не тратить на это время.
Так и планирую сделать. Вот только получается, что каждый полупрозрачный контрол должен хранить в памяти фон под ним.
Кроме того КАЖДЫЙ контрол должен информировать ВСЕ контролы, которые лежат выше него, при изменении своего состония, чтобы те обновили фон.
Надеялся, что существует более простой способ.
Re[2]: Полупрозрачный контрол
От: kero Россия  
Дата: 11.04.11 09:54
Оценка:
Здравствуйте, okman, Вы писали:

O>Увы, WS_EX_LAYERED и WS_CHILD несовместимы.


Помнится, на XP-sp2 при определенных условиях — совместимы
(http://rsdn.ru/forum/winapi/2292945.aspx
Автор: kero
Дата: 09.01.07
)
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[3]: Полупрозрачный контрол
От: kero Россия  
Дата: 11.04.11 10:11
Оценка: 1 (1)
Здравствуйте, Lonkar, Вы писали:

L>Надеялся, что существует более простой способ.


Ссылка из соседнего топика: статья "Layered Windows with Direct2D".
Не готовый "простой способ", но в плане "информации к размышлению"
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re: Полупрозрачный контрол
От: о_О
Дата: 11.04.11 10:21
Оценка:
Здравствуйте, Lonkar, Вы писали:

вы просто понятие не имеете, как правильно рисовать. надо читать msdn, смотреть исходники той же mfc
Re: Полупрозрачный контрол
От: c-smile Канада http://terrainformatica.com
Дата: 12.04.11 04:49
Оценка:
Здравствуйте, Lonkar, Вы писали:


L>Пока единственная мысль кэшировать фон и при каждом изменении содержимого окна его обновлять, но это муторно и быстро работать не будет


Прозрачное child окно эмулируется достаточно просто. Базовая идея: перед отрисовкой попросить parent нарисовать нам свой background.

Обычное child окно (т.е. не transparent)

В обработчике WM_PAINT создаем offscreen bitmap и DC на её основе.

1) Берем этот DC и отправляем WM_PRINTCLIENT родителю с этим DC и соотв. SetViewportOrg.
после этого в нашем offscreen bitmap содержится фон окна родителя по месту нашего окна.
2) В этом нашем DC/bitmap рисуем нашу полупрозрачную картинку и
3) BitBlt нашу offscreen bitmap в DC окна.

Все.
Re[2]: Полупрозрачный контрол
От: Lonkar  
Дата: 12.04.11 07:51
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Прозрачное child окно эмулируется достаточно просто. Базовая идея: перед отрисовкой попросить parent нарисовать нам свой background.

CS>В обработчике WM_PAINT создаем offscreen bitmap и DC на её основе.
CS>1) Берем этот DC и отправляем WM_PRINTCLIENT родителю с этим DC и соотв. SetViewportOrg.
CS>после этого в нашем offscreen bitmap содержится фон окна родителя по месту нашего окна.

Такое подойдет только, если прозрачное окно рисуется прямо поверх непрозрачного родителя.
А как быть, если между parent и прозрачным child окном оказались другие дочерние окна?
Получается, что им тоже требуется отправить WM_PRINT. А если, не дай бог, родитель сам оказался прозрачным, то и дедушку потревожить придётся...
Re[4]: Полупрозрачный контрол
От: Lonkar  
Дата: 12.04.11 09:05
Оценка:
Здравствуйте, kero, Вы писали:
K>Ссылка из соседнего топика: статья "Layered Windows with Direct2D".
K>Не готовый "простой способ", но в плане "информации к размышлению"
Статья интересная, но там предлагается использовать всё тот же WS_EX_LAYERED, который не понятно как подружить с WS_CHILD.
Re[3]: Полупрозрачный контрол
От: c-smile Канада http://terrainformatica.com
Дата: 12.04.11 15:59
Оценка:
Здравствуйте, Lonkar, Вы писали:

L>Такое подойдет только, если прозрачное окно рисуется прямо поверх непрозрачного родителя.

L>А как быть, если между parent и прозрачным child окном оказались другие дочерние окна?
L>Получается, что им тоже требуется отправить WM_PRINT. А если, не дай бог, родитель сам оказался прозрачным, то и дедушку потревожить придётся...

Если parent сам полупрозрачный то он тоже должен посылать WM_PRINTCLIENT своему parent.
Собственно другого [надежного] способа в Windows нет.

Иначе использовать windowless элементы. Например как в htmlayout.
Re[4]: Полупрозрачный контрол
От: CEMb  
Дата: 13.04.11 16:33
Оценка:
Здравствуйте, kero, Вы писали:

L>>Надеялся, что существует более простой способ.


K>Ссылка из соседнего топика: статья "Layered Windows with Direct2D".

K>Не готовый "простой способ", но в плане "информации к размышлению"

Осторожно! Window 7 Aero не дружит иногда с DirecDraw Не знаю, как с отдельными окнами, у меня с десктопом была (и остаётся) проблема: при старте программы аэро вырубается
Re[4]: Полупрозрачный контрол
От: CEMb  
Дата: 13.04.11 16:57
Оценка:
Здравствуйте, c-smile, Вы писали:

L>>Такое подойдет только, если прозрачное окно рисуется прямо поверх непрозрачного родителя.

L>>А как быть, если между parent и прозрачным child окном оказались другие дочерние окна?
L>>Получается, что им тоже требуется отправить WM_PRINT. А если, не дай бог, родитель сам оказался прозрачным, то и дедушку потревожить придётся...

CS>Если parent сам полупрозрачный то он тоже должен посылать WM_PRINTCLIENT своему parent.

CS>Собственно другого [надежного] способа в Windows нет.

Далеко не все окна поддерживают WM_PRINT!!!

И, кстати, ровно вчера смотрел — между процессами вообще не работает даже на тех, кто поддерживает...

Btw, я рисую полупрозрачные контролы, в конкретном случае, через апдейт родителя. Мельканий нету... (интерактивная от мыши кнопка, 100х100, 25 кадров в секунду)
А, не, даже не совсем так, при обычной отрисовке берётся рект под контролом и InvalidateRect родителю, потом поверх рисуется. В случае таймера, создаётся HDC c битмапом, туда сохраняется кусок родителя и потом перед отрисовкой в контрол рендерится.
Ну, кстати, в случае нескольких контролов нужно просто в правильном порядке звать отрисовки... а я ещё делаю так: я не использую DC напрямую, я сделал пару неких классов(поток и картинка), которые использую для рисования многослойных вещей: вначале (поток) снимает 32-битное представление через HDC, потом всё в эту битовую карту рисуется через мои функции, потом, после того, как всё отрисовалось — заливается в изначальное HDC. Мельканий нет
Re[5]: Полупрозрачный контрол
От: Lonkar  
Дата: 13.04.11 17:39
Оценка:
Спасибо за советы.
Была надежда на существование "стандартного" механизма полупрозрачности, но велосипеды тоже не плохо — пойду собирать свой
Re[6]: Полупрозрачный контрол
От: о_О
Дата: 14.04.11 19:19
Оценка:
Здравствуйте, Lonkar, Вы писали:

L>Спасибо за советы.

L>Была надежда на существование "стандартного" механизма полупрозрачности, но велосипеды тоже не плохо — пойду собирать свой
Я тебя разочарую. В вин95 полупрозрачность отсутствовала вообще, а всё что ны имеем сейчас — убогий костыль над тем, что не предусматривает полупрозрачности. Не говоря уже о том, что мелкие муд@ки — в гуе черти-что еще со времен 3.х. До сих пор нет нормального универсального механизма и все извращаются как могут
Re[7]: Полупрозрачный контрол
От: CEMb  
Дата: 16.04.11 16:33
Оценка:
Здравствуйте, о_О, Вы писали:

о_О>Я тебя разочарую. В вин95 полупрозрачность отсутствовала вообще, а всё что ны имеем сейчас — убогий костыль над тем, что не предусматривает полупрозрачности. Не говоря уже о том, что мелкие муд@ки — в гуе черти-что еще со времен 3.х. До сих пор нет нормального универсального механизма и все извращаются как могут


Не было бы проблем — мы бы и программы не писали...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.