![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| ZC1989 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 468 Регистрация: 17.7.2006 Где: Нижний Новгород; Россия Репутация: 1 Всего: 1 |
всё мучаюсь со своим стилем окна (окно нестандартной формы и местами оно полупрозрачно, причём степень прозрачности зависит от альфа кртинки)
суть такая, у меня четыре битмапа одинакового размера: первый(дальний) - с грубыми границами (ч/б), служаший для создания нестандартной формы окна. второй - снимок экрана, под приложением ( на него накладываются верхние слои) третий - (ч/б) с плавными переходами как бы альфа канал для самого верхнего слоя четвёртый(верхний) - картинка окна. вопросов три... 1) я сегодня наткнулся на подобный вопрос в одном из форумов, там говорилось что для того что бы окно не мерцало при перерисовке, лучше всего сделать два буфера картинки, а в WM_PAINT просто производить его отрисовку, тем самым момент отрисовки не будет подвисать и всё должно будет проходить нормально. отсюда возник вопрос: когда лучше всего подготавливать теневой буфер? 2) у меня во время отрисовки окна смешиваются три верхних слоя, перебором всех пикселей на них, построчно...
может ли это затормаживать отрисовку? и если делать теневое создание буфера, скроется ли торможение там? 3) так как окно прозрачно, то при его перемещении хочется то же видеть перемещаюшийся фон, правильно ли сделать отрисовку окна по таймеру, задав хатя бы его тактность 24 раза в секунду? или есть другой вариант? -------------------- озарение настанет позже, когда поймём больше... (Сo. Stigmata) |
|||
|
||||
| BorisVorontsov |
|
|||
![]() Thinker ![]() ![]() Профиль Группа: Комодератор Сообщений: 714 Регистрация: 3.11.2005 Где: Молдавия, г. Киши нёв Репутация: 4 Всего: 10 |
Эм. Ты пытаешься сэмулировать слоистые окна? Зачем? Сия фича появилась еще в Win2k, правда, с некоторыми ограничениями. И система за тебя выполнит двойную буферизацию, если у окна будет стиль WS_EX_COMPOSITED
Это сообщение отредактировал(а) BorisVorontsov - 6.7.2009, 22:11 -------------------- [code=cpp] const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out); for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl; [/code] |
|||
|
||||
| ZC1989 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 468 Регистрация: 17.7.2006 Где: Нижний Новгород; Россия Репутация: 1 Всего: 1 |
а можешь подсказать или ссылку дать где посмотреть? я просто раньше никогда не занимался окнами с нестандартными фонами, и делаю я в принципе не слоистость, а что бы у окна была по краям тень, чем то напоминающая стили в той же Висте вот...
почитал сейчас про слоистые окна, как понял это не то...или как то можно сделать через них такое ![]() (какая то ерунда...картинка не грузится....ну по этому кусочку надеюсь, онятно какая прозрачность нужна) Это сообщение отредактировал(а) ZC1989 - 6.7.2009, 22:55 -------------------- озарение настанет позже, когда поймём больше... (Сo. Stigmata) |
|||
|
||||
| ZC1989 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 468 Регистрация: 17.7.2006 Где: Нижний Новгород; Россия Репутация: 1 Всего: 1 |
я частично нашёл причину, она на самом деле была изза попиксельного обхода растров...
но возникла другая проблема, изза того что я для получения фона под окном прячу, становится невозможным перетаскивание окна...я уже не знаю...запутался... и не понял что бы в слоистых окнах было именно такое...там вроде бы общая прозрачность всего окна...да? -------------------- озарение настанет позже, когда поймём больше... (Сo. Stigmata) |
|||
|
||||
| Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 8 Всего: 26 |
ZC1989, если ты программируешь для висты - используй DWM API.
Там все это сделано до тебя. -------------------- ????? ??, ??????? ?????. |
|||
|
||||
| BorisVorontsov |
|
|||
![]() Thinker ![]() ![]() Профиль Группа: Комодератор Сообщений: 714 Регистрация: 3.11.2005 Где: Молдавия, г. Киши нёв Репутация: 4 Всего: 10 |
Конечно, можно. PNG-маска и UpdateLayeredWindow. Только для реализации приведенного тобой окна придется использовать два окна, одно на клиентскую область, другое на рамку. Не только. Окно можно сделать целиком полупрозрачным, либо по альфе маски -------------------- [code=cpp] const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out); for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl; [/code] |
|||
|
||||
| ZC1989 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 468 Регистрация: 17.7.2006 Где: Нижний Новгород; Россия Репутация: 1 Всего: 1 |
BorisVorontsov, = ) спасибо) буду пробовать)
а почему нельзя вывести всё в одном окне? в котором рамка будет просто рисунком? Andrey44, делаю для ХР Это сообщение отредактировал(а) ZC1989 - 10.7.2009, 18:08 -------------------- озарение настанет позже, когда поймём больше... (Сo. Stigmata) |
|||
|
||||
| ZC1989 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 468 Регистрация: 17.7.2006 Где: Нижний Новгород; Россия Репутация: 1 Всего: 1 |
блин, попробовать не смогу даже в ближайшие пару дней...чтото за ерунда, у меня переменная _WIN32_WINNT ниже 0x0500, хатя стоит ХР SP3 ...как переставлю всё, отпишусь...
-------------------- озарение настанет позже, когда поймём больше... (Сo. Stigmata) |
|||
|
||||
| BorisVorontsov |
|
|||
![]() Thinker ![]() ![]() Профиль Группа: Комодератор Сообщений: 714 Регистрация: 3.11.2005 Где: Молдавия, г. Киши нёв Репутация: 4 Всего: 10 |
Это не переменная, это макрос. И его легко можно переопределить перед включением заголовков. Наверно, у тебя просто старая SDK. -------------------- [code=cpp] const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out); for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl; [/code] |
|||
|
||||
| ZC1989 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 468 Регистрация: 17.7.2006 Где: Нижний Новгород; Россия Репутация: 1 Всего: 1 |
у меня студия 2005, странно что старая...(
-------------------- озарение настанет позже, когда поймём больше... (Сo. Stigmata) |
|||
|
||||
| ZC1989 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 468 Регистрация: 17.7.2006 Где: Нижний Новгород; Россия Репутация: 1 Всего: 1 |
так, вроде получилось, SetLayeredWindowAttributes понятно как использовать...а как UpdateLayeredWindow, есть пример? я создал PNG с альфа каналом, но в функции есть пара параметров которые не пойму откуда взять...кусочек кода можно?
-------------------- озарение настанет позже, когда поймём больше... (Сo. Stigmata) |
|||
|
||||
| BorisVorontsov |
|
|||
![]() Thinker ![]() ![]() Профиль Группа: Комодератор Сообщений: 714 Регистрация: 3.11.2005 Где: Молдавия, г. Киши нёв Репутация: 4 Всего: 10 |
-------------------- [code=cpp] const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out); for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl; [/code] |
|||
|
||||
| ZC1989 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 468 Регистрация: 17.7.2006 Где: Нижний Новгород; Россия Репутация: 1 Всего: 1 |
Спасибо, порадовало что там альфа канал и картинка двумя файлами сделаны)) интересней как-то )) попробую перевести)
-------------------- озарение настанет позже, когда поймём больше... (Сo. Stigmata) |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |