На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
  
> Как создать модальное окно с полупрозрачным фоном? , VB6
    Как создать модальное окно с полупрозрачным фоном? (рис)
    Прикреплённая картинка
    Прикреплённая картинка

    Как сделать такое на VB6. Предполагаю что при помощи WinAPI функции BitBlt()
    Но как это сделать? Может у кого-нибудь есть примерчик?
      Цитата
      Как создать модальное окно с полупрозрачным фоном? (рис)

      А разве это не простой Draw цикл? Он просто берёт на себя управление и не пускает в основную программу, по крайней мере, это более вероятно, чем инициализировать окно, с прозрачностью, да ещё что бы цикл отрисовки остановить...
        Смотри SetLayeredWindowAttributes
          смотрите UpdateLayeredWindow(), но рисовать его придется полностью самому
            Цитата antonn @
            смотрите UpdateLayeredWindow(), но рисовать его придется полностью самому

            Используя SetLayeredWindowAttributes ничего не придется рисовать самому.
              Можно через отдельное окно с полупрозрачностью (SetLayeredWindowAttributes). Можно отрисовать через граф. библиотеку (DirectDraw, OpenGL - насколько я знаю, так часто делают в играх). Есть еще Windows API на тему прозрачного и полупрозрачного рисования, только названия функций не помню.
                Цитата DIS @
                Есть еще Windows API на тему прозрачного и полупрозрачного рисования, только названия функций не помню.

                AlphaBlend/TransparentBlt. Только они здесь неуместны. Что б было как на скриншоте, придется рисовать PNG-маску фона и отрисовывать каждый отдельный контрол самостоятельно: Работа с PNG
                  спасибо
                    B.V., необязательно PNG, можно и bmp, а можно и вручную рисовать как тут, без всяких картинок. Тем более окно наипростейшее.
                    Сообщение отредактировано: TheTrik -
                      Цитата TheTrik @
                      а можно и вручную рисовать как тут, без всяких картинок. Тем более окно наипростейшее

                      Я же не зря написал
                      Цитата B.V. @
                      Что б было как на скриншоте

                      Там текстуры. Будешь процедурно генерировать? Что касается bmp, альфа-канал в RGBQUAD не определен. Зачем использовать то, что не является стандартом и требует специальных средств и API?
                        TheTrik
                        используя SetLayeredWindowAttributes не получится сделать то, что у автора на картинке. Так как эта функция применяет одинаковую альфу ко всему окну. А автору нужно переменную полупрозрачность, чего можно достичь создавая bmp с альфаканалом и скармливая функции мой указанной. Для окна с кнопкой и надписью проблем вообще никаких не возникнет
                          Цитата B.V. @
                          Что касается bmp, альфа-канал в RGBQUAD не определен. Зачем использовать то, что не является стандартом и требует специальных средств и API?

                          AlphaBlend, UpdateLayeredWindow "кушает" именно такой 32-битный Premultiplied RGBA.
                          Цитата B.V. @
                          Там текстуры. Будешь процедурно генерировать?

                          В GDI, GDI+ есть текстурная кисть.
                          Цитата antonn @
                          используя SetLayeredWindowAttributes не получится сделать то, что у автора на картинке.

                          Изначально я не обратил внимание на непрозрачные места. Да, нужно пользоваться UpdateLayeredWindow.
                          Сообщение отредактировано: TheTrik -
                            Цитата TheTrik @
                            AlphaBlend, UpdateLayeredWindow "кушает" именно такой 32-битный Premultiplied RGBA.

                            В Windows Bitmap нет никакого alpha, rtfm: http://en.wikipedia.org/wiki/BMP_file_format
                            Цитата TheTrik @
                            В GDI, GDI+ есть текстурная кисть.

                            Во-первых, GDI затирает альфу нулем. Во-вторых, программная отрисовка может быть оправдана только в двух случаях: оптимизация ресурсоемкости и универсальность отрисовки (например, масштабирование). Если такие задачи стоят перед автором, то -- да. Иначе это получается лишняя работа
                              Цитата 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. @
                              Иначе это получается лишняя работа

                              Много ли лишней работы, создать кисть и закрасить ей прямоугольник?
                              Сообщение отредактировано: TheTrik -
                                B.V.
                                Цитата
                                В Windows Bitmap нет никакого alpha

                                конечно нет, уже лет 15 как нет, но используется

                                TheTrik
                                Цитата
                                Нет, и пример тому выше.

                                затирает, поэтому используется лишь еще один шаг с параллельным рисованием на маске для альфы, не смертельно
                                  Цитата TheTrik @
                                  Что мешает его хранить там?

                                  Зачем создавать его там, если есть формат, по спецификации поддерживающий альфа-канал?

                                  Цитата TheTrik @
                                  Нет, и пример тому выше.

                                  Где?

                                  Цитата TheTrik @
                                  Все зависит от растровой операции.

                                  Ну-ка, приведи пример, где и какая функция рисования GDI по-разному работает с альфой в зависимости от ROP

                                  Цитата TheTrik @
                                  Много ли лишней работы, создать кисть и закрасить ей прямоугольник?

                                  Дружище, что бы создать такую кисть, надо нарисовать текстуру. А что бы повторить исходный рисунок, надо нарисовать несколько текстур. А потом еще и код отрисовки написать. Ты правда думаешь, что это проще. чем нарисовать форму целиком?

                                  Цитата antonn @
                                  конечно нет, уже лет 15 как нет, но используется

                                  Используется, конечно. Сам использую. Но советовать это в качестве легального метода -- некорректно.
                                    Цитата B.V. @
                                    Зачем создавать его там, если есть формат, по спецификации поддерживающий альфа-канал?

                                    Я написал зачем. Еще раз написать?
                                    Цитата B.V. @
                                    Где?

                                    Ссылку я дал, там только средства GDI используются встроенные.
                                    Цитата B.V. @
                                    Ну-ка, приведи пример, где и какая функция рисования GDI по-разному работает с альфой в зависимости от ROP

                                    Зачем мне приводить пример? Попробуй сам.
                                    Цитата antonn @
                                    затирает, поэтому используется лишь еще один шаг с параллельным рисованием на маске для альфы, не смертельно

                                    Ничего не понял.
                                    Цитата B.V. @
                                    Дружище, что бы создать такую кисть, надо нарисовать текстуру.

                                    Что особенного в той текстуре? (качество плохое) Я думаю что-то из стандартных, в крайнем случае можно DIB заюзать. А насчет декоративных узоров, то, я думаю, у него не только в этом окне они используются. Тоже ко всему оформлению игры, думаю что-то уже есть из текстур, а кол-во окон может меняться.
                                    Цитата B.V. @
                                    Но советовать это в качестве легального метода -- некорректно.

                                    Объясни почему? Что ужасного в этом методе? Я не могу понять почему так? В винде ресурсы темы хранятся в таком формате, стандартные функции работают с таким форматом - почему нелегально?
                                      Цитата
                                      Ничего не понял.

                                      GDI затирает альфу, поэтому рисуются одновременно два изображения - RGB и в grayscale альфа, потом собираются в один 32-х битный растр и отдаются функции
                                      http://desksoft.ru/index.php?forum=13&th=187
                                        Цитата antonn @
                                        GDI затирает альфу, поэтому рисуются одновременно два изображения - RGB и в grayscale альфа, потом собираются в один 32-х битный растр и отдаются функции

                                        Вот пример, где я рисую стандартными функциями поверх альфаканала. Покажи где затирается альфа?
                                        user posted image
                                        Прикреплённый файлПрикреплённый файлROPAlpha.rar (19.19 Кбайт, скачиваний: 152)
                                          Цитата TheTrik @
                                          Я написал зачем. Еще раз написать?

                                          Лучше перечитай внимательнее тему, с самого начала.

                                          Цитата TheTrik @
                                          Ссылку я дал, там только средства GDI используются встроенные.

                                          Встроенные средства? Если функция вызывает GDI-функции в последствии, это еще не говорит, что функция аналогична вызову GDI-функции.

                                          Цитата TheTrik @
                                          Зачем мне приводить пример? Попробуй сам.

                                          О, да, спасибо за совет. А то я тут полез утверждать всякую ересь безосновательно, не имея никакого опыта и теоретических знаний :facepalm:

                                          Цитата TheTrik @
                                          В винде ресурсы темы хранятся в таком формате, стандартные функции работают с таким форматом - почему нелегально?

                                          :facepalm:
                                          В винде 32-битные ресурсы хранятся в форматах PNG и ICO. Стандартные функции GDI не работают с альфой. В общем, еще раз: учи матчасть :rtfm:
                                          Цитата
                                          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 формы -- к чему этот пример?
                                            Цитата 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 формы -- к чему этот пример?

                                            Это троллинг? Ты код посмотри сначала. Как там не может быть альфы, если окно поддерживает полупрозрачность (это можно заметить на белом фоне (тень))? А вот как найдешь альфу, тогда и поймешь к чему этот пример. Ок?
                                            Сообщение отредактировано: TheTrik -
                                              Что там делает VB своими методами, давай это оставим за плоскостью обсуждаемой темы. Если мы говорим о GDI, мы говорим о функциях GDI32.dll, а не VB

                                              Цитата TheTrik @
                                              2-примера я привел где используются только ресурсы GDI и альфа не затирается. Ты тему сам читаешь? Ты мне написал что GDI затирает альфу, я тебе привел примеры где это опровергается. Ты мне сам скинул цитату где описывается что альфа канал большинством функций игнорируется что ты хочешь этим сказать?

                                              Начнем сначала: ты не привел ни одного примера блитинга изображения посредством GDI. Ты привел пример зарисовки части изображения на полупрозрачной форме, что ничего ни подтверждает и не опровергает. Альфы у рисуемых фрагментов нет. Альфа есть у формы. Доказывать мне нечего, я тебе указал на все еще на первой странице, в посте #10

                                              Цитата TheTrik @
                                              пример ресурса из темы с альфа каналом. Какой у него формат?

                                              Сначала найди программу, способную корректно отрыть (даже не дать редактировать) это изображение. MS вольна внутри своих компонентов делать что угодно, и делает, не только с BMP. Но существует документация по формату, в которой нет никаких отступлений относительно четвертого байта RGBQUAD. Раз теоретически можно и MS где-то так и делает, значит, надо рекомендовать это как официальное решение вопроса? Это совершенно глупая позиция, все равно, что рекомендовать вбить гвоздь микроскопом -- ведь и не поспоришь, что это возможно
                                                Цитата B.V. @
                                                Что там делает VB своими методами, давай это оставим за плоскостью обсуждаемой темы. Если мы говорим о GDI, мы говорим о функциях GDI32.dll, а не VB

                                                Хм... Ну тогда зачем ты писал предыдущий пост с обсуждением встроенных средств, что ты этим хотел доказать? Я тебе показал что это тоже самое что и обычные GDI функции.
                                                Цитата B.V. @
                                                Начнем сначала: ты не привел ни одного примера блитинга изображения посредством GDI.

                                                Для чего мне приводить такой пример? Что я теперь на каждое твое неправильное высказывание должен что-то делать? Я тебе привел пример что альфа не зануляется. Для чего мне то, что я знаю с вероятностью 100% доказывать тебе? Если ты не веришь что Picture на форме рисуется через StretchBlt - это твои проблемы. Я прежде чем такое писать посмотрел это в отладчике.
                                                Цитата B.V. @
                                                ничего ни подтверждает и не опровергает

                                                OMG! :facepalm: Опровергает твое неправильное высказывание о занулении альфа-компоненты.
                                                Цитата 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, хотя я думаю что в других ОС таже самая история.
                                                Сообщение отредактировано: TheTrik -
                                                  Цитата 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, хотя я думаю что в других ОС таже самая история.

                                                  Я понимаю, если бы он вкручивал шурупы. Но раз гвозди, микроскоп просто идеален!
                                                    Цитата 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. @
                                                    Я понимаю, если бы он вкручивал шурупы. Но раз гвозди, микроскоп просто идеален!

                                                    Ха. Бред.
                                                    Сообщение отредактировано: TheTrik -
                                                      B.V.
                                                      Цитата
                                                      В винде 32-битные ресурсы хранятся в форматах PNG и ICO. Стандартные функции GDI не работают с альфой. В общем, еще раз: учи матчасть

                                                      так же используются bmp 32-битные, в ХР это обычное явление
                                                      user posted image

                                                      Добавлено
                                                      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;
                                                      Сообщение отредактировано: antonn -
                                                        Все-таки решил сделать на чистом GDI, окно с полупрозрачностью. Как видно рамка непрозрачная, а к середине окно становится полностью прозрачным.
                                                        user posted image
                                                        ExpandedWrap disabled
                                                          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;
                                                        и ей порисовать?

                                                        Рисуй, в чем проблема?
                                                        Сообщение отредактировано: TheTrik -
                                                          Цитата
                                                          Рисуй, в чем проблема?

                                                          в том, что ты не рисуешь, ты копируешь. Текст нарисуй, если линию кажется бессмысленным рисовать
                                                            Цитата antonn @
                                                            в том, что ты не рисуешь, ты копируешь.

                                                            user posted image
                                                            Что я копирую? Ты хоть знаешь что делает Line? А StretchBlt? Чем в твоем понимании отличается рисование линии от рисования прямоугольника? С текстом такое не получится напрямую, т.к. текстовые функции не поддерживают растровые операции, только через буферный битмап или самостоятельная отрисовка глифов.
                                                            Второй вопрос - зачем мне рисовать? Я уже писал по этому поводу, читай выше.
                                                            Я вам скинул пример, где опровергается ваше высказывание о занулении альфы, что сложно признать что вы неправы были?
                                                            Сообщение отредактировано: TheTrik -
                                                              Цитата
                                                              Ты хоть знаешь что делает 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
                                                                Цитата antonn @
                                                                какая Line? конкретно у тебя что это за функция?

                                                                Этот метод вызывает LineTo. Это не имеет разницы, там хоть Ellipse, Polygon, Rectangle или любая другая, поддерживающая растровые операции (SetRop2) также все будет работать.
                                                                Цитата antonn @
                                                                это и есть настоящий GDI

                                                                Я прекрасно знаю что такое GDI и как он работает в режиме пользователя и в режиме ядра. Ты читай мои сообщения внимательно.
                                                                Сообщение отредактировано: TheTrik -
                                                                  Заключая содержательную беседу
                                                                  Написал небольшой демо-тест, где можно наглядно увидеть все манипуляции с альфа-каналом через GDI-функции
                                                                  Клик в областях изображений выводит RGBA пикселя
                                                                  Исходники в комплекте

                                                                  Прикреплённая картинка
                                                                  Прикреплённая картинка


                                                                  Краткие итоги:
                                                                  Blt-функции игнорируют альфу
                                                                  Line/Fill-функции зануляют альфу
                                                                  Функции рисования фигур ведут себя по-разному, то зануляя, то выставляя 255
                                                                  Все это при SRCCOPY и COPYPEN. Другие ROP производят изменения над альфа-каналом, но не используют их для вывода

                                                                  Надеюсь, вопрос исчерпан и более мы к фантастическим способностям GDI рисовать с альфой возвращаться не будем


                                                                  Прикреплённый файлПрикреплённый файлgdi_alpha_test.7z (1.09 Мбайт, скачиваний: 113)
                                                                    Цитата
                                                                    Blt-функции игнорируют альфу

                                                                    :facepalm: Они ее копируют согласно растровой операции. Это то о чем я тебе говорил, и твой пример это доказывает в 3-й раз.
                                                                    Я отлично вижу что альфа канал скопировался.
                                                                    Цитата B.V. @
                                                                    Надеюсь, вопрос исчерпан и более мы к фантастическим способностям GDI рисовать с альфой возвращаться не будем

                                                                    OMG! :facepalm:
                                                                    GDI функции не производят альфа-смешивание, видимо о чем ты говоришь. Но никто не говорил что GDI функции (не считая AlphaBlend, но она не из GDI32.dll) делают альфа смешивание.
                                                                    Цитата
                                                                    Line/Fill-функции зануляют альфу

                                                                    Ересь. :fool:
                                                                    GDI функции не зануляют альфу. Это доказывают мои и твой пример. Если у тебя цвет пера (ARGB) &H00FFFFFF и используешь ты CopyPen, то у тебя естественно идет копирование и если у тебя в 4-м байте 0, то он и скопируется нулем. Если же ты используешь OR, XOR или комбинации с NOT, то у тебя альфа не затирается. Это то, о чем я здесь говорю изначально. Я показал пример, где я на полупрозрачном окне, рисую линии через обычные GDI функции и они рисуются.
                                                                    Цитата B.V. @
                                                                    Функции рисования фигур ведут себя по-разному, то зануляя, то выставляя 255.
                                                                    Другие ROP производят изменения над альфа-каналом, но не используют их для вывода

                                                                    Нужно пользоваться ими не бездумно, а хотя бы почитать что это. Все функции рисования ведут себя одинаково, за исключением вывода текста. И не совсем понятно что значит "их"?
                                                                    Сообщение отредактировано: TheTrik -
                                                                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                                    0 пользователей:


                                                                    Рейтинг@Mail.ru
                                                                    [ Script execution time: 0.3536 ]   [ 24 queries used ]   [ Generated: 4.06.26, 07:25 GMT ]