Рисование растрового рисунка
Для отрисовки растрового изображения используйте метод ID2D1RenderTarget::D rawBitmap . В следующем примере показано, как использовать метод DrawBitmap для рисования ID2D1Bitmap. Он создает выходные данные, показанные на следующем рисунке.
Сначала создайте ID2D1Bitmap. В следующем примере загружается растровое изображение из файла ресурсов приложения и сохраняется как m_pBitmap. (Чтобы узнать, как LoadResourceBitmap
реализуется метод, см . статью Как загрузить растровое изображение из ресурса.)
// Create a bitmap from an application resource.
hr = LoadResourceBitmap(
m_pRenderTarget,
m_pWICFactory,
L"SampleImage",
L"Image",
200,
0,
&m_pBitmap
);
Создайте ID2D1Bitmap в том же методе, в котором был создан целевой объект отрисовки, который будет использоваться для рисования растрового изображения, и отпустите растровое изображение при освобождении целевого объекта отрисовки.
Создав точечный рисунок, отрисуй его. В следующем примере метод DrawBitmap используется для отрисовки растрового изображения несколько раз с использованием различных параметров размера и непрозрачности.
HRESULT DrawBitmapExample::OnRender()
{
HRESULT hr;
hr = CreateDeviceResources();
if (SUCCEEDED(hr))
{
// Retrieve the size of the render target.
D2D1_SIZE_F renderTargetSize = m_pRenderTarget->GetSize();
m_pRenderTarget->BeginDraw();
m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));
// Paint a grid background.
m_pRenderTarget->FillRectangle(
D2D1::RectF(0.0f, 0.0f, renderTargetSize.width, renderTargetSize.height),
m_pGridPatternBitmapBrush
);
// Retrieve the size of the bitmap.
D2D1_SIZE_F size = m_pBitmap->GetSize();
D2D1_POINT_2F upperLeftCorner = D2D1::Point2F(100.f, 10.f);
// Draw a bitmap.
m_pRenderTarget->DrawBitmap(
m_pBitmap,
D2D1::RectF(
upperLeftCorner.x,
upperLeftCorner.y,
upperLeftCorner.x + size.width,
upperLeftCorner.y + size.height)
);
// Draw the next bitmap below the first one.
upperLeftCorner.y = upperLeftCorner.y + size.height + 10.f;
// Scale the bitmap to half its size using the linear
// interpolation mode and draw it.
float scaledWidth = size.width / 2.f;
float scaledHeight = size.height / 2.f;
m_pRenderTarget->DrawBitmap(
m_pBitmap,
D2D1::RectF(
upperLeftCorner.x,
upperLeftCorner.y,
upperLeftCorner.x + scaledWidth,
upperLeftCorner.y + scaledHeight),
1.0,
D2D1_BITMAP_INTERPOLATION_MODE_LINEAR
);
// Draw the bitmap at half its size and half its opacity.
upperLeftCorner.y = upperLeftCorner.y + size.height / 2.f + 10.f;
m_pRenderTarget->DrawBitmap(
m_pBitmap,
D2D1::RectF(
upperLeftCorner.x,
upperLeftCorner.y,
upperLeftCorner.x + scaledWidth,
upperLeftCorner.y + scaledHeight),
0.5,
D2D1_BITMAP_INTERPOLATION_MODE_LINEAR
);
// Draw a series of bitmaps with different opacity and
// rotation angles.
upperLeftCorner.y = upperLeftCorner.y + scaledHeight + 20.f;
m_pRenderTarget->DrawBitmap(
m_pBitmap,
D2D1::RectF(
upperLeftCorner.x,
upperLeftCorner.y,
upperLeftCorner.x + scaledWidth,
upperLeftCorner.y + scaledHeight),
0.5,
D2D1_BITMAP_INTERPOLATION_MODE_LINEAR
);
D2D1_POINT_2F lowerLeftCorner = D2D1::Point2F(upperLeftCorner.x, upperLeftCorner.y + scaledHeight);
D2D1_POINT_2F imageCenter = D2D1::Point2F(
upperLeftCorner.x + scaledWidth / 2,
upperLeftCorner.y + scaledHeight / 2
);
// Rotate the next bitmap by -20 degrees.
m_pRenderTarget->SetTransform(
D2D1::Matrix3x2F::Rotation(-20, imageCenter)
);
m_pRenderTarget->DrawBitmap(
m_pBitmap,
D2D1::RectF(
upperLeftCorner.x,
upperLeftCorner.y,
upperLeftCorner.x + scaledWidth,
upperLeftCorner.y + scaledHeight),
0.75,
D2D1_BITMAP_INTERPOLATION_MODE_LINEAR
);
m_pRenderTarget->SetTransform(
D2D1::Matrix3x2F::Rotation(-45, imageCenter)
);
// Make the last bitmap fully opaque.
m_pRenderTarget->DrawBitmap(
m_pBitmap,
D2D1::RectF(
upperLeftCorner.x,
upperLeftCorner.y,
upperLeftCorner.x + scaledWidth,
upperLeftCorner.y + scaledHeight),
1.0,
D2D1_BITMAP_INTERPOLATION_MODE_LINEAR
);
hr = m_pRenderTarget->EndDraw();
if (hr == D2DERR_RECREATE_TARGET)
{
hr = S_OK;
DiscardDeviceResources();
}
}
return hr;
}
Метод DrawBitmap не возвращает код ошибки в случае сбоя. Чтобы определить, завершилась ли операция рисования (например, DrawBitmap), проверка результат, возвращаемый методом ID2D1RenderTarget::EndDraw, как показано в следующем примере.
hr = m_pRenderTarget->EndDraw();
Код в этом примере опущен.
Связанные темы