Come disegnare una bitmap
Per eseguire il rendering di una bitmap, usare il metodo ID2D1RenderTarget::DrawBitmap. Nell'esempio seguente viene illustrato come utilizzare il metodo DrawBitmap per disegnare un ID2D1Bitmap. Crea l'output illustrato nella figura seguente.
Per prima cosa, crea un ID2D1Bitmap. L'esempio seguente carica una bitmap dal file di risorse dell'applicazione e la archivia come m_pBitmap. Per vedere come viene implementato il metodo LoadResourceBitmap
, fare riferimento a Come caricare una bitmap da una risorsa.
// Create a bitmap from an application resource.
hr = LoadResourceBitmap(
m_pRenderTarget,
m_pWICFactory,
L"SampleImage",
L"Image",
200,
0,
&m_pBitmap
);
Creare il ID2D1Bitmap nello stesso metodo in cui è stata creata la destinazione di rendering che verrà usata per disegnare la bitmap e rilasciare la bitmap quando viene rilasciata la destinazione di rendering.
Dopo aver creato la bitmap, eseguirne il rendering. Nell'esempio seguente viene usato il metodoDrawBitmapper eseguire il rendering di una bitmap più volte usando impostazioni di dimensioni e opacità diverse.
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;
}
Il metodoDrawBitmap non restituisce un codice di errore in caso di errore. Per determinare se un'operazione di disegno (ad esempio DrawBitmap) non è riuscita, controllare il risultato restituito dal metodo ID2D1RenderTarget::EndDraw, come illustrato nell'esempio seguente.
hr = m_pRenderTarget->EndDraw();
Il codice è stato omesso da questo esempio.
Argomenti correlati