Рендеринг части растрового изображения с использованием Direct2D

#c #direct2d

#c #direct2d

Вопрос:

Я нахожусь в процессе преобразования пользовательского программного обеспечения САПР из GDI в Direct2D. У меня возникают проблемы при панорамировании чертежа. Что я хотел бы сделать, так это создать растровое изображение шириной в 3 раза больше окна рисования и высотой в 3 раза больше. Затем, когда пользователь начнет панорамирование, я бы отрисовал ту часть растрового изображения, которая должна быть видна.

Проблема в том, что не похоже, что у вас могут быть растровые изображения больше, чем ваша цель рендеринга. Вот примерно то, что я сделал до сих пор:

 // Get the size of my drawing window.
RECT rect;
HDC hdc = GetDC(hwnd);
GetClipBox(hdc, amp;rect);

D2D1_SIZE_U size = D2D1::SizeU(
    rect.right - rect.left,
    rect.bottom - rect.top
);

// Now create the render target
ID2D1HwndRenderTarget *hwndRT = NULL;

hr = m_pD2DFactory->CreateHwndRenderTarget(
    D2D1::RenderTargetProperties(),
    D2D1::HwndRenderTargetProperties(hwnd, size),
    amp;hwndRT
    );

// And then the bitmap render target
ID2D1BitmapRenderTarget *bmpRT = NULL;
// We want it 3x as wide amp; 3x as high as the window
D2D1_SIZE_F size = D2D1::SizeF(
    (rect.right - rect.left) * 3, 
    (rect.bottom - rect.top) * 3
);
hr = originalTarget->CreateCompatibleRenderTarget(
        size,
        amp;bmpRT
        );

// Now I draw the geometry to my bitmap Render target...

// Then get the bitmap
ID2D1Bitmap* bmp = NULL;
bmpRT->GetBitmap(amp;bmp);

// From here I want to draw that bitmap on my hwndRenderTarget.
// Based on where my mouse was when I started panning, and where it is
// now, I can create a destination rectangle. It's the size of my
// drawing window
D2D1_RECT_U dest = D2D1::RectU(x1, y1, x1 size.width, y1 size.height);
hwndRT->DrawBitmap(
    bmp,
    NULL,
    1.0,
    D2D1_BITMAP_INTERPOLATION_MODE_LINEAR,
    dest
    );
  

Поэтому, когда я проверяю размер своего растрового изображения, он проверяется НОРМАЛЬНО — это размер моей цели рендеринга растрового изображения, а не моей цели рендеринга hwnd. Но если я установлю для x1 amp; y1 значение 0, он должен нарисовать верхний левый угол растрового изображения (который представляет собой некоторую геометрию за пределами экрана). Но он просто рисует верхний левый угол того, что находится на экране.

Есть ли у кого-нибудь опыт работы с этим? Как я могу создать довольно большое растровое изображение, а затем отобразить его часть на цели рендеринга меньшего размера? Поскольку я выполняю панорамирование, рендеринг будет выполняться при каждом движении мыши, поэтому он должен быть достаточно производительным.

Ответ №1:

Я не эксперт по direct2d (direct3d), и то, что я обнаружил, изучая ваш исходный код и документацию, заключается в том, что вы передаете второй параметр drawBitmap — NULL вместо предоставления исходного прямоугольника вашего растрового изображения

     m_pRenderTarget->DrawBitmap(
        m_pBitmap,
        D2D1::RectF(
            upperLeftCorner.x,
            upperLeftCorner.y,
            upperLeftCorner.x   scaledWidth,
            upperLeftCorner.y   scaledHeight),
        0.75,
        D2D1_BITMAP_INTERPOLATION_MODE_LINEAR
        );
  

Я бы предложил посмотреть здесь, например

Комментарии:

1. Спасибо за предложение и ссылку. Я уже видел эту ссылку раньше — этот второй параметр указывает, какую часть вашей целевой цели рендеринга вы хотите заполнить растровым изображением. В моем случае я хочу, чтобы вся цель рендеринга была заполнена растровым изображением, поэтому я просто оставил его нулевым. AFAIK, это было бы так же, как D2D1::RectF(0, 0, size.width, size.height);

Ответ №2:

Извините за беспокойство — приведенный выше код работает нормально. Проблема была в другом месте моей кодовой базы.

Не уверен, как пометить этот вопрос как «Неважно», но, вероятно, так и должно быть.

Комментарии:

1. Возможно, вы просто захотите удалить свой вопрос, потому что, если вопрос на самом деле не был актуальным для начала, он просто будет сидеть здесь, получая трафик от Google, который никому больше не поможет.