Сабж собственно в чём - нужно вывести картинку на дисплей - не проблема, двойная буфферизация решает...Но когда нужно вывести картинку проXOR-еную ,например с зелёным цветом - у меня начались трудности. Сделал таким макаром: Код (Text): case WM_PAINT: hMainDC = BeginPaint( hMainWnd ); hSrcDC = CreateCompatibleDC( hMainDC ); hBackDC = CreateCompatibleDC( hMainDC ); SelectObject( hSrcDC, hImage ); hBackBrush = CreateSolidBrush( RGB(0,0,255) ); SelectObject( hBackDC, hBackBrush ); ExtFloodFill( hBackDC,...., FLOODFILLBORDER ); StretchBlt( hBackDC,....,hSrcDC, SRCERASE ); StretchBlt( hMainDC,....,hBackDC, SRCCOPY ); DeleteObject( hSrcDC...etc ); EndPaint( hMainDC ); код такой потому что щас с нечего закопипастить, все там по другому, вот по новой вручную суть передал. Такой вариант не проходит - первый StretchBlt возвращает ошибку, поменял на BitBlt - ошибки не возвращает, но и ничего не рисует. Возможно у меня понимание не правильное - подскажите плз, мож кто парился с этим уже.
ну этот вариант я на крайняк оставил, а то как то не "правильно" - в ресурсы еще битмап для затирки сунуть
По другому не понимаю как можно два изображения без мерцания проXOR-ить или проендить, только с помощью дополнительного буффера... StretchBlt возвращает 0, на мсдн - ничего нет описаного что бы получить более подробную информацию об ошибке. вот код: Код (Text): hMainDC = BeginPaint( hMainWnd, &ps ); hSrcDC = CreateCompatibleDC( hMainDC ); hBackDC = CreateCompatibleDC( hMainDC ); SelectObject( hSrcDC, (HGDIOBJ)hImage ); hBackBrush = CreateSolidBrush(RGB(0,255,0)); if (hBackBrush != NULL) { hOldLockBrush = SelectObject( hBackDC, hBackBrush ); ExtFloodFill( hBackDC, 0, 0, 0, FLOODFILLBORDER); StretchBlt( hBackDC, 0, 0, MainWndWidth, MainWndHeight, hSrcDC, 0, 0, ImageProp.bmWidth, ImageProp.bmHeight, PaintMode ); GetLastError(); StretchBlt( hMainDC, 0, 0, MainWndWidth, MainWndHeight, hBackDC, 0, 0, ImageProp.bmWidth, ImageProp.bmHeight, SRCCOPY ); SelectObject( hBackDC, hOldLockBrush ); DeleteObject( hBackBrush ); DeleteObject( hBackDC ); DeleteObject( hSrcDC ); } EndPaint( hMainWnd, &ps ); break;
Честно говоря не стал вникать как у тебя сделано и что именно надо. Сделал по быстрому xor по зелёному цвету. Вся обработка в WM_CREATE и WM_PAINT.
почитал что у ты предложил...попробую чуток переделать под себя. смысл в том что мне надо как бы динамически менять битмап - слайдшоу. Но один из вариантов - перед сменой картинки проксорить её с зелёным цветом. у тебя там сначала картинка копируется,а потом ксорится цветом - попробую так. Спасиб! отпишусь чуть попожжей.
Все переделал/тестанул - СПАСИБО!!! ну и понял где сабака зарыта - НЕЛЬЗЯ ДЕЛАТЬ BitBlt НА ДРУГОЙ DC hMainDC = BeginPaint( hMainWnd ); BitBlt( hBackDC, ..., hSrcDC ); // вот этого нельзя BitBlt( hMainDC, ..., hBackDC ); // а так все гуд EndPaint( hMainDC ); спасиб, тема закрыта.
ну вот сделал все как ты давал, раскидал все по обработчикам таймера и т.п. - все гуд, ено не копирует - ерроров нету.....думаю еще где я мог не то сделать и понял - ты в обработчике криейт делал первую копию, а потом в онпеинт на основную дисишку копировал. А у меня так все было что надо в обработчике он паинт сделать первую копию(та что с фильтром), так вообщем вся прога построина была, вот и не заканывало оно, как только перекинул копирование с фильтром в обработчик таймера, где все фильтры настраиваются - сразу заработало.....
Перенёс BitBlt(hBackDC, 0, 0, 1024, 768, hPatDC, 0, 0, SRCINVERT); в WM_PAINT и всё по прежнему работает, конечно не совсем правильно, так как каждый раз это делать по приходу WM_PAINT не совсем корректно.
непояму я мазафаки но тогда не работало.....да и вообще FloodFill возвращал ошибку....фак) ща проверил все работает нормально. Все переделал/тестанул - СПАСИБО!!! //в пре-предыдущем моем посте //все что тут вытереть попрошу - сори! сам не знаю как так получилось, а теперь еще кто //почитает и подумает что так должно быть)) спасиб, тема закрыта.
у меня фул скрин окно+ перекрытий не намечается(он топ), т.е. паинт будет происходить только при смене изображения - лишний копи, думаю в таком случае ничего не сделает страшного. Я вот вообще видел примеры лихие когда создают / удаляют /подгружают битмапы и все это в он пеинт( на меня не смотреть - я так уже по ихнему делал,а то уже не мог понять в чём ошибка)
AsmGuru62 Безотносительно к творчеству sometime: теоретически - надо, а на деле - DeleteObject вместо DeleteDC таки тоже годится (подробнее - http://www.rsdn.ru/forum/winapi/1698145.all.aspx)
да я все переделал вообще и создание DC в криейте окна так что DeleteDC и DeleteObject не нужны правда можна было бы и поудалять за собой в WM_CLOSE но та винда тварь и пускай сама за мной срань убирает)) У меня тут еще вопросик возник - StrechBlt() когда битмап который я выводить собрался меньше моего окна на которое вывод происходит - все гуд, а когда битмап больше - сжимает, но появляются странные пикселя/линии - ублюдства дорисовывает GDI-шка. Так должно быть? или я чёт не правльно сделал...
1) ругаться не обязательно 2) линии и пиксели получаются в результате применения алгоритма сжатия изображения, реализованного в Windows 3) убирать за собой надо все, или вас в детстве этому не научили
max7C4 1)..ок.) 2)т.е. никуда не денешся - плохой алгоритм),где лучше, не подскажете? 3)ну да - хороший тон программирования.
Booster Спасибки! Оно самое. Чет я плохо пробовал раньше,видать не с тем параметром и подумал что не тут надо копать. А как оказалось шел именно туда куда надо)