![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
Emura |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 7.2.2009 Репутация: 1 Всего: 1 |
Спасибо!
![]() Буду разбираться. Отпишусь о результате. Посмотрел ![]() теперь вопрос ![]() PS: была бы возможность поставил плюс! имхо, ограничение в 100 сообщений - совсем лишее. Это сообщение отредактировал(а) Emura - 21.4.2009, 19:22 |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
ну, это немного другой вопрос буферизировать, конечно, реально но эффект от этого будет не полный, поскольку на WS_EX_TRANSPARENT об этой буферизации ни чего не знает хотя в XP этот недочет можно устранить: поставь родительскому окну стиль WS_EX_COMPOSITED, при создании (это встроенная буферизация) после этого, дополнительно, ни чего буферизировать не потребуется -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Emura |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 7.2.2009 Репутация: 1 Всего: 1 |
Ага, заработало. GremlinProg, Спасибо!
А какой негатив от WS_EX_COMPOSITED может проявится? На Висту эта опция распространяется? |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
негатива 2 штуки:
1. не видно некоторых операций с мышью, при которых какие-нибудь кнопки меняют состояние 2. подержка этого флага только в XP (и более ни где) по сути, WS_EX_TRANSPARENT с ним и должен использоваться, но раз в последующих версиях WS_EX_COMPOSITED удален, а WS_EX_TRANSPARENT остался, то можно предположить, что эту проблему:
там решили, т.е. в последующих ручная двойная буферизация будет работать полноценно я не тестировал это в висте, точно не скажу, может есть люди, готовые проверить? пример на оба варианта дам, нужно будет только зафиксировать между ними визуальную разницу есть желающие? -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
похоже, есть еще один негатив, с AlphaBlend:
http://connect.microsoft.com/VisualStudio/...edbackID=100477 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Emura |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 7.2.2009 Репутация: 1 Всего: 1 |
Да уж.. не обнадеживает. Чтож так все антипрозрачно с этой прозрачностью.
Кстати а можно на лету вкл\ выкл WS_CLIPCHILDREN ? Если можно, то к примеру 1. при показе родителя WS_CLIPCHILDREN выкл, 2. копируем фон родителя 3. вкл WS_CLIPCHILDREN 4. используем скопируемый фон для отрисовки потомков как душе угодно или это бред? Это сообщение отредактировал(а) Emura - 21.4.2009, 21:16 |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
если нужна двойная буферизация, то делай как советовал Andrey44,
возможно даже не придется отключать WS_CLIPCHILDREN (если копировать фон не с родителя, а с самого себя) Добавлено через 4 минуты и 39 секунд хотя сечас вот, засомневался если WS_CLIPCHILDREN не убирать, то все равно придется фон родителя воспроизводить на прозрачном окне по-новой (хотя это и не проблема, если фон известен, например: статическая картинка) Добавлено через 10 минут и 43 секунды
а, без разницы, сам подумай, если использовать экран в качестве буфера заднего фона, то он в любом случае ОБНОВИТСЯ ДВАЖДЫ: 1. прорисуется родитель 2. прорисуется дочерний, затирая родителя даже если это обновление будет не частым, моргание будет видно -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Emura |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 7.2.2009 Репутация: 1 Всего: 1 |
GremlinProg
Да,я тоже сомневаюсь. Andrey44:
Взять область при WS_CLIPCHILDREN не получится. Она то как раз и вырезана, там нет фона из-за WS_CLIPCHILDREN. А использовал он WS_CLIPCHILDREN или нет я так и не понял, скорее всего нет, если у него получилось то, что он описал.
возможно, а если она стретчится. в зависимости о размера окна это не вариант.. проблем нет если родитель одноцветен. аа понял, впринципе да, согласен на счет картинки. точно! А вот если градиент программно рисуем? то тут нифига. Это сообщение отредактировал(а) Emura - 21.4.2009, 21:35 |
||||
|
|||||
GremlinProg |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
я конкретно в таком случае использовал IPicture::Render, т.е. именно воспроизвожу статический рисунок (с растяжкой) прекрасно работало, попробуй Добавлено через 2 минуты и 28 секунд родитель же известен, следовательно его координаты - тоже можно спокойно идентифицировать свой участок фона, даже с учетом масштабирования Добавлено через 7 минут
да, похоже, область будет прозрачна вплоть до первого пра-родителя, с включенным WS_CLIPCHILDREN, а при отсутствии таковых - будет светиться десктоп и все, что на нем в данный момент -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
вообще, я уже писал про WM_PRINT и WM_PRINTCLIENT - очень удобно, и воспроизводить по- сути - ни чего не нужно, и поддержка этих сообщений уже встроена на уровне системных компонент (EDIT, COMBO, TOOLBAR, и т.п.)
рисование второго буфера тогда сводится к посылке самому себе WM_PRINT/CLIENT, то же самое касается и родителя (WS_CLIPCHILDREN используется только в BeginPaint, так что буфера в памяти это не каснется) чтобы получить часть родителя, достаточно создать девайс в памяти и послать его с WM_PRINT/CLIENT, а дальше - действительно - делай шо хошь -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Emura |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 7.2.2009 Репутация: 1 Всего: 1 |
на счет WM_PRINT и WM_PRINTCLIENT
попробовал стащить битмап с родителя, что-то не вышло (если имелось ввиду это) . Видимо от того что я отрисовываю в WM_PAINT или фиг знает.. С помощью WM_PRINT можно получить hdc окна без вырезок под контролы-потомки? GremlinProg, разъясни пожалуйста. ps. по сути если использовать картинку для фона то тогда практически в любых ситуациях можно сотворить прозрачность. но хочется без лишних ресурсов обойтись. у кого виста под рукой протестите пожалуйста: http://forum.vingrad.ru/index.php?showtopi...t&p=1848827 Это сообщение отредактировал(а) Emura - 22.4.2009, 03:32 |
|||
|
||||
Andrey44 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1501 Регистрация: 4.12.2006 Где: На работе Репутация: 8 Всего: 26 |
WS_CLIPCHILDREN я не использовал, и WS_EX_TRANSPARENT тоже. -------------------- ????? ??, ??????? ?????. ![]() |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
с WM_PRINT'ом и с двойным буфером, это будет выглядеть так:
Добавлено через 12 минут и 39 секунд WS_EX_TRANSPARENT этот пример конечно не касается, он здесь не используется, просто забыл заголовки поправить, но, тем не менее, этот пример переносим на любую ось, а эффект такой же, как и с WS_EX_TRANSPARENT | WS_EX_COMPOSITED (если, конечно неклиентскую область рисовать так же, через буфер) т.е., все негативы снимаются, кроме главного, сопутствующего вообще двойным буферам: при большом количестве таких дочерних компонент, будет заметно общее притормаживание вывода графики (хотя это вопрос оптимизации GUI, т.е. грамотного планирования интерфейса: не должно у пользователя перед глазами маячить сотни кнопок на одной форме, для него это комфорту не прибавит) Присоединённый файл ( Кол-во скачиваний: 26 ) ![]() -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Emura |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 7.2.2009 Репутация: 1 Всего: 1 |
Andrey44
Спасибо за уточнения! ![]() ![]() GremlinProg, Сейчас посмотрим. Это сообщение отредактировал(а) Emura - 22.4.2009, 14:50 |
|||
|
||||
Emura |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 102 Регистрация: 7.2.2009 Репутация: 1 Всего: 1 |
Такс, посмотрел код. GremlinProg, очередной респект.
вопрос: Как я понял отрисовывается так: а). родитель отрисовывается, путем отсылки самому себе WM_PRINTCLIENT. Вся отрисовка находится в WM_PRINTCLIENT. а в WM_PAINT только двойная буферизация и вывод. б). контрол отрисовывается таким же способом, но перед отрисовкой в WM_PRINTCLIENT отсылаем еще и родителю сообщение WM_PRINTCLIENT, который отрисовывает сам себя и возвращает нам hdc. который мы используем, чтобы сделать контрол "прозрачным". Так ли я понял? ![]() Кстати, можно ведь попробовать обойтись и без WM_PRINTCLIENT. Создаем например: 1. метод который рисует контрол, например DrawBuffer(), возвращающий тотже hdc или bitmap, даже параметры для метода замутить, чтото вроде (_возвращаем всю область || _возвращаем нужный квадрат) 2. метод который выводит, например Draw().
3. и при отрисовки потомка обращаемся к методу родителя DrawBuffer(), и получаем то что хотели
Правильно мыслю? Поправьте если что не так. Естесственно это относится в большей степени к самописным контролам.
Согласен, само собой. ps наконец-то проблема вроде решается причем без негативных моментов и сложного то ничего нет, всё просто до безобразия ![]() Это сообщение отредактировал(а) Emura - 22.4.2009, 16:07 |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |