Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Многослойные окна


Автор: Randajad 15.3.2012, 13:09
Сабж. Нужно сделать интерфейс с фоном в виде PNG с различной прозраностью. О-кей, с помощью UpdateLayeredWindow сделали. Но нужно разместить видимые контролы на нем.

Это http://www.codeproject.com/Articles/42032/Perfect-Semi-transparent-Shaped-Dialogs-with-Stand смотрел, много гуглил, да.

ColorKey использовать не вариант, потому что пиксели контролов будут "проваливаться", интерфейс полностью графический и многоцветовой. Решил использовать Shaped Window, оставляя окно только под контролами. Работает. Теперь к проблемам:
Необходимо реализовать все это на чистом WinApi. ATL/WTL не использовать.
Если создавать окно с контролами как дочернее и как popup окно от того, что с пнгшкой - то оно само не передвигается за фоном. Не беда, SetWindowPos. Но в MSDN'е написано, что WS_CHILD и WS_POPUP одновременно использовать нельзя, следовательно - грязный хак, хоть и работает в XP и Windows 8. Плюс фокус странно прыгает от окна с фоном, до окна с контролами. По альт+ф4 то закрывается окно с контролами, то фон. Иногда, если поверх открыть другое окно и тыкать по кнопке приложения в таскбаре, то оно не появляется.  Вообщем, извращений много.

Если же создавать окно с контролами само по себе и самому передвигать его на позицию фона, то возникают проблемы с ZOrder'ом и при передвижении окна моргают, то одно, то другое показывается. Флаг SWP_NOACTIVATE у SetWindowPos  не работает. И если тыкать по фону, то окно с контролами проваливается под него и его становится не видно. WS_EX_NOACTIVATE не работает почему-то тоже.

Вообщем у кого какие идеи?

Автор: Randajad 15.3.2012, 16:51
Ай! Я ошибся разделом! Прошу модераторов меня пощадить и перенести темку.

Автор: GremlinProg 19.3.2012, 11:23
Цитата(Randajad @  15.3.2012,  15:09 Найти цитируемый пост)
следовательно - грязный хак, хоть и работает в XP и Windows 8

это не хак, просто WS_CHILD (или оба флага) система игнорирует, и если кодеры этого не поймут, через пару-тройку версий это будет приводить к NULL в ответ на вызов CreateWindow, по типу правил ужесточения требований к API, когда все рекомендации "should not be" переходят в правила "must not be"
Цитата(Randajad @  15.3.2012,  15:09 Найти цитируемый пост)
Если создавать окно с контролами как дочернее и как popup окно от того, что с пнгшкой - то оно само не передвигается за фоном

Цитата(Randajad @  15.3.2012,  15:09 Найти цитируемый пост)
Плюс фокус странно прыгает от окна с фоном, до окна с контролами. По альт+ф4 то закрывается окно с контролами, то фон. Иногда, если поверх открыть другое окно и тыкать по кнопке приложения в таскбаре, то оно не появляется.  Вообщем, извращений много.

как следствие первого - это простое перекрытое окно или попап, он не должен ни двигаться за окном-владельцем, ни иметь с ним один фокус
Цитата(Randajad @  15.3.2012,  15:09 Найти цитируемый пост)
Если же создавать окно с контролами само по себе и самому передвигать его на позицию фона, то возникают проблемы с ZOrder'ом и при передвижении окна моргают, то одно, то другое показывается. Флаг SWP_NOACTIVATE у SetWindowPos  не работает.

отсюда можно поподробнее, можно даже с кодом
Цитата(Randajad @  15.3.2012,  15:09 Найти цитируемый пост)
И если тыкать по фону, то окно с контролами проваливается под него и его становится не видно. WS_EX_NOACTIVATE не работает почему-то тоже.

значит контрол - простое перекрытое (overlapped) окно, а не popup,
popup-контролы не проваливаются под владельца, такая у них фишка,

вобщем, надо смотреть код  smile 

Автор: Randajad 27.6.2012, 23:38
Да нет, хак. smile
Ибо окошко таки получается не отдельное, а дочернее и не проваливается. smile

Темка вновь актуальна. Извиняюсь, раньше времени не было на это.

Автор: GremlinProg 28.6.2012, 11:56
Цитата(Randajad @  28.6.2012,  01:38 Найти цитируемый пост)
Да нет, хак. Ибо окошко таки получается не отдельное, а дочернее и не проваливается. 

а ты случаем не забыл, что используешь SetWindowPos?
с чего это оно стало дочерним-то?
только потому, что ты сам таскаешь это окно за владельцем?
 smile
ну просто не существует дочерних попап окон (как и перекрытых), смирись,
и ни каких хаков комбинацией windows-флагов сделать не получится

Автор: Randajad 28.6.2012, 13:12
Окно с контролами не проваааааливается под фон если указывать WS_CHILD + HWND окна-родителя.
Если не указывать - это обычные два окна и при клике на одно из них другое на второй план уходит. smile
Я понимаю, что нельзя, но этот эффект есть!

Автор: GremlinProg 28.6.2012, 13:25
Цитата(Randajad @  28.6.2012,  15:12 Найти цитируемый пост)
Окно с контролами не проваааааливается под фон если указывать WS_CHILD + HWND окна-родителя.

если WS_CHILD, без WS_POPUP, то оно и не должно проваливаться, это же обычное дочернее окно

Автор: Dem_max 28.6.2012, 17:55
Layered окно должно быть еще со стилем WS_EX_LAYERED | WS_EX_TRANSPARENT и WS_POPUP
и показывать его как ShowWindow(hWnd, SW_SHOWNOACTIVATE);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)