使用Direct2d绘制和创建非矩形位图

问题描述 投票:0回答:2

我需要使用Direct2D绘制位图的部分(非矩形),如下图所示。就像在Photoshop中,用户可以基于所选区域(HRGN)创建新图层并四处移动一样。我能够找到的最接近的示例是here,但我无法使其正常工作。有人知道该怎么做吗?

谢谢

enter image description here enter image description here

编辑

似乎人们误解了我想要实现的目标。这个新的动画GIF应该可以更好地解释它。

enter image description here

c++ windows direct2d
2个回答
1
投票
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); } }

为了简单起见,我省略了大多数错误检查。函数返回时,最后一个参数应该具有有效的位图掩码(如果一切都正常工作),以供FillOpacityMaskID2D1RenderTarget函数使用。现在我们需要将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);

为了移动图像,我们必须使用SetTransformpBmpMask是使用ID2D1Bitmap创建的HRGN_to_D2Bitmap。即:

ID2D1Bitmap* pBmpMask; HRGN_to_D2Bitmap(bmpWidth, bmpHeight, hShape, pRT, &pBmpMask); 希望这会有所帮助。山姆
© www.soinside.com 2019 - 2024. All rights reserved.