Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многослойные окна 
:(
    Опции темы
Randajad
Дата 15.3.2012, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: нет
Всего: 8



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

Это http://www.codeproject.com/Articles/42032/...logs-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, 13:10
PM MAIL   Вверх
Randajad
Дата 15.3.2012, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: нет
Всего: 8



Ай! Я ошибся разделом! Прошу модераторов меня пощадить и перенести темку.
PM MAIL   Вверх
GremlinProg
Дата 19.3.2012, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(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 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Randajad
Дата 27.6.2012, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: нет
Всего: 8



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

Темка вновь актуальна. Извиняюсь, раньше времени не было на это.
PM MAIL   Вверх
GremlinProg
Дата 28.6.2012, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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

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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Randajad
Дата 28.6.2012, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 15.3.2012

Репутация: нет
Всего: 8



Окно с контролами не проваааааливается под фон если указывать WS_CHILD + HWND окна-родителя.
Если не указывать - это обычные два окна и при клике на одно из них другое на второй план уходит. smile
Я понимаю, что нельзя, но этот эффект есть!
PM MAIL   Вверх
GremlinProg
Дата 28.6.2012, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



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

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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Dem_max
Дата 28.6.2012, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



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

Это сообщение отредактировал(а) Dem_max - 28.6.2012, 17:55


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0469 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.