Como desenhar um bitmap
Para renderizar um bitmap, use o método ID2D1RenderTarget::D rawBitmap . O exemplo a seguir mostra como usar o método DrawBitmap para desenhar um ID2D1Bitmap. Ele cria a saída mostrada na ilustração a seguir.
Primeiro, crie um ID2D1Bitmap. O exemplo a seguir carrega um bitmap do arquivo de recurso do aplicativo e o armazena como m_pBitmap. (Para ver como o LoadResourceBitmap
método é implementado, consulte How to Load a Bitmap from a Resource.)
// Create a bitmap from an application resource.
hr = LoadResourceBitmap(
m_pRenderTarget,
m_pWICFactory,
L"SampleImage",
L"Image",
200,
0,
&m_pBitmap
);
Crie o ID2D1Bitmap no mesmo método em que você criou o destino de renderização que usará para desenhar o bitmap e liberar o bitmap quando o destino de renderização for liberado.
Depois que o bitmap for criado, renderize-o. O exemplo a seguir usa o método DrawBitmap para renderizar um bitmap várias vezes usando diferentes configurações de tamanho e opacidade.
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;
}
O método DrawBitmap não retornará um código de erro se falhar. Para determinar se uma operação de desenho (como DrawBitmap) falhou, marcar o resultado retornado pelo método ID2D1RenderTarget::EndDraw, conforme mostrado no exemplo a seguir.
hr = m_pRenderTarget->EndDraw();
O código foi omitido neste exemplo.
Tópicos relacionados