Как создать модальное окно с полупрозрачным фоном?
, VB6
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.26] |
|
|
Правила раздела Visual Basic: Общие вопросы
FAQ Сайта
FAQ Раздела
Кладовка
Наши Исходники
API-Guide
Поиск по Разделу
MSDN Library Online
Google
Как создать модальное окно с полупрозрачным фоном?
, VB6
|
Сообщ.
#1
,
|
|
|
|
|
Сообщ.
#2
,
|
|
|
|
Цитата Как создать модальное окно с полупрозрачным фоном? (рис) А разве это не простой Draw цикл? Он просто берёт на себя управление и не пускает в основную программу, по крайней мере, это более вероятно, чем инициализировать окно, с прозрачностью, да ещё что бы цикл отрисовки остановить... |
|
Сообщ.
#3
,
|
|
|
|
Смотри SetLayeredWindowAttributes
|
|
Сообщ.
#4
,
|
|
|
|
смотрите UpdateLayeredWindow(), но рисовать его придется полностью самому
|
|
Сообщ.
#5
,
|
|
|
|
Цитата antonn @ смотрите UpdateLayeredWindow(), но рисовать его придется полностью самому Используя SetLayeredWindowAttributes ничего не придется рисовать самому. |
|
Сообщ.
#6
,
|
|
|
|
Можно через отдельное окно с полупрозрачностью (SetLayeredWindowAttributes). Можно отрисовать через граф. библиотеку (DirectDraw, OpenGL - насколько я знаю, так часто делают в играх). Есть еще Windows API на тему прозрачного и полупрозрачного рисования, только названия функций не помню.
|
|
Сообщ.
#7
,
|
|
|
|
Цитата DIS @ Есть еще Windows API на тему прозрачного и полупрозрачного рисования, только названия функций не помню. AlphaBlend/TransparentBlt. Только они здесь неуместны. Что б было как на скриншоте, придется рисовать PNG-маску фона и отрисовывать каждый отдельный контрол самостоятельно: Работа с PNG |
|
Сообщ.
#8
,
|
|
|
|
спасибо
|
|
Сообщ.
#9
,
|
|
|
|
B.V., необязательно PNG, можно и bmp, а можно и вручную рисовать как тут, без всяких картинок. Тем более окно наипростейшее.
|
|
Сообщ.
#10
,
|
|
|
|
Цитата TheTrik @ а можно и вручную рисовать как тут, без всяких картинок. Тем более окно наипростейшее Я же не зря написал Цитата B.V. @ Что б было как на скриншоте Там текстуры. Будешь процедурно генерировать? Что касается bmp, альфа-канал в RGBQUAD не определен. Зачем использовать то, что не является стандартом и требует специальных средств и API? |
|
Сообщ.
#11
,
|
|
|
|
TheTrik
используя SetLayeredWindowAttributes не получится сделать то, что у автора на картинке. Так как эта функция применяет одинаковую альфу ко всему окну. А автору нужно переменную полупрозрачность, чего можно достичь создавая bmp с альфаканалом и скармливая функции мой указанной. Для окна с кнопкой и надписью проблем вообще никаких не возникнет |
|
Сообщ.
#12
,
|
|
|
|
Цитата B.V. @ Что касается bmp, альфа-канал в RGBQUAD не определен. Зачем использовать то, что не является стандартом и требует специальных средств и API? AlphaBlend, UpdateLayeredWindow "кушает" именно такой 32-битный Premultiplied RGBA. Цитата B.V. @ Там текстуры. Будешь процедурно генерировать? В GDI, GDI+ есть текстурная кисть. Цитата antonn @ используя SetLayeredWindowAttributes не получится сделать то, что у автора на картинке. Изначально я не обратил внимание на непрозрачные места. Да, нужно пользоваться UpdateLayeredWindow. |
|
Сообщ.
#13
,
|
|
|
|
Цитата TheTrik @ AlphaBlend, UpdateLayeredWindow "кушает" именно такой 32-битный Premultiplied RGBA. В Windows Bitmap нет никакого alpha, rtfm: http://en.wikipedia.org/wiki/BMP_file_format Цитата TheTrik @ В GDI, GDI+ есть текстурная кисть. Во-первых, GDI затирает альфу нулем. Во-вторых, программная отрисовка может быть оправдана только в двух случаях: оптимизация ресурсоемкости и универсальность отрисовки (например, масштабирование). Если такие задачи стоят перед автором, то -- да. Иначе это получается лишняя работа |
|
Сообщ.
#14
,
|
|
|
|
Цитата B.V. @ В Windows Bitmap нет никакого alpha, rtfm: http://en.wikipedia.org/wiki/BMP_file_format Что мешает его хранить там? Это позволяет загружать его через LoadPicture без проблем, не привлекая GDI+ и сторонние библиотеки. http://www.cyberforum.ru/post5555870.html Цитата B.V. @ Во-первых, GDI затирает альфу нулем. Нет, и пример тому выше. Все зависит от растровой операции. И это я привел пример на твое высказывание Цитата B.V. @ Там текстуры. Будешь процедурно генерировать? Цитата B.V. @ Иначе это получается лишняя работа Много ли лишней работы, создать кисть и закрасить ей прямоугольник? |
|
Сообщ.
#15
,
|
|
|
|
B.V.
Цитата В Windows Bitmap нет никакого alpha конечно нет, уже лет 15 как нет, но используется TheTrik Цитата Нет, и пример тому выше. затирает, поэтому используется лишь еще один шаг с параллельным рисованием на маске для альфы, не смертельно |
|
Сообщ.
#16
,
|
|
|
|
Цитата TheTrik @ Что мешает его хранить там? Зачем создавать его там, если есть формат, по спецификации поддерживающий альфа-канал? Цитата TheTrik @ Нет, и пример тому выше. Где? Цитата TheTrik @ Все зависит от растровой операции. Ну-ка, приведи пример, где и какая функция рисования GDI по-разному работает с альфой в зависимости от ROP Цитата TheTrik @ Много ли лишней работы, создать кисть и закрасить ей прямоугольник? Дружище, что бы создать такую кисть, надо нарисовать текстуру. А что бы повторить исходный рисунок, надо нарисовать несколько текстур. А потом еще и код отрисовки написать. Ты правда думаешь, что это проще. чем нарисовать форму целиком? Цитата antonn @ конечно нет, уже лет 15 как нет, но используется Используется, конечно. Сам использую. Но советовать это в качестве легального метода -- некорректно. |
|
Сообщ.
#17
,
|
|
|
|
Цитата B.V. @ Зачем создавать его там, если есть формат, по спецификации поддерживающий альфа-канал? Я написал зачем. Еще раз написать? Цитата B.V. @ Где? Ссылку я дал, там только средства GDI используются встроенные. Цитата B.V. @ Ну-ка, приведи пример, где и какая функция рисования GDI по-разному работает с альфой в зависимости от ROP Зачем мне приводить пример? Попробуй сам. Цитата antonn @ затирает, поэтому используется лишь еще один шаг с параллельным рисованием на маске для альфы, не смертельно Ничего не понял. Цитата B.V. @ Дружище, что бы создать такую кисть, надо нарисовать текстуру. Что особенного в той текстуре? (качество плохое) Я думаю что-то из стандартных, в крайнем случае можно DIB заюзать. А насчет декоративных узоров, то, я думаю, у него не только в этом окне они используются. Тоже ко всему оформлению игры, думаю что-то уже есть из текстур, а кол-во окон может меняться. Цитата B.V. @ Но советовать это в качестве легального метода -- некорректно. Объясни почему? Что ужасного в этом методе? Я не могу понять почему так? В винде ресурсы темы хранятся в таком формате, стандартные функции работают с таким форматом - почему нелегально? |
|
Сообщ.
#18
,
|
|
|
|
Цитата Ничего не понял. GDI затирает альфу, поэтому рисуются одновременно два изображения - RGB и в grayscale альфа, потом собираются в один 32-х битный растр и отдаются функции http://desksoft.ru/index.php?forum=13&th=187 |
|
Сообщ.
#19
,
|
|
|
|
Цитата antonn @ GDI затирает альфу, поэтому рисуются одновременно два изображения - RGB и в grayscale альфа, потом собираются в один 32-х битный растр и отдаются функции Вот пример, где я рисую стандартными функциями поверх альфаканала. Покажи где затирается альфа? ![]() Прикреплённый файл ROPAlpha.rar (19.19 Кбайт, скачиваний: 152)
|
|
Сообщ.
#20
,
|
|
|
|
Цитата TheTrik @ Я написал зачем. Еще раз написать? Лучше перечитай внимательнее тему, с самого начала. Цитата TheTrik @ Ссылку я дал, там только средства GDI используются встроенные. Встроенные средства? Если функция вызывает GDI-функции в последствии, это еще не говорит, что функция аналогична вызову GDI-функции. Цитата TheTrik @ Зачем мне приводить пример? Попробуй сам. О, да, спасибо за совет. А то я тут полез утверждать всякую ересь безосновательно, не имея никакого опыта и теоретических знаний Цитата TheTrik @ В винде ресурсы темы хранятся в таком формате, стандартные функции работают с таким форматом - почему нелегально? В винде 32-битные ресурсы хранятся в форматах PNG и ICO. Стандартные функции GDI не работают с альфой. В общем, еще раз: учи матчасть Цитата GDI renders opaque, aliased geometries such as polygons, ellipses and lines. It renders aliased and ClearType text, and it can support transparency blending through the AlphaBlend API. However, its handling of transparency is inconsistent and most GDI APIs simply ignore the alpha channel. Few GDI APIs guarantee what the alpha channel will contain after an operation. Цитата TheTrik @ Вот пример, где я рисую стандартными функциями поверх альфаканала. Покажи где затирается альфа? Во-первых, как я говорил выше, Line != MoveTo/LineToEx, во-вторых, не вижу альфа-растра у DC формы -- к чему этот пример? |
|
Сообщ.
#21
,
|
|
|
|
Цитата B.V. @ Лучше перечитай внимательнее тему, с самого начала. Я прекрасно слежу за темой. Цитата B.V. @ Встроенные средства? Если функция вызывает GDI-функции в последствии, это еще не говорит, что функция аналогична вызову GDI-функции. Чего-чего? Когда свойство Picture установлено, VB6 рисует в окно эту картинку посредством StretchBlt. Ты можешь заменить Set Me.Picture = Frmae(fr) на StretchBlt на форму - все тоже самое останется и скопируется вместе с альфой. Конечно по стандартному VB-шному сценарию функций вызывается побольше, но это не имеет значения, т.к. оно работат и напрямую используя GDI Цитата B.V. @ Ну видимо безосновательно, раз я привел пример опровергающий твое высказывание:О, да, спасибо за совет. А то я тут полез утверждать всякую ересь безосновательно, не имея никакого опыта и теоретических знаний Цитата B.V. @ Во-первых, GDI затирает альфу нулем. Что не так? Цитата B.V. @ Стандартные функции GDI не работают с альфой. В общем, еще раз: учи матчасть Сам то учил? Я прекрасно вижу что там написано и знаю что говорю. 2-примера я привел где используются только ресурсы GDI и альфа не затирается. Ты тему сам читаешь? Ты мне написал что GDI затирает альфу, я тебе привел примеры где это опровергается. Ты мне сам скинул цитату где описывается что альфа канал большинством функций игнорируется что ты хочешь этим сказать? Цитата B.V. @ В винде 32-битные ресурсы хранятся в форматах PNG и ICO. Ты думаешь я это с головы беру? Вот BETA1_BITMAP00386_BMP.rar (2.09 Кбайт, скачиваний: 139)
пример ресурса из темы с альфа каналом. Какой у него формат? Цитата B.V. @ Во-первых, как я говорил выше, Line != MoveTo/LineToEx Конечно. Смотри внимательней код. Там BF, и используется Rectangle. Соответственно я могу заменить все Line на Rectangle и будет тоже самое. Цитата B.V. @ не вижу альфа-растра у DC формы -- к чему этот пример? Это троллинг? Ты код посмотри сначала. Как там не может быть альфы, если окно поддерживает полупрозрачность (это можно заметить на белом фоне (тень))? А вот как найдешь альфу, тогда и поймешь к чему этот пример. Ок? |
|
Сообщ.
#22
,
|
|
|
|
Что там делает VB своими методами, давай это оставим за плоскостью обсуждаемой темы. Если мы говорим о GDI, мы говорим о функциях GDI32.dll, а не VB
Цитата TheTrik @ 2-примера я привел где используются только ресурсы GDI и альфа не затирается. Ты тему сам читаешь? Ты мне написал что GDI затирает альфу, я тебе привел примеры где это опровергается. Ты мне сам скинул цитату где описывается что альфа канал большинством функций игнорируется что ты хочешь этим сказать? Начнем сначала: ты не привел ни одного примера блитинга изображения посредством GDI. Ты привел пример зарисовки части изображения на полупрозрачной форме, что ничего ни подтверждает и не опровергает. Альфы у рисуемых фрагментов нет. Альфа есть у формы. Доказывать мне нечего, я тебе указал на все еще на первой странице, в посте #10 Цитата TheTrik @ пример ресурса из темы с альфа каналом. Какой у него формат? Сначала найди программу, способную корректно отрыть (даже не дать редактировать) это изображение. MS вольна внутри своих компонентов делать что угодно, и делает, не только с BMP. Но существует документация по формату, в которой нет никаких отступлений относительно четвертого байта RGBQUAD. Раз теоретически можно и MS где-то так и делает, значит, надо рекомендовать это как официальное решение вопроса? Это совершенно глупая позиция, все равно, что рекомендовать вбить гвоздь микроскопом -- ведь и не поспоришь, что это возможно |
|
Сообщ.
#23
,
|
|
|
|
Цитата B.V. @ Что там делает VB своими методами, давай это оставим за плоскостью обсуждаемой темы. Если мы говорим о GDI, мы говорим о функциях GDI32.dll, а не VB Хм... Ну тогда зачем ты писал предыдущий пост с обсуждением встроенных средств, что ты этим хотел доказать? Я тебе показал что это тоже самое что и обычные GDI функции. Цитата B.V. @ Начнем сначала: ты не привел ни одного примера блитинга изображения посредством GDI. Для чего мне приводить такой пример? Что я теперь на каждое твое неправильное высказывание должен что-то делать? Я тебе привел пример что альфа не зануляется. Для чего мне то, что я знаю с вероятностью 100% доказывать тебе? Если ты не веришь что Picture на форме рисуется через StretchBlt - это твои проблемы. Я прежде чем такое писать посмотрел это в отладчике. Цитата B.V. @ ничего ни подтверждает и не опровергает OMG! Опровергает твое неправильное высказывание о занулении альфа-компоненты.Цитата B.V. @ Альфы у рисуемых фрагментов нет. Альфа есть у формы Что за глупость? Альфа компонента есть в растре выбранном в буферный DC, поэтому UpdateLayeredWindow делает окно с 32bbp прозрачностью. Сделай GetDiBits и проверь. Цитата B.V. @ Сначала найди программу, способную корректно отрыть (даже не дать редактировать) это изображение. Программ много, например ArtIconPro, Adobe After Effect, Sony Vegas Pro, ... продолжать? Тот же photoshop показывает альфа канал в слоях. GDI+ работает также. Цитата B.V. @ Но существует документация по формату, в которой нет никаких отступлений относительно четвертого байта RGBQUAD. Раз теоретически можно и MS где-то так и делает, значит, надо рекомендовать это как официальное решение вопроса? Ну человек пишет программу на VB6, значит он пишет ее под Win, соответственно все это будет работать у него как надо. AlphaBlend работает с таким форматом, слоеные окна работают с таким форматом, VB6 - работает с таким форматом, рисуя PNG через GdipDrawImageRect растр принимает такой вот 32bpp DIB формат (опять-таки сделай GetDIBits). Я понимаю, если бы он писал кроссплатформенную реализацию, но он пишет по Win, хотя я думаю что в других ОС таже самая история. |
|
Сообщ.
#24
,
|
|
|
|
Цитата TheTrik @ Для чего мне приводить такой пример? TheTrik, ты меня не перестаешь удивлять. Set/StretchDiBits -- работа с битами, а не Bitmap-ом. Там четвертым байтом можно вертеть как заблагорассудится, их не имеет смысла обсуждать в рамках темы. Bit/Pat/StretchBlt -- имеет. 100% знаешь? Удивись тогда да проверь Цитата TheTrik @ Опровергает твое неправильное высказывание о занулении альфа-компоненты. Следующий раз будешь квотить мой пост, подумай несколько раз Цитата TheTrik @ Что за глупость? Альфа компонента есть в растре выбранном в буферный DC, поэтому UpdateLayeredWindow делает окно с 32bbp прозрачностью. Сделай GetDiBits и проверь. Вот и я себе задаю вопрос: что за глупость, TheTrik не понимает, какую альфу он задает пикселам в области рисования линий Цитата TheTrik @ Программ много, например ArtIconPro, Adobe After Effect, Sony Vegas Pro, ... продолжать? Продолжай. Только подбери еще что-нибудь в сегменте цены After Effects, а то несолидно там ArtIconPro за 40$ висеть. И несомненно, все это есть у каждого первого, кто поставил VB6 и захотел разработать программу с полупрозрачным интерфейсом Цитата TheTrik @ Я понимаю, если бы он писал кроссплатформенную реализацию, но он пишет по Win, хотя я думаю что в других ОС таже самая история. Я понимаю, если бы он вкручивал шурупы. Но раз гвозди, микроскоп просто идеален! |
|
Сообщ.
#25
,
|
|
|
|
Цитата B.V. @ TheTrik, ты меня не перестаешь удивлять. Set/StretchDiBits -- работа с битами, а не Bitmap-ом. Там четвертым байтом можно вертеть как заблагорассудится, их не имеет смысла обсуждать в рамках темы. Bit/Pat/StretchBlt -- имеет. 100% знаешь? Удивись тогда да проверь Там имелось в виду StretchBlt, просто по запарке написал про StretchDiBits (изначально я писал про StretchBlt, читай посты внимательно), исправил уже. И даже если так и было бы то это тоже относится к GDI. Цитата B.V. @ Удивись тогда да проверь Вот теперь удивись ты. Ок? Цитата B.V. @ Следующий раз будешь квотить мой пост, подумай несколько раз Я то думаю. И все что я написал - это правда. Цитата B.V. @ Вот и я себе задаю вопрос: что за глупость, TheTrik не понимает, какую альфу он задает пикселам в области рисования линий Ты сам не понимаешь походу что такое альфа канал и как с ним работать. Я не собираюсь тебе тут ничего разъяснять. Цитата B.V. @ Продолжай. Только подбери еще что-нибудь в сегменте цены After Effects, а то несолидно там ArtIconPro за 40$ висеть. И несомненно, все это есть у каждого первого, кто поставил VB6 и захотел разработать программу с полупрозрачным интерфейсом OMG! Ты меня попросил предоставить программы - я тебе предоставил. Ок? Что не так? Или это по-твоему не программы? Что теперь ты нового придумаешь? Фотошоп у каждого второго стоит. Цитата B.V. @ Я понимаю, если бы он вкручивал шурупы. Но раз гвозди, микроскоп просто идеален! Ха. Бред. |
|
Сообщ.
#26
,
|
|
|
|
B.V.
Цитата В винде 32-битные ресурсы хранятся в форматах PNG и ICO. Стандартные функции GDI не работают с альфой. В общем, еще раз: учи матчасть так же используются bmp 32-битные, в ХР это обычное явление Добавлено TheTrik а если из gdi32.dll импортнуть function LineTo(DC: HDC; X, Y: Integer): BOOL; stdcall; и ей порисовать? или function ExtTextOut(DC: HDC; X, Y: Integer; Options: Longint; Rect: PRect; Str: PChar; Count: Longint; Dx: PInteger): BOOL; stdcall; |
|
Сообщ.
#27
,
|
|
|
|
Все-таки решил сделать на чистом GDI, окно с полупрозрачностью. Как видно рамка непрозрачная, а к середине окно становится полностью прозрачным.
![]() ![]() ![]() Option Explicit Private Declare Function UpdateLayeredWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal hdcDst As Long, pptDst As Any, psize As Any, ByVal hdcSrc As Long, pptSrc As Any, ByVal crKey As Long, pblend As Long, ByVal dwFlags As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Private Declare Function CreateBitmap Lib "gdi32" (ByVal nWidth As Long, ByVal nHeight As Long, ByVal nPlanes As Long, ByVal nBitCount As Long, lpBits As Any) As Long Private Declare Function ReleaseCapture Lib "user32" () As Long Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Const WM_NCLBUTTONDOWN As Long = &HA1 Private Const HTCAPTION As Long = 2 Private Const WS_EX_LAYERED = &H80000 Private Const GWL_EXSTYLE As Long = -20 Private Const ULW_ALPHA = &H2 Private Const AB_32Bpp255 = 33488896 Private Sub Form_DblClick() Unload Me End Sub Private Sub Form_Load() Dim dc As Long Dim bmp As Long Dim obm As Long Dim col() As Byte Dim idx As Long Width = 6400: Height = 6400 DrawMode = vbMergePenNot: FillStyle = vbFSSolid: Line (1, 1)-(ScaleWidth - 2, ScaleHeight - 2), &HA0A0A0, BF FillStyle = vbFSTransparent: Line (0, 0)-(ScaleWidth - 1, ScaleHeight - 1), &H505050, B Line (10, 10)-(ScaleWidth - 11, ScaleHeight - 11), vbWhite, B DrawMode = vbMergePenNot: FillStyle = vbFSSolid: Line (10, 10)-(ScaleWidth - 11, ScaleHeight - 11), &H505050, B dc = CreateCompatibleDC(hdc) ReDim col(3) ' RGBA For idx = 127 To 0 Step -1 col(0) = (&H80& * idx) \ &H100&: col(1) = (&H80& * idx) \ &H100&: col(2) = (&H30& * idx) \ &H100&: col(3) = idx bmp = CreateBitmap(1, 1, 1, 32, col(0)): obm = SelectObject(dc, bmp) StretchBlt hdc, 138 - idx, 138 - idx, ScaleWidth - (138 - idx) * 2, ScaleHeight - (138 - idx) * 2, dc, 0, 0, 1, 1, vbSrcCopy SelectObject dc, obm: DeleteObject bmp Next SelectObject dc, obm: DeleteObject bmp DeleteDC dc Dim sz As Currency, pt As Currency SetWindowLong hwnd, GWL_EXSTYLE, GetWindowLong(hwnd, GWL_EXSTYLE) Or WS_EX_LAYERED sz = (ScaleWidth + CCur(ScaleHeight) * 4294967296#) / 10000 UpdateLayeredWindow hwnd, hdc, pt, sz, hdc, pt, 0, AB_32Bpp255, ULW_ALPHA End Sub Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) ReleaseCapture SendMessage hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0 End Sub B.V., а теперь покажи мне обнуляющуюся альфу? Как я писал - это зависит от растровой операции. StretchBlt - копирует вместе с альфа каналом - это видно из постепенного перехода в прозрачное состояние. Прикреплённый файл ROPAlpha.rar (13.16 Кбайт, скачиваний: 147)
Добавлено Цитата antonn @ а если из gdi32.dll импортнуть function LineTo(DC: HDC; X, Y: Integer): BOOL; stdcall; и ей порисовать? Рисуй, в чем проблема? |
|
Сообщ.
#28
,
|
|
|
|
Цитата Рисуй, в чем проблема? в том, что ты не рисуешь, ты копируешь. Текст нарисуй, если линию кажется бессмысленным рисовать |
|
Сообщ.
#29
,
|
|
|
|
Цитата antonn @ в том, что ты не рисуешь, ты копируешь. ![]() Что я копирую? Ты хоть знаешь что делает Line? А StretchBlt? Чем в твоем понимании отличается рисование линии от рисования прямоугольника? С текстом такое не получится напрямую, т.к. текстовые функции не поддерживают растровые операции, только через буферный битмап или самостоятельная отрисовка глифов. Второй вопрос - зачем мне рисовать? Я уже писал по этому поводу, читай выше. Я вам скинул пример, где опровергается ваше высказывание о занулении альфы, что сложно признать что вы неправы были? |
|
Сообщ.
#30
,
|
|
|
|
Цитата Ты хоть знаешь что делает Line? какая Line? конкретно у тебя что это за функция? это импорт вот этой GDI-фунции http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx или какая-то внутренняя процедура в VB которая помимо вызова GDI еще свое что-то делает? Цитата С текстом такое не получится напрямую, т.к. текстовые функции не поддерживают растровые операции, только через буферный битмап или самостоятельная отрисовка глифов. ты про это? http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx это и есть настоящий GDI |
|
Сообщ.
#31
,
|
|
|
|
Цитата antonn @ какая Line? конкретно у тебя что это за функция? Этот метод вызывает LineTo. Это не имеет разницы, там хоть Ellipse, Polygon, Rectangle или любая другая, поддерживающая растровые операции (SetRop2) также все будет работать. Цитата antonn @ это и есть настоящий GDI Я прекрасно знаю что такое GDI и как он работает в режиме пользователя и в режиме ядра. Ты читай мои сообщения внимательно. |
|
Сообщ.
#32
,
|
|
|
|
Заключая содержательную беседу
Написал небольшой демо-тест, где можно наглядно увидеть все манипуляции с альфа-каналом через GDI-функции Клик в областях изображений выводит RGBA пикселя Исходники в комплекте Прикреплённая картинка
Краткие итоги: Blt-функции игнорируют альфу Line/Fill-функции зануляют альфу Функции рисования фигур ведут себя по-разному, то зануляя, то выставляя 255 Все это при SRCCOPY и COPYPEN. Другие ROP производят изменения над альфа-каналом, но не используют их для вывода Надеюсь, вопрос исчерпан и более мы к фантастическим способностям GDI рисовать с альфой возвращаться не будем Прикреплённый файл gdi_alpha_test.7z (1.09 Мбайт, скачиваний: 113)
|
|
Сообщ.
#33
,
|
|
|
|
Цитата Blt-функции игнорируют альфу Они ее копируют согласно растровой операции. Это то о чем я тебе говорил, и твой пример это доказывает в 3-й раз. Я отлично вижу что альфа канал скопировался. Цитата B.V. @ Надеюсь, вопрос исчерпан и более мы к фантастическим способностям GDI рисовать с альфой возвращаться не будем OMG! GDI функции не производят альфа-смешивание, видимо о чем ты говоришь. Но никто не говорил что GDI функции (не считая AlphaBlend, но она не из GDI32.dll) делают альфа смешивание. Цитата Line/Fill-функции зануляют альфу Ересь. GDI функции не зануляют альфу. Это доказывают мои и твой пример. Если у тебя цвет пера (ARGB) &H00FFFFFF и используешь ты CopyPen, то у тебя естественно идет копирование и если у тебя в 4-м байте 0, то он и скопируется нулем. Если же ты используешь OR, XOR или комбинации с NOT, то у тебя альфа не затирается. Это то, о чем я здесь говорю изначально. Я показал пример, где я на полупрозрачном окне, рисую линии через обычные GDI функции и они рисуются. Цитата B.V. @ Функции рисования фигур ведут себя по-разному, то зануляя, то выставляя 255. Другие ROP производят изменения над альфа-каналом, но не используют их для вывода Нужно пользоваться ими не бездумно, а хотя бы почитать что это. Все функции рисования ведут себя одинаково, за исключением вывода текста. И не совсем понятно что значит "их"? |