Страница: 1 |
Страница: 1 |
Вопрос: Полупрозрачные окна: жуткие тормоза
Добавлено: 23.09.05 13:16
Автор вопроса: Macronix | Web-сайт:
Недавно переписал одну программку на PB. И обнаружил досадный факт: окно созданное с помощью CreateWindow, которому в последствии (с помощью SetWindowLong) присвоен атрибут %WS_EX_LAYERED и назначена прозрачность (SetLayeredWindowAttributes), сильно тормозит, при попытке скопировать (BitBlt-ом) из MemoryDC в контекст окна.
При отсутствии %WS_EX_LAYERED скорость рисования превосходит VB вариант, а иначе наоборот.
(в класс окна пробовал ставить разные варианты: %CS_PARENTDC, %CD_OWNDC и др.)
И еще, что интересно, тормозит одинаково что с окном на весь экран, что с фрагментом 32*32.
Кто сможет объяснить такой расклад дел?
Ответы
Всего ответов: 12
Номер ответа: 1
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #1
Добавлено: 24.09.05 04:14
У меня NT-шки нет, так что проверить не могу. А что если отключать прозрачность перед копированием и включать после?
Номер ответа: 2
Автор ответа:
Александр
Разработчик Offline Client
ICQ: 204034
Вопросов: 106
Ответов: 1919
Профиль | | #2
Добавлено: 24.09.05 07:38
Если сможешь перевести, то лави (взято из Миранды 0.3.3):
SetWindowLong(hwndContactList, GWL_EXSTYLE, GetWindowLong(hwndContactList, GWL_EXSTYLE) | WS_EX_LAYERED);
if(MySetLayeredWindowAttributes) MySetLayeredWindowAttributes(hwndContactList, RGB(0,0,0), (BYTE)DBGetContactSettingByte(NULL,"CList","AutoAlpha",SETTING_AUTOALPHA_DEFAULT), LWA_ALPHA);
} else {
SetWindowLong(hwndContactList, GWL_EXSTYLE, GetWindowLong(hwndContactList, GWL_EXSTYLE) & ~WS_EX_LAYERED);
}
Номер ответа: 3
Автор ответа:
Александр
Разработчик Offline Client
ICQ: 204034
Вопросов: 106
Ответов: 1919
Профиль | | #3
Добавлено: 24.09.05 07:39
Лично я не смог только сделать вот это: ~WS_EX_LAYERED на Ваське.
Номер ответа: 4
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #4
Добавлено: 24.09.05 11:40
| - это Or на VB6, а надо обратную операцию побитово... чё-то я не врубаюсь, как.. , т.е. на C++ & ~ = "и не", м.б. And Not?
Номер ответа: 5
Автор ответа:
Александр
Разработчик Offline Client
ICQ: 204034
Вопросов: 106
Ответов: 1919
Профиль | | #5
Добавлено: 24.09.05 13:10
Да в том-то и дело - что я тоже не врубаюсь. Даже уже численное предаставление (~WS_EX_LAYERED) высчитал и его подставил - все равно не работает.
Номер ответа: 6
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #6
Добавлено: 24.09.05 19:55
| - это когда единичные биты устанавливаются, если хотя бы в одном из аргументов там стоит единица
&~ - это когда из первого аргумента убираются все единицы второго аргумента
Номер ответа: 7
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #7
Добавлено: 25.09.05 05:24
Вот, может поможет, хотя я сам нефига в этом не понял.
Номер ответа: 8
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #8
Добавлено: 25.09.05 05:46
Посмотри
http://msdn.microsoft.com/library/en-us/vclang/html/_pluslang_one.92.s_complement_operator.asp
На самом деле это обычное NOT(One's Compliment Negation (Logical NOT))
Modifies flags: None
Inverts the bits of the "dest" operand forming the 1s complement.
Номер ответа: 9
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #9
Добавлено: 25.09.05 06:02
Кстати NOT отличается от NEG тем, что в NEG операнд вычитается из 0(все биты сброшены), а в NOT из максимума(все биты установлены). Результат записывается в тот же операнд.
Например (в двоичной системе для байта):
или по человечески (в десятичной для байта):
Номер ответа: 10
Автор ответа:
mc-black
ICQ: 308-534-060
Вопросов: 20
Ответов: 1860
Web-сайт:
Профиль | | #10
Добавлено: 25.09.05 12:26
Лично я это примерно так и представлял. А работаль оно так будет?
Номер ответа: 11
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #11
Добавлено: 26.09.05 04:17
Разницу между "One's Compliment" и "One's Compliment Negation" я так и не понял. Может в этом дело?
Попробуй так:
Номер ответа: 12
Автор ответа:
Macronix
ICQ: 170650558
Вопросов: 12
Ответов: 46
Web-сайт:
Профиль | | #12
Добавлено: 26.09.05 12:55
Господа, что-то Вы не в ту сторону копаете
Я уже решил проблему, заменил CreateWindow на CreateWindowEx и все стало работать пучком. Но так и не понял источник проблемы.