Тройная буфферизация

Тема в разделе "WASM.BEGINNERS", создана пользователем sometime, 26 авг 2009.

  1. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    Сабж собственно в чём - нужно вывести картинку на дисплей - не проблема, двойная буфферизация решает...Но когда нужно вывести картинку проXOR-еную ,например с зелёным цветом - у меня начались трудности.
    Сделал таким макаром:
    Код (Text):
    1. case WM_PAINT:
    2.  
    3. hMainDC = BeginPaint( hMainWnd );
    4. hSrcDC = CreateCompatibleDC( hMainDC );
    5. hBackDC = CreateCompatibleDC( hMainDC );
    6. SelectObject( hSrcDC, hImage );
    7. hBackBrush = CreateSolidBrush( RGB(0,0,255) );
    8. SelectObject( hBackDC, hBackBrush );
    9.  
    10. ExtFloodFill( hBackDC,...., FLOODFILLBORDER );
    11.  
    12. StretchBlt( hBackDC,....,hSrcDC, SRCERASE );
    13.  
    14. StretchBlt( hMainDC,....,hBackDC, SRCCOPY );
    15.  
    16. DeleteObject( hSrcDC...etc );
    17. EndPaint( hMainDC );
    код такой потому что щас с нечего закопипастить, все там по другому, вот по новой вручную суть передал.

    Такой вариант не проходит - первый StretchBlt возвращает ошибку, поменял на BitBlt - ошибки не возвращает, но и ничего не рисует. Возможно у меня понимание не правильное - подскажите плз, мож кто парился с этим уже.
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Создаёшь зелёный битмап, копируешь исходный битмап поверх него операцией SRCINVERT. Вроде всё.
     
  3. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    ну этот вариант я на крайняк оставил, а то как то не "правильно" - в ресурсы еще битмап для затирки сунуть:)
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    А зачем тут тройная буферизация? Какую ошибку возвращает StretchBlt?
     
  5. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    По другому не понимаю как можно два изображения без мерцания проXOR-ить или проендить, только с помощью дополнительного буффера...

    StretchBlt возвращает 0, на мсдн - ничего нет описаного что бы получить более подробную информацию об ошибке.

    вот код:
    Код (Text):
    1.             hMainDC = BeginPaint( hMainWnd, &ps );
    2.  
    3.             hSrcDC = CreateCompatibleDC( hMainDC );
    4.             hBackDC = CreateCompatibleDC( hMainDC );
    5.             SelectObject( hSrcDC, (HGDIOBJ)hImage );
    6.             hBackBrush = CreateSolidBrush(RGB(0,255,0));
    7.             if (hBackBrush != NULL) {
    8.                 hOldLockBrush = SelectObject( hBackDC, hBackBrush  );
    9.                 ExtFloodFill(
    10.                             hBackDC,
    11.                             0, 0, 0,
    12.                             FLOODFILLBORDER);
    13.  
    14.                 StretchBlt(
    15.                         hBackDC,
    16.                         0, 0,
    17.                         MainWndWidth,
    18.                         MainWndHeight,
    19.                         hSrcDC,
    20.                         0, 0,
    21.                         ImageProp.bmWidth,
    22.                         ImageProp.bmHeight,
    23.                         PaintMode );
    24. GetLastError();
    25.                 StretchBlt(
    26.                         hMainDC,
    27.                         0, 0,
    28.                         MainWndWidth,
    29.                         MainWndHeight,
    30.                         hBackDC,
    31.                         0, 0,
    32.                         ImageProp.bmWidth,
    33.                         ImageProp.bmHeight,
    34.                         SRCCOPY );
    35.  
    36.                 SelectObject( hBackDC, hOldLockBrush );
    37.                 DeleteObject( hBackBrush );
    38.                 DeleteObject( hBackDC );
    39.                 DeleteObject( hSrcDC );
    40.             }
    41.             EndPaint( hMainWnd, &ps );
    42.             break;
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Честно говоря не стал вникать как у тебя сделано и что именно надо. Сделал по быстрому xor по зелёному цвету. Вся обработка в WM_CREATE и WM_PAINT.
     
  7. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    почитал что у ты предложил...попробую чуток переделать под себя.

    смысл в том что мне надо как бы динамически менять битмап - слайдшоу. Но один из вариантов - перед сменой картинки проксорить её с зелёным цветом.

    у тебя там сначала картинка копируется,а потом ксорится цветом - попробую так. Спасиб!
    отпишусь чуть попожжей.
     
  8. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    Все переделал/тестанул - СПАСИБО!!!


    ну и понял где сабака зарыта - НЕЛЬЗЯ ДЕЛАТЬ BitBlt НА ДРУГОЙ DC

    hMainDC = BeginPaint( hMainWnd );
    BitBlt( hBackDC, ..., hSrcDC ); // вот этого нельзя
    BitBlt( hMainDC, ..., hBackDC ); // а так все гуд
    EndPaint( hMainDC );

    спасиб, тема закрыта.
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    sometime
    Как это нельзя? Первый раз такое слышу.
     
  10. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    ну вот сделал все как ты давал, раскидал все по обработчикам таймера и т.п. - все гуд, ено не копирует - ерроров нету.....думаю еще где я мог не то сделать и понял - ты в обработчике криейт делал первую копию, а потом в онпеинт на основную дисишку копировал. А у меня так все было что надо в обработчике он паинт сделать первую копию(та что с фильтром), так вообщем вся прога построина была, вот и не заканывало оно, как только перекинул копирование с фильтром в обработчик таймера, где все фильтры настраиваются - сразу заработало.....
     
  11. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Перенёс BitBlt(hBackDC, 0, 0, 1024, 768, hPatDC, 0, 0, SRCINVERT); в WM_PAINT и всё по прежнему работает, конечно не совсем правильно, так как каждый раз это делать по приходу WM_PAINT не совсем корректно.
     
  12. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    непояму я мазафаки но тогда не работало.....да и вообще FloodFill возвращал ошибку....фак)

    ща проверил все работает нормально.

    Все переделал/тестанул - СПАСИБО!!!

    //в пре-предыдущем моем посте
    //все что тут вытереть попрошу - сори! сам не знаю как так получилось, а теперь еще кто
    //почитает и подумает что так должно быть))

    спасиб, тема закрыта.
     
  13. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    у меня фул скрин окно+ перекрытий не намечается(он топ), т.е. паинт будет происходить только при смене изображения - лишний копи, думаю в таком случае ничего не сделает страшного. Я вот вообще видел примеры лихие когда создают / удаляют /подгружают битмапы и все это в он пеинт( на меня не смотреть - я так уже по ихнему делал,а то уже не мог понять в чём ошибка)
     
  14. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Там в двух местах надо DeleteDC() вместо DeleteObject().
     
  15. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    AsmGuru62
    Безотносительно к творчеству sometime:
    теоретически - надо, а на деле - DeleteObject вместо DeleteDC таки тоже годится
    (подробнее - http://www.rsdn.ru/forum/winapi/1698145.all.aspx)
     
  16. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    да я все переделал вообще и создание DC в криейте окна так что DeleteDC и DeleteObject не нужны:) правда можна было бы и поудалять за собой в WM_CLOSE но та винда тварь и пускай сама за мной срань убирает))

    У меня тут еще вопросик возник - StrechBlt() когда битмап который я выводить собрался меньше моего окна на которое вывод происходит - все гуд, а когда битмап больше - сжимает, но появляются странные пикселя/линии - ублюдства дорисовывает GDI-шка. Так должно быть? или я чёт не правльно сделал...
     
  17. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    1) ругаться не обязательно
    2) линии и пиксели получаются в результате применения алгоритма сжатия изображения, реализованного в Windows
    3) убирать за собой надо все, или вас в детстве этому не научили
     
  18. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    max7C4
    1)..ок.)
    2)т.е. никуда не денешся - плохой алгоритм),где лучше, не подскажете?
    3)ну да - хороший тон программирования.
     
  19. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Попробуй: SetStretchBltMode(hdc, COLORONCOLOR);
     
  20. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    Booster
    Спасибки! Оно самое. Чет я плохо пробовал раньше,видать не с тем параметром и подумал что не тут надо копать. А как оказалось шел именно туда куда надо)