网上看了不少资料,其中某篇是用笔刷画的。这样做仅适用于图片可以一次贴完的情况下。
若想要贴图片的一部分 必须要用到rendertarget的 drawbimap方法。而不是用笔刷来画。
如下的函数比较符合人类适用习惯
void Draw(const D2D1_RECT_F& rcDest, const D2D1_RECT_F& rcSrc)
{
//计算缩放值
//使用了默认参数,使用整张图片
D2D1_RECT_F rf= rcSrc;
if (rf.right - rf.left == 0)
{
D2D1_SIZE_F sf = m_pBitmap->GetSize();
if (sf.width == 0 || sf.height == 0)
return ;
rf.right = sf.width;
rf.bottom = sf.height;
}
/*float dstWidth = rcDest.right - rcDest.left;
float srcWidth = rf.right - rf.left;
float dstHeight = rcDest.bottom - rcDest.top;
float srcHeight = rf.bottom - rf.top;
float scaleX = dstWidth / srcWidth;
float scaleY = dstHeight / srcHeight;
// Translate for the bitmap brush.
D2D1::Matrix3x2F final,trans,scale;
trans= D2D1::Matrix3x2F::Translation(D2D1::SizeF(rcDest.left, rcDest.top));
scale=D2D1::Matrix3x2F::Scale(scaleX,scaleY);
final = scale*trans;
m_pRenderTarget->SetTransform(final);*/
m_pRenderTarget->DrawBitmap(m_pBitmap, rcDest, 1,D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR, rf);
// Demonstrate a bitmap brush.
//m_pRenderTarget->FillRectangle(&rf, m_pBitmapBrush);
//恢复transform
m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
}
其中注释掉的部分是原来的实现。用在这里算是笔刷来绘制的备份吧。如果图片并不可以重复使用的话(比如用来铺地板),那么还是每次都drawbitmap比较好。
图片画刷,只是微软表明,有这个功能罢了。当然,他可以通过辐射,或者其他东西来实现很特殊的效果。这就需要摸索了。
正常情况下,用于界面的贴图,2d地图的绘制,都使用drawbitmap比较好。