0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
|
|
1 | |
Двойная буферизация под Win на VC++ (MFC)25.11.2011, 00:15. Показов 8291. Ответов 7
Метки нет (Все метки)
Двойная буферизация под Win на VC++(MFC) - кто-нибудь знает - это вообще возможно??
Или по-другому: можно-ли создать в MFC SDI копию объекта вида(View) и рисовать в него, а потом подменивать на ту, которая на экране? Или такой ход прокатит только на MDI?? Если только на MDI, то как? Проблема известная: при редактировании изображения остаются артефакты, изображение перерисовывается некорректно. Пробовал различные ухищрения через режим инверсии - получается какая-то кустарщина. Хочется похоронить проблемы с перерисовкой объекта вида разом и навсегда. Если кто сталкивался с проблемой(и успешно решил)помогите плиз...
0
|
25.11.2011, 00:15 | |
Ответы с готовыми решениями:
7
Двойная буферизация Двойная буферизация на С++ двойная буферизация Двойная буферизация |
7 / 7 / 12
Регистрация: 13.02.2007
Сообщений: 1,255
|
|
25.11.2011, 01:58 | 2 |
Посмотри вот эту статью, по-моему, это как раз то, что ты ищешь:
http://www.codeproject.com/gdi/flickerfree.asp Удачи, Владимир
0
|
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
|
||||||
26.11.2011, 11:58 [ТС] | 3 | |||||
Вроде и оно, и не оно. Там используется в качестве буфера bitmap, и вообще я не до конца понял как оно там работает. У меня рисование происходит в ф-ии OnMouseMovie на обычный контекст устройства pDC, старые линии я стираю с помощью режима инверсии(сначала рисую по старой линии инверсным цветом - и тем самым стираю ее, а потом рисую новую)
Вроде класс CBitmap позволяет создать виртуальный bitmap, но непонятно как в объект типа CBitmap рисовать, и как его выводить на экран.
0
|
7 / 7 / 12
Регистрация: 13.02.2007
Сообщений: 1,255
|
||||||
26.11.2011, 15:34 | 4 | |||||
Хех, за отрисовку на OnMouseMove я бы кое кому по башке на стучал есть такая вещь как OnDraw/OnPaint и Invalidate весь мир использует этот подход.
Но даже и в твоем примере можно использовать класс описанный в вышеуказанной статье для создания Double Buffer. Начиная с того момента, где ты первый раз прикасаешься к pDC, оберни его классом CMemDC и будет создан тот самый виртуальный буфер. Дальше рисуй (Polyline) используя вновь созданный объект CMemDC, а при выходе из процедуры деструктор объекта CMemDC сам скопирует все на реальный pDC. Вот и все. Код примерно будет выглядеть следующим образом:
Советую все-таки разобраться, для чего существует метод OnDraw и команда Invalidate. Простой пример, сверни свою программу по кнопке minimize, а потом разверни таким образом, чтобы не создавать движения мышкой по окну, например при помощи Alt+Tab. С уважением, Владимир
0
|
7 / 7 / 12
Регистрация: 13.02.2007
Сообщений: 1,255
|
|||||||||||
26.11.2011, 15:42 | 5 | ||||||||||
P.S. только сейчас посмотрел, что ты делаешь при отрисовке. В случае с CMemDC операции:
0
|
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
|
|
26.11.2011, 16:29 [ТС] | 6 |
Сообщение от boombastik
Сообщение от boombastik
Код
CMemDC memDC(pDC);
Сообщение от boombastik
PS: Большое спасибо, [bold]boombastik, [/bold] наконец я что-то начинаю понимать.
0
|
7 / 7 / 12
Регистрация: 13.02.2007
Сообщений: 1,255
|
||||||
26.11.2011, 17:39 | 7 | |||||
Когда я говорил про "OnDraw/Invalidate" я имел ввиду подход, который размещения отрисовки изображения окна в одном месте (одном методе). Обычно обработчик события отрисовки называется OnDraw (иногда OnPaint).
Это делается для того, чтобы не разбрасывать кусочки кода по отрисовке в разных местах, что усложняет поддержку в будущем такого приложения. Попробуй потом найди, где ты разместил отрисовку таймера в углу окна, на какое событие отрисовываются кривые и где отрисовывается заливка контура. Вместо этого, отрисовка экрана размещена в одном единственном месте: обработчике OnDraw. Этим подходом пользуется архитектура Win32 приложений, он же поддерживается библиотеками MFC. Да, OnDraw будет вызван автоматически после изменений размеров окна, на события maximize и restore, а также после того как другое окно, закрывающее твое будет отодвинуто в сторону и освободит часть пространства, которое должно быть перерисовано. Нет, OnDraw не будет вызван автоматически после того как пользователь передвинешь мышку, так же не сработает, после отсчета очередной секунды таймера (если, например, приложение изображает часы в углу). Для этих целей существует метод Invalidate, который который генерирует событие отрисовки окна, после чего автоматически вызывается обработчик OnDraw. Итак, каждый раз, когда тебе требуется отрисовать изображение по новой, просто вызывай метод Invalidate. Для твоего примера, код будет выглядеть примерно следующим образом:
Прочитать про это можно... м... фиг знает опыт, MSDN, codeproject, примеры из Platform SDK, вот, например, запись про Invalidate: http://msdn.microsoft.com/libr... lidate.asp там есть ссылка на пример с использованием UpdateWindow, его можно самостоятельно вызывать, но не нужно, он будет вызван автоматически, ну в общем-то там про это и написано. Посмотри сайт http://www.firststeps.ru/ раздел MFC, там среди первых шагов про CPaintDC.... ой... не, там ерунда, не описывают для чего и почему, а лишь показывают как это сделать. Хотя вроде есть немного, вот описание CWnd методов на-русском: http://www.firststeps.ru/mfc/s... help4.html Вот пример с OnPaint и ф-цией Invalidate: http://www.firststeps.ru/mfc/steps/r.php?19 Тебе не нужно забо
0
|
0 / 0 / 0
Регистрация: 22.09.2007
Сообщений: 314
|
|
26.11.2011, 18:22 [ТС] | 8 |
Сообщение от boombastik
Сообщение от boombastik
Спасибо большое, все что узнал - применю на практике и напишу сюда, получилось или нет
0
|
26.11.2011, 18:22 | |
26.11.2011, 18:22 | |
Помогаю со студенческими работами здесь
8
Двойная буферизация и др Двойная Буферизация двойная буферизация Двойная буферизация Двойная буферизация! Двойная буферизация Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |