|
|
|
Рисуем через WinAPI
|
|||
|---|---|---|---|
|
#18+
Всем привет. Проблема такая: рисую на окне общую картинку (About screen и везде через BitBlt); рисую в нужном месте битмап с текстом; накладываю на последний маску для плавного затемнения текста сверху и снизу; делаю SetTimer и двигаю текст; все перерисовываю (UpdateBMP(...) собств. ф-я). Короче все работает :-) Вот только текст мерцает. Проблема в том, что процедура перерисовки вызывается на событие WM_PAINT и из процедуры таймера, а BeginPaint-EndPaint расположены в обработчике WM_PAINT. Если поместить последние в саму UpdateBMP() то текст вообще не перерисовывается (по таймеру). Может кто понял в чем моя проблема. Если кто готов помочь, могу прислать исходник (здесь вряд ли пометится). Или подскажите пример (только не из MSDN по использованию BitBlt, а конкретно по рисованию на окне, созданном на WinAPI !) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2003, 12:18 |
|
||
|
Рисуем через WinAPI
|
|||
|---|---|---|---|
|
#18+
Примерно так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2003, 12:54 |
|
||
|
Рисуем через WinAPI
|
|||
|---|---|---|---|
|
#18+
Это подойдет, если перерисовка происходит только при сообщении WM_PAINT. А в моем случае нужно перерисовывать еще и при срабатывании таймера :-( Второй раз BeginPaint-EndPaint не напишешь же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2003, 13:10 |
|
||
|
Рисуем через WinAPI
|
|||
|---|---|---|---|
|
#18+
m-j>Это подойдет, если перерисовка происходит только при сообщении WM_PAINT. m-j>А в моем случае нужно перерисовывать еще и при срабатывании таймера :-( при получении WM_TIMER использовать InvalidateRect ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2003, 13:24 |
|
||
|
Рисуем через WinAPI
|
|||
|---|---|---|---|
|
#18+
1. можно использовать двойную буферизацию 2. убедись , что перехватил WM_ERASEBACKGROUND и ничего не сделал в ответ. 3. InvalidateRect - гиблое дело для real-time эффектов, т.к. WM_PAINT имеет вообще самый низкий приоритет и всегда находится в конце очереди (или постоянно сдвигается туда во время ожидания выборки), поэтому можно использовать RefreshWindow для непосредственной прорисовки. 4. рисуй непосредственно в девайс БЕЗ WM_PAINT и парных BeginPaint-EndPaint, т.е. просто бери GetDC(), "ручками" ограничивай видимую область, и просто рисуй. Не забудь потом удалить полученное таким вот образом DC, в MSDN очень подробно все ньюансы разжеваны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2003, 18:37 |
|
||
|
Рисуем через WinAPI
|
|||
|---|---|---|---|
|
#18+
Тут наверное стоит уточнить. Мерцает не фон (который тоже перерисовывается на WM_PAINT), а мерцает сам текст. 2 vdimas: а тебя нет ссылок на сайте M$ где все это описано, а то я тут ищу про двойную буферизацию, а мне выдает только по GDI+, OpenGL и DX. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2003, 15:28 |
|
||
|
Рисуем через WinAPI
|
|||
|---|---|---|---|
|
#18+
двойная буферизация - это прием, он не реализован на уровне API, рисуешь в некотором MemDC кусочек картинки/контрола, и по bitblt швыряешь в целевое DC. Мерцание текста от того, что сначала он стирается (т.е. рисуется фон под ним), а потом снова рисуется, двойная буферизация должна помочь. Опять же, повторюсь, проверь, что перехвачено WM_ERASEBACKGROUND, ибо по-умолчанию DefWindowProc чистит ВСЕ окно кистью, прописанной в классе окна. (window class, не С++ класс!!!), т.е. перхвати его и верни TRUE. НО, при этом твоя процедура прорисовки (по WM_PAINT) отныне отвечает за "покраску" ВСЕЙ поверхности окна. держи простейшую реализацию двойной буферизации: (c) мой :) BufferDC.h Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. BufferDC.cpp Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. надеюсь, пояснений не требуется :) обрати внимание, что эта реализация весьма эффективна (экономит время и ресурсы, пересоздает MemDC только если старый не подходит), но предназначена для работы в приложении в котором GUI работает строго в одном треде (вернее, данный класс используется строго в одном треде GUI). В принципе, почти все мои приложухи многопоточны, но GUI я всегда "кручу" только в одном треде, это типа хорошего тона. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.12.2003, 20:40 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=463&tid=2035624]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
22ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 332ms |

| 0 / 0 |
