На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
15 мая "Исходники.РУ" отмечают 20-летие присутствия в сети!
Поздравляем всех причастных и неравнодушных с юбилеем сайта!
И огромное спасибо всем, кто был с нами все эти годы!
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Direct2D, рисование в память и его вывод
Рисуется схема (линии, фигурки), цветом раскрашиваются, вообщем графическое состояние чего-то.
Изменения НЕ реал тайм (т.е. может измеряться секундами/минутами).
Хочется реализовать так:
1) Схема рисуется в память, когда происходит ее логическое изменение.
2) При работе с окном программы: перемещение схемы, изменение размера окна или масштаба схемы, использовался ранее нарисованный растр, как будто это уже готовая картинка.

Рисование происходит через вызов методов CHwndRenderTarget. Была идея создать такой объект, но он привязывается к окну и как с него вывести тоже не нашел.
Еще посещает мысли, чтоб создать какой-нибудь bitmap и в него рисовать, а потом его выводить как готовую картинку, но тоже пока ничего толкового не нашел.
Сообщение отредактировано: Black_Dragon -
MS Visual Studio 2019 (C++)
Вообщем сделал так.
OnUpdate
ExpandedWrap disabled
    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
ExpandedWrap disabled
    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.
Прикреплённая картинка
Прикреплённая картинка
MS Visual Studio 2019 (C++)
Хм... провел тесты.
Вывод текста на прямую в OnDraw2D всегда с розовой окантовкой при любом фоне... :-?
Хотя там, лично мне, уже выводить не нужно, но ситуация не понятна.
MS Visual Studio 2019 (C++)
Еще одни тесты провел: по таймеру рисовал разные изображения:
Удаление m_pBRender и повторное его создание перед каждым выводом:
ExpandedWrap disabled
    m_pBRender = new CBitmapRenderTarget();
    GetRenderTarget()->CreateCompatibleRenderTarget(*m_pBRender, CD2DSizeF(sizeTotal.cx, sizeTotal.cy));

Не очищает изображение, а повторно там рисуется и при выводе многократно накладывается. Выход: заливка фоном перед началом рисования.

Но теперь имею такую проблему: хотел подобным образом подготовить разные картинки в памяти с надписями, чтоб выводит их в нужным местах в конечном рендере. А по факту получается, что это все одна и та же область рисования?
MS Visual Studio 2019 (C++)
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,0914 ]   [ 22 queries used ]   [ Generated: 28.05.20, 15:31 GMT ]