редактор изображения (мерциние)
От: Sazon  
Дата: 27.03.14 12:22
Оценка:
Здравствуйте. Есть MDI-приложение для визуализации космических снимков. Нужно написать редактор, который позволяет рисовать на снимках какие-нибудь полигоны, ломаные линии и точки, а затем все это сохранять в shape файл. Все написал, кроме нормальной визуализации геометрических объектов: происходит нестабильное мерцание в процессе рисовании линий. Сам редактор выполнен в виде класса наследника от Cwnd (как тут ,пример, http://www.codeproject.com/Articles/6607/CDiagramEditor-DIY-vector-and-dialog-editor) и используется как дочернее окно вида, который содержим сам снимок.

Вот как выглядит обработчик:

void CWindowImageEditor::OnPaint() //CWindowImageEditor — класс редактора
{
// TODO: add draw code for native data here
CPaintDC pDC(this);
CRect viewRect;
GetWindowRect(viewRect);
CDC memDC;
memDC.CreateCompatibleDC(&pDC);
CBitmap* oldBmp = memDC.SelectObject(m_viewBitmap); //m_viewBitmap — bitmap вида, обновляется в CView::OnDraw() при изменении снимка (увеличение, уменьшение, скроллирование и т.д)
pDC.BitBlt(0, 0, viewRect.Width(), viewRect.Height(), &memDC, 0, 0, SRCCOPY);
m_objectContainer.DrawObjects(); //рисование самих линий в контекст (pDC->MoveTo...pDC->Line)
memDC.SelectObject(oldBmp);//по идее не обязательно
}

Пробовал с CMemDC, ничего не получилось. Причем запускал редактор на двух машинах, на одной не мерцало.

Заранее благодарен.
Re: редактор изображения (мерциние)
От: Serpuh фотомер.рф
Дата: 27.03.14 14:35
Оценка:
Для рисования фигур и картинок удобно GDI+ использовать. Чтоб не было мерцания нужна двойная буферизация http://www.rsdn.ru/article/multimedia/doublebuffering.xml
Автор(ы): Антонов Николай
Дата: 17.04.2005
Рассматривается пример использования GDI+ и двойной буферизации в стиле GDI.
Re: редактор изображения (мерциние)
От: VladFein США  
Дата: 01.04.14 13:45
Оценка:
Здравствуйте, Sazon, Вы писали:

S>Пробовал с CMemDC, ничего не получилось.


Нужна двойная буферизация, как сказал Serpuh.
Она "почти" есть, нужно только рисовать на memDC, до pDC.BitBlt()
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.