Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Power Basic

Страница: 1 |

 

  Вопрос: Полупрозрачные окна: жуткие тормоза Добавлено: 23.09.05 13:16  

Автор вопроса:  Macronix | Web-сайт: http://x250.net/ | ICQ: 170650558 
Недавно переписал одну программку на 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-сайт: basicproduction.nm.ru
 Профиль | | #1
Добавлено: 24.09.05 04:14
У меня NT-шки нет, так что проверить не могу. А что если отключать прозрачность перед копированием и включать после?

Ответить

Номер ответа: 2
Автор ответа:
 Александр



Разработчик Offline Client

ICQ: 204034 

Вопросов: 106
Ответов: 1919
 Профиль | | #2 Добавлено: 24.09.05 07:38
Если сможешь перевести, то лави (взято из Миранды 0.3.3):

if(IsDlgButtonChecked(hwndDlg,IDC_TRANSPARENT)) {
    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-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #6
Добавлено: 24.09.05 19:55
| - это когда единичные биты устанавливаются, если хотя бы в одном из аргументов там стоит единица
&~ - это когда из первого аргумента убираются все единицы второго аргумента

Ответить

Номер ответа: 7
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #7
Добавлено: 25.09.05 05:24
Вот, может поможет, хотя я сам нефига в этом не понял.
унарная операция ~ дает дополнение значения операнда до единицы. Выполняются обычные арифметические преобразования. Операнд должен иметь интегральный тип.

Ответить

Номер ответа: 8
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #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))
Usage: NOT dest
Modifies flags: None
Inverts the bits of the "dest" operand forming the 1s complement.

Ответить

Номер ответа: 9
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #9
Добавлено: 25.09.05 06:02
Кстати NOT отличается от NEG тем, что в NEG операнд вычитается из 0(все биты сброшены), а в NOT из максимума(все биты установлены). Результат записывается в тот же операнд.
Например (в двоичной системе для байта):
11111111-101 = NOT 101 = 11111010

или по человечески (в десятичной для байта):
255-5 = NOT 5 = 250

Ответить

Номер ответа: 10
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #10
Добавлено: 25.09.05 12:26
Call SetWindowLong(hwndContactList, GWL_EXSTYLE, GetWindowLong(hwndContactList, GWL_EXSTYLE) And Not WS_EX_LAYERED)


Лично я это примерно так и представлял. А работаль оно так будет?

Ответить

Номер ответа: 11
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #11
Добавлено: 26.09.05 04:17
Разницу между "One's Compliment" и "One's Compliment Negation" я так и не понял. Может в этом дело?
Попробуй так:
Not (GetWindowLong(hwndContactList, GWL_EXSTYLE) And WS_EX_LAYERED)

Ответить

Номер ответа: 12
Автор ответа:
 Macronix



ICQ: 170650558 

Вопросов: 12
Ответов: 46
 Web-сайт: http://x250.net/
 Профиль | | #12
Добавлено: 26.09.05 12:55
Господа, что-то Вы не в ту сторону копаете
Я уже решил проблему, заменил CreateWindow на CreateWindowEx и все стало работать пучком. Но так и не понял источник проблемы.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам