TransparentBlt: Проблемы :(

Тема в разделе "WASM.WIN32", создана пользователем _DEN_, 7 сен 2005.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Есть четыре контекста (HDC)



    A - получен от BeginPaint

    B - получен от CreateCompatibleDC(A)

    C - получен от CreateCompatibleDC(A)

    D - получен от CreateCompatibleDC(A)



    В контекст B заселектили битмап, полученый через LoadBitmap(GetModuleHandle(0), ...)



    В контекст C заселектили битмап, полученый через CreateCompatibleBitmap(C, ...)



    В контекст D заселектили битмап, полученый через LoadBitmap(GetModuleHandle(0), ...)



    Теперь:



    TransparentBlt из C в B, а потом BitBlt из B в A - прекрасно работает.



    А вот



    TransparentBlt из D в C, потом TransparentBlt из C в B, а потом BitBlt из B в A - Дает полную лажу...



    Понимаю, что немного мутно, но может все-таки бага кому-то покажется очевидной?
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    _DEN_







    Нет, тоже неправильно :dntknw:

    Работает так, как будто C - Это черно-белая картинка :dntknw:



    Может это важно, у окна над которым так издеваются есть стиль WS_EX_LAYERED. У него есть и альфа и прозрачный цвет. В моем случае белый.
     
  3. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    _DEN_

    Я тоже наступал на эти грабли(правда без прозрачности), и пришел к выводу что решение в CreateCompatibleBitmap(A, ...)
     
  4. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    _DEN_

    Если окно уже имеет свойство полупрозрачности, имеет смысл его сначала скопировать BitBlt (..., CAPTUREBLT | SRCCOPY), и уже потом использовать TransparentBlt.
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Black_mirror







    Да та же фигня, от кого не закомпатиблиться :dntknw:



    alpet



    Не совсем понял, откуда куда скопировать? И в чем смысл?
     
  6. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    _DEN_

    Я собственно сам в сабже не сильно разобрался. Использовать BitBlt + CAPTUREBLT вообще нужно при копировании полупрозрачного окна в растр, видимо это к сабжу не относится.



    У тебя в самой задачи стоит что? Загрузить один растр(C), маскировать его вторым(D) (точнее скопировать его поверх другого, за исключением src-пикселов с выбранным цветом), потом еще раз маскировать, но уже в B и отобразить B на поверхности окна? В итоге в C, остануться черными пикселы (CreateCompatibleBitmap создает черный растр), которые были обьявлены прозрачными в D, в B остануться неизменными пикселы, что обьявлены прозрачными в C, и в A уже попадет некоторое количество пикселов от исходных растров.



    Вобщем интересно знать что из себя представляют растры для B и D, и какие цветовые ключи выбираются соотвественно. А заодно и понять что вообще требуется.
     
  7. Chib777

    Chib777 Александр

    Публикаций:
    0
    Регистрация:
    22 сен 2003
    Сообщения:
    82
    Адрес:
    Ukraine, Odessa
    Не совсем понял суть, CreateCompatibleBitmap нельзя указывать контекст устройства памяти, должно быть A (Black_mirror правильно заметил). Посмотри во всех ли контекстах выбраны растры и т.п. То что ты написал должно работать.

    В buttons.exe я тоже использую стиль WS_EX_LAYERED (только alpha) и TransparentBlt (кнопка с регионом, круглая), в файле Transparent.asm аналог функции TransparentBlt (у меня в Win9x он лучше работает).



    [​IMG] _2020814180__Transparent.zip