Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Мерцание BitMap BitBlt рисование |
Автор: Oreshin 10.9.2007, 10:10 | ||
У меня проблема с мерцанием, вроде ба как понял надо битмап и битблт юзать. Но что то у меня ни как не получается, у меня теперь рисуется все черно-белое и мерцание как было так и осталось. Вот код:
|
Автор: Alexeis 10.9.2007, 10:27 | ||
Разумеется, ведь рисовать нужно на битмапе, а потом битмап рисовать на окне.
и дальше по тексту везде нужно заменить. т.е. все рисовать на невидимой поверхности, которую потом рисовать одной операцией. |
Автор: zkv 10.9.2007, 11:04 |
добавлю насколько я помню правильно так: CreateCompatibleBitmap(hdc //... те создавать битмап совместимый с исходным контекстом, а то проблема с глубиной цвета может быть. явно лишнее |
Автор: Oreshin 10.9.2007, 12:51 | ||
Сделал соответствующие поправки в коде. Теперь у меня на экране появляются цветные элементы которые я рисую, но к сожалению вся область за исключением тех элементов каторые я рисую закрашивается черным цветом ![]() ![]() с частотой 100 Гц. Вот код после исправлений:
|
Автор: Andrey44 10.9.2007, 13:08 |
Так сделай FillSolidRect() - нужным цветом ![]() Добавлено через 1 минуту и 34 секунды И обработай WM_ERASEBKGND ![]() |
Автор: Alexeis 10.9.2007, 13:13 |
Это все делается в обработчике WM_PAINT? |
Автор: Andrey44 10.9.2007, 15:05 |
FillSolidRect() - в WM_PAINT WM_ERASEBKGND - return true; ![]() |
Автор: zkv 10.9.2007, 15:09 |
Andrey44, я думаю Alexeis в курсе, и не у тебе спрашивал ![]() |
Автор: Andrey44 10.9.2007, 17:34 |
![]() ![]() Извиняюсь за пост не по теме ![]() |
Автор: Oreshin 10.9.2007, 19:54 |
Да это все в WM_PAINT делается, а то что мне посоветовали я завтра на работе с утра попробую и напишу результат. |
Автор: Oreshin 11.9.2007, 08:56 | ||
Стал рисовать и то что я в ПАИНТЕ рисую и те элементы которые в КРЕАТЕ после hdc = GetDC(hwnd) на hdc = BeginPaint(hwnd,&sp); И мерцания по меньше стало после добавления SetForegroundWindow(hwnd); Сейчас сделаю фон как советовал Andrey44 через FillSolidRect(), а точнее через FillRect() т.к. если я не ошибаюсь то FillSolidRect() в WinAPI нет ![]() Исправленный код:
|
Автор: zkv 11.9.2007, 09:11 |
Oreshin, WM_ERASEBACKGROUND (забыл как дословно, догадаешься) обработал? нужно просто TRUE вернуть. PS о чем говорил Andrey44. |
Автор: Alexeis 11.9.2007, 09:34 | ||
Все еще рисуется на окне, а не на битмапке. |
Автор: Oreshin 11.9.2007, 13:41 |
Теперь все на битмапе рисую, и кстати говоря решил пока что не использовать WM_ERASEBKGND, а то с ним глючит сильно. Я фон по методу FillRect() сделал и вроде все нормально пока что ![]() НО появилась фигня какая-то ![]() Я обнавляю изображение через InvalidateRact() с частотой 100 Гц и спустя полторы секунды у меня перестае отображаться bitmap ![]() ![]() А может у кого ни то есть примерчик с решением проблемы мерцания ![]() ![]() |
Автор: Alexeis 11.9.2007, 13:56 |
Все выделенные битмапы, кисти, иконки должны быть удалены, а контексты освобождены по выходу. |
Автор: Oreshin 11.9.2007, 14:15 |
Как освободить битмап и контекст? |
Автор: Alexeis 11.9.2007, 14:26 |
Контекст ReleaseDC(); битмап DeleteObject(); |
Автор: zkv 11.9.2007, 14:56 |
это тебе действительно нужно? BeginPaint() есть, а где EndPaint()? |
Автор: Oreshin 12.9.2007, 09:27 |
Не хватало DeleteDC(); Большое ВСЕМ СПАСИБО за помощь и терпение ![]() |
Автор: Podarochek 28.2.2009, 18:50 |
извините, что не по теме ![]() как вы это делаете..оч. инетерсно! |
Автор: Alexeis 28.2.2009, 19:52 |
Podarochek, например по таймеру. Таймер дает разрешение в 10мс, т.е. как раз 100Гц. Добавлено через 44 секунды хотя нафик это нада, больше 25 Гц все равно не воспринимается. |
Автор: Podarochek 28.2.2009, 19:58 |
а...![]() ![]() |