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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> отрисовка буферов GDI 
:(
    Опции темы
ZC1989
Дата 6.7.2009, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

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



всё мучаюсь со своим стилем окна (окно нестандартной формы и местами оно полупрозрачно, причём степень прозрачности зависит от альфа кртинки)

суть такая, у меня четыре битмапа одинакового размера:
первый(дальний) - с грубыми границами (ч/б), служаший для создания нестандартной формы окна.
второй - снимок экрана, под приложением ( на него накладываются верхние слои)
третий - (ч/б) с плавными переходами как бы альфа канал для самого верхнего слоя
четвёртый(верхний) - картинка окна.


вопросов три...

1) я сегодня наткнулся на подобный вопрос в одном из форумов, там говорилось что для того что бы окно не мерцало при перерисовке, лучше всего сделать два буфера картинки, а в WM_PAINT просто производить его отрисовку, тем самым момент отрисовки не будет подвисать и всё должно будет проходить нормально. отсюда возник вопрос: когда лучше всего подготавливать теневой буфер?

2) у меня во время отрисовки окна смешиваются три верхних слоя, перебором всех пикселей на них, построчно...

Код

for(pix_x = 0; pix_x < imgPic.bmp.bmWidth; pix_x++){
            for(pix_y = 0; pix_y < imgPic.bmp.bmHeight; pix_y++){

                imgBG.pixel            = GetPixel(imgBG.hdc, pix_x,  pix_y);
                imgAlpha.pixel        = GetPixel(imgAlpha.hdc, pix_x, pix_y);
                imgPic.pixel            = GetPixel(imgPic.hdc, pix_x, pix_y);

                alpha = (float)(GetRValue(imgAlpha.pixel) / 255.0);

                imgTemp.pixel    = PALETTERGB(
                    ((float)GetRValue(imgBG.pixel) * alpha) + ((float)GetRValue(imgPic.pixel) * (float)(1.0 - alpha)),
                    ((float)GetGValue(imgBG.pixel) * alpha) + ((float)GetGValue(imgPic.pixel) * (float)(1.0 - alpha)),
                    ((float)GetBValue(imgBG.pixel) * alpha) + ((float)GetBValue(imgPic.pixel) * (float)(1.0 - alpha))
                    );

                SetPixel(imgTemp.hdc, pix_x, pix_y, imgTemp.pixel);
            }
        }


может ли это затормаживать отрисовку? и если делать теневое создание буфера, скроется ли торможение там?

3) так как окно прозрачно, то при его перемещении хочется то же видеть перемещаюшийся фон, правильно ли сделать отрисовку окна по таймеру, задав хатя бы его тактность 24 раза в секунду? или есть другой вариант?


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
BorisVorontsov
Дата 6.7.2009, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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]
PM MAIL ICQ GTalk   Вверх
ZC1989
Дата 6.7.2009, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

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



а можешь подсказать или ссылку дать где посмотреть? я просто раньше никогда не занимался окнами с нестандартными фонами, и делаю я в принципе не слоистость, а что бы у окна была по краям тень, чем то напоминающая стили в той же Висте вот...

почитал сейчас про слоистые окна, как понял это не то...или как то можно сделать через них такое 
user posted image

(какая то ерунда...картинка не грузится....ну по этому кусочку надеюсь, онятно какая прозрачность нужна)

Это сообщение отредактировал(а) ZC1989 - 6.7.2009, 22:55


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
ZC1989
Дата 7.7.2009, 02:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

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



я частично нашёл причину, она на самом деле была изза попиксельного обхода растров...

но возникла другая проблема, изза того что я для получения фона под окном прячу, становится невозможным перетаскивание окна...я уже не знаю...запутался... и не понял что бы в слоистых окнах было именно такое...там вроде бы общая прозрачность всего окна...да?


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
Andrey44
Дата 7.7.2009, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ZC1989, если ты программируешь для висты - используй DWM API.
Там все это сделано до тебя.


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
BorisVorontsov
Дата 7.7.2009, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: 4
Всего: 10



Цитата(ZC1989 @  6.7.2009,  22:15 Найти цитируемый пост)
или как то можно сделать через них такое 

Конечно, можно. PNG-маска и UpdateLayeredWindow. Только для реализации приведенного тобой окна придется использовать два окна, одно на клиентскую область, другое на рамку.

Цитата(ZC1989 @  7.7.2009,  02:56 Найти цитируемый пост)
там вроде бы общая прозрачность всего окна...да? 

Не только. Окно можно сделать целиком полупрозрачным, либо по альфе маски


--------------------
[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]
PM MAIL ICQ GTalk   Вверх
ZC1989
Дата 10.7.2009, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

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



BorisVorontsov, = ) спасибо) буду пробовать)
а почему нельзя вывести всё в одном окне? в котором рамка будет просто рисунком?

Andrey44, делаю для ХР

Это сообщение отредактировал(а) ZC1989 - 10.7.2009, 18:08


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
ZC1989
Дата 10.7.2009, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

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



блин, попробовать не смогу даже в ближайшие пару дней...чтото за ерунда, у меня переменная _WIN32_WINNT ниже 0x0500, хатя стоит ХР SP3 ...как переставлю всё, отпишусь... smile 


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
BorisVorontsov
Дата 11.7.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: 4
Всего: 10



Цитата(ZC1989 @  10.7.2009,  18:42 Найти цитируемый пост)
у меня переменная _WIN32_WINNT

Это не переменная, это макрос. И его легко можно переопределить перед включением заголовков. Наверно, у тебя просто старая 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]
PM MAIL ICQ GTalk   Вверх
ZC1989
Дата 14.7.2009, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

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



у меня студия 2005, странно что старая...(


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
ZC1989
Дата 14.7.2009, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

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



так, вроде получилось, SetLayeredWindowAttributes понятно как использовать...а как UpdateLayeredWindow, есть пример? я создал PNG с альфа каналом, но в функции есть пара параметров которые не пойму откуда взять...кусочек кода можно?


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
BorisVorontsov
Дата 17.7.2009, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Thinker
**


Профиль
Группа: Комодератор
Сообщений: 714
Регистрация: 3.11.2005
Где: Молдавия, г. Киши нёв

Репутация: 4
Всего: 10



Цитата(ZC1989 @  14.7.2009,  10:46 Найти цитируемый пост)
есть пример?

http://forum.sources.ru/index.php?showtopic=132649 (на VB6, API тот же)


--------------------
[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]
PM MAIL ICQ GTalk   Вверх
ZC1989
Дата 18.7.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 468
Регистрация: 17.7.2006
Где: Нижний Новгород; Россия

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



Спасибо, порадовало что там альфа канал и картинка двумя файлами сделаны)) интересней как-то )) попробую перевести)


--------------------
озарение настанет позже, когда поймём больше... (Сo. Stigmata)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0648 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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