Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.37.228] |
|
Сообщ.
#1
,
|
|
|
Рисуется схема (линии, фигурки), цветом раскрашиваются, вообщем графическое состояние чего-то.
Изменения НЕ реал тайм (т.е. может измеряться секундами/минутами). Хочется реализовать так: 1) Схема рисуется в память, когда происходит ее логическое изменение. 2) При работе с окном программы: перемещение схемы, изменение размера окна или масштаба схемы, использовался ранее нарисованный растр, как будто это уже готовая картинка. Рисование происходит через вызов методов CHwndRenderTarget. Была идея создать такой объект, но он привязывается к окну и как с него вывести тоже не нашел. Еще посещает мысли, чтоб создать какой-нибудь bitmap и в него рисовать, а потом его выводить как готовую картинку, но тоже пока ничего толкового не нашел. |
Сообщ.
#2
,
|
|
|
Вообщем сделал так.
OnUpdate m_pBRender = new CBitmapRenderTarget(); GetRenderTarget()->CreateCompatibleRenderTarget(*m_pBRender, CD2DSizeF(sizeTotal.cx, sizeTotal.cy)); CRect rect(0, 0, sizeTotal.cx, sizeTotal.cy); m_pLinearGradientBrush->SetEndPoint(CPoint(sizeTotal.cx, sizeTotal.cy)); D2D1_ROUNDED_RECT r = D2D1::RoundedRect(D2D1::RectF(10.f, 10.f, 100.f, 50.f), 10.f, 10.f); m_pBRender->BeginDraw(); m_pBRender->FillRectangle(rect, m_pLinearGradientBrush); m_pBRender->DrawRoundedRectangle(r, m_pBrushLine, 5.0f); m_pBRender->FillRoundedRectangle(r, m_pBrushBG); m_pBRender->DrawText(_T("Hello, World!"), CRect(10, 100, 100, 150), m_pBlackBrush, m_pTextFormat); CD2DPointF pStart, pEnd; pStart.x = sizeTotal.cx / 2; pStart.y = sizeTotal.cy / 2; int count = 20; FLOAT len = min(sizeTotal.cx, sizeTotal.cy) / 3; CD2DSizeF ell_r(5.0f, 5.0f); for (int i = 0; i < count; ++i) { FLOAT angle = 2 * M_PI * ((FLOAT) i) / ((FLOAT) count); pEnd.x = pStart.x + len * cosf(angle); pEnd.y = pStart.y + len * sinf(angle); m_pBRender->DrawLine(pStart, pEnd, m_pBrushLine, 1.0f); CD2DEllipse ell(pEnd, ell_r); m_pBRender->DrawEllipse(ell, m_pBrushLine, 4.0f); m_pBRender->FillEllipse(ell, m_pBrushBG); } m_pBRender->Flush(); m_pBRender->EndDraw(); SetScrollSizes(MM_TEXT, sizeTotal); CScrollView::OnUpdate(pSender, lHint, pHint); OnDraw2D CPoint point = GetScrollPosition(); // apply translation transform according to view's scroll position D2D1_MATRIX_3X2_F matrix = D2D1::Matrix3x2F::Translation((float) -point.x, (float) -point.y); pRenderTarget->SetTransform(matrix); //CRect rect(0, 0, sizeTotal.cx, sizeTotal.cy); //m_pLinearGradientBrush->SetEndPoint(CPoint(sizeTotal.cx, sizeTotal.cy)); //pRenderTarget->FillRectangle(rect, m_pLinearGradientBrush); CD2DBitmap BM(pRenderTarget, _T("")); m_pBRender->GetBitmap(BM); CD2DSizeF size = BM.GetSize(); pRenderTarget->DrawBitmap(&BM, CD2DRectF(0, 0, sizeTotal.cx, sizeTotal.cy)); D2D1_ROUNDED_RECT r = D2D1::RoundedRect(D2D1::RectF(110, 10.f, 200.f, 50.f), 10.f, 10.f); pRenderTarget->DrawRoundedRectangle(r, m_pBrushLine, 5.0f); pRenderTarget->FillRoundedRectangle(r, m_pBrushBG); pRenderTarget->DrawText(_T("Hello, World!"), CRect(110, 100, 200, 150), m_pBlackBrush, m_pTextFormat); 1) Правильный подход? 2) Правильно так создавать CD2DBitmap с пустой строкой в имени файла? И увидел проблему (смотреть увеличенный фрагмент 400%): Вывод текста в OnDraw2D (правый) использует антиальясинг по текущему фону, независимо от того, в каком методе отрисовывался градиент (на картинке видны розовые окантовки от фона). А текст (левый), выводимый в OnUpdate, то он, как будто рисовался на белом фоне, и он одинаковый, независимо от того, в каком методе отрисовывался градиент. Визуально получается не красиво, без сглаживания, заметно на букве W. Прикреплённая картинка
|
Сообщ.
#3
,
|
|
|
Хм... провел тесты.
Вывод текста на прямую в OnDraw2D всегда с розовой окантовкой при любом фоне... Хотя там, лично мне, уже выводить не нужно, но ситуация не понятна. |
Сообщ.
#4
,
|
|
|
Еще одни тесты провел: по таймеру рисовал разные изображения:
Удаление m_pBRender и повторное его создание перед каждым выводом: m_pBRender = new CBitmapRenderTarget(); GetRenderTarget()->CreateCompatibleRenderTarget(*m_pBRender, CD2DSizeF(sizeTotal.cx, sizeTotal.cy)); Не очищает изображение, а повторно там рисуется и при выводе многократно накладывается. Выход: заливка фоном перед началом рисования. Но теперь имею такую проблему: хотел подобным образом подготовить разные картинки в памяти с надписями, чтоб выводит их в нужным местах в конечном рендере. А по факту получается, что это все одна и та же область рисования? |