Оказывается, это было немного сложнее, чем просто использование CopyPixels.
В управляемом коде C ++ / CLI я делаю следующее:
virtual BOOL fillBitmap(CDC* dc, CBitmap* bmp)
{
WPFContainer^ page = getWPFContainer();
// Get a bitmap from the DVE page
RenderTargetBitmap ^rtb = gcnew RenderTargetBitmap(page->ActualWidth, page->ActualHeight, 96, 96, PixelFormats::Default);
rtb->Render(page);
// fill up the passed in bitmap with the bits from WPF
BITMAPINFO bmi;
ZeroMemory(&bmi, sizeof(BITMAPINFO));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = rtb->PixelWidth;
bmi.bmiHeader.biHeight = -rtb->PixelHeight; /* Use a Negative height so that we copy the bits from TOP to BOTTOM with CopyPixels below */
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = rtb->PixelWidth * rtb->PixelHeight * 4;
void* pBmpPixels;
bmp->Attach(CreateDIBSection(*dc, &bmi, DIB_RGB_COLORS, &pBmpPixels, NULL, 0));
if (NULL != pBmpPixels)
{
Int32Rect rTemp(0,0,0,0);
IntPtr ipTemp(pBmpPixels);
rtb->CopyPixels(rTemp, ipTemp, bmi.bmiHeader.biSizeImage, rtb->PixelWidth * 4);
}
return TRUE;
} override;
Затем я могу вызвать эту подпрограмму из неуправляемого кода, передаваемого в CBitmap, который я хочу заполнить. Затем я могу использовать его так же, как и любой родной CBitmap.