我需要使用Direct2D绘制位图的部分(非矩形),如下图所示。就像在Photoshop中,用户可以基于所选区域(HRGN
)创建新图层并四处移动一样。我能够找到的最接近的示例是here,但我无法使其正常工作。有人知道该怎么做吗?
谢谢
编辑
似乎人们误解了我想要实现的目标。这个新的动画GIF应该可以更好地解释它。
void HRGN_to_D2Bitmap(const DWORD bmpWidth, const DWORD bmpHeight, HRGN hShape, ID2D1RenderTarget* pRT, ID2D1Bitmap** ppBmpMask)
{
boost::scoped_ptr<unsigned char> pBmpBuff(new unsigned char[bmpWidth * bmpHeight]);
DWORD dwCount;
LPRGNDATA pRgnData;
memset(pBmpBuff.get(), 0, bmpWidth * bmpHeight);
dwCount = ::GetRegionData(hShape, 0, NULL);
boost::scoped_ptr<unsigned char> pRgnBuff(new unsigned char[dwCount]);
pRgnData = reinterpret_cast<LPRGNDATA>(pRgnBuff.get());
if (dwCount == ::GetRegionData(hShape, dwCount, pRgnData))
{
DWORD i, y;
RECT* pRect;
D2D1_BITMAP_PROPERTIES bmpPorp;
D2D1_SIZE_U bmpSize = D2D1::SizeU(bmpWidth, bmpHeight);
pRect = (RECT*)pRgnData->Buffer;
for (i = 0; i < pRgnData->rdh.nCount; i++)
{
for (y = (DWORD)pRect->top; ((y < (DWORD)pRect->bottom) && (y < bmpHeight)); y++)
memset(&pBmpBuff.get()[(y * bmpWidth) + pRect->left], 0xFFFFFFFF, pRect->right - pRect->left);
pRect++;
}
bmpPorp.dpiX = 0.0f;
bmpPorp.dpiY = 0.0f;
bmpPorp.pixelFormat.format = DXGI_FORMAT_A8_UNORM;
bmpPorp.pixelFormat.alphaMode = D2D1_ALPHA_MODE_STRAIGHT;
pRT->CreateBitmap(bmpSize, pBmpBuff.get(), bmpWidth, bmpPorp, ppBmpMask);
}
}
为了简单起见,我省略了大多数错误检查。函数返回时,最后一个参数应该具有有效的位图掩码(如果一切都正常工作),以供FillOpacityMask
的ID2D1RenderTarget
函数使用。现在我们需要将ID2D1Bitmap
转换为ID2D1BitmapBrush
。
D2D1_BITMAP_BRUSH_PROPERTIES propertiesXClampYClamp = D2D1::BitmapBrushProperties(
D2D1_EXTEND_MODE_CLAMP,
D2D1_EXTEND_MODE_CLAMP,
D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR
);
pRT->CreateBitmapBrush(pOrigBmp, propertiesXClampYClamp, &bkBrush);
pOrigBmp
是我们要移动的图像,bkBrush
是指向ID2D1BitmapBrush
的指针。如果您有一个HBITMAP
或<<< [C ++ Builder某个TBitmap
,则可以找到将位图转换为ID2D1Bitmap
here的指令。现在,每次您要绘制窗口时,都可以简单地执行此操作:
pRT->SetAntialiasMode(D2D1_ANTIALIAS_MODE_ALIASED);
pRT->FillOpacityMask(pBmpMask, bkBrush, D2D1_OPACITY_MASK_CONTENT_GRAPHICS);
pRT->SetAntialiasMode(D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
为了移动图像,我们必须使用SetTransform
。 pBmpMask
是使用ID2D1Bitmap
创建的HRGN_to_D2Bitmap
。即:
ID2D1Bitmap* pBmpMask;
HRGN_to_D2Bitmap(bmpWidth, bmpHeight, hShape, pRT, &pBmpMask);
希望这会有所帮助。山姆