| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 |
| Ай! Я ошибся разделом! Прошу модераторов меня пощадить и перенести темку. |
| Автор: Randajad 27.6.2012, 23:38 |
| Да нет, хак. Ибо окошко таки получается не отдельное, а дочернее и не проваливается. Темка вновь актуальна. Извиняюсь, раньше времени не было на это. |
| Автор: GremlinProg 28.6.2012, 11:56 | ||
а ты случаем не забыл, что используешь SetWindowPos? с чего это оно стало дочерним-то? только потому, что ты сам таскаешь это окно за владельцем? ну просто не существует дочерних попап окон (как и перекрытых), смирись, и ни каких хаков комбинацией windows-флагов сделать не получится |
| Автор: Randajad 28.6.2012, 13:12 |
| Окно с контролами не проваааааливается под фон если указывать WS_CHILD + HWND окна-родителя. Если не указывать - это обычные два окна и при клике на одно из них другое на второй план уходит. Я понимаю, что нельзя, но этот эффект есть! |
| Автор: GremlinProg 28.6.2012, 13:25 | ||
если WS_CHILD, без WS_POPUP, то оно и не должно проваливаться, это же обычное дочернее окно |
| Автор: Dem_max 28.6.2012, 17:55 |
| Layered окно должно быть еще со стилем WS_EX_LAYERED | WS_EX_TRANSPARENT и WS_POPUP и показывать его как ShowWindow(hWnd, SW_SHOWNOACTIVATE); |