我正在尝试使用位图来拼贴这样的内容:
---- ---- ----
| || || |
---- ---- ----
以下面的例子为例:
CD2DBitmapBrush* m_pBitBrush;
m_pBitBrush = new CD2DBitmapBrush(GetRenderTarget(), _T("grass.bmp"));
POINT pt;
pt.x = 0;
pt.y = 0;
CRect rect = new CRect(pt, m_pBitBrush->GetBitmap()->GetSize());
pRenderTarget->FillRectangle(rect, m_pBitBrush);
for(int i = 0; i < 5; i++)
{
pt.x += 40;
rect = new CRect(pt, m_pBitBrush->GetBitmap()->GetSize());
pRenderTarget->FillRectangle(rect, m_pBitBrush);
}
当我这样做时,位图正确显示一次,但之后的每个实例都被“拉伸”(即重复最后一列像素,但不重复图像的其余部分)。
如果我更改x,则重复最右侧的列。如果我改变y,则重复底行。如果我改变x和y(沿对角线方向),角落像素将填充矩形。
x:
---- -----------
| |||||||||||||
---- -----------
y: x and y:
---- *----*
| | | |
---- *----*
---- ******
---- ******
---- ******
此外,我尝试更改第一次调用后刷子使用的图像,并且在原始图像之后没有任何内容显示。
CRect rect = new CRect(pt, m_pBitBrush->GetBitmap()->GetSize());
pRenderTarget->FillRectangle(rect, m_pBitBrush);
CD2DBitmap* bit = new CD2DBitmap(GetRenderTarget()/*pRenderTarget*/, _T("stone.bmp"));
m_pBitBrush->SetBitmap(bit);
for(int i = 0; i < 5; i++)
{
pt.x += 40;
rect = new CRect(pt, m_pBitBrush->GetBitmap()->GetSize());
pRenderTarget->FillRectangle(rect, m_pBitBrush);
}
当然,我在这里做错了,因为我是新手,但我似乎无法让这个工作。有人能指出我正确的方向吗?
答案 0 :(得分:2)
您想在SetExtendModeX(D2D1_EXTEND_MODE mode)
上使用SetExtendModeY(D2D1_EXTEND_MODE mode)
和/或CD2DBitmapBrush
。默认值似乎是D2D1_EXTEND_MODE.D2D1_EXTEND_MODE_CLAMP
,这会导致拉伸。你想要D2D1_EXTEND_MODE.D2D1_EXTEND_MODE_WRAP
。
参考:http://msdn.microsoft.com/en-us/library/windows/desktop/dd368100(v=vs.85).aspx