我正在将自定义CAD软件从GDI转换为Direct2D。平移绘图时遇到问题。我想要做的是创建一个宽度是绘图窗口宽度的3倍的位图。 3倍高。然后,当用户开始平移时,我会渲染应该可见的位图部分。
麻烦的是,它看起来好像你的位图可能比渲染目标大。这是我到目前为止所做的大致:
// Get the size of my drawing window.
RECT rect;
HDC hdc = GetDC(hwnd);
GetClipBox(hdc, &rect);
D2D1_SIZE_U size = D2D1::SizeU(
rect.right - rect.left,
rect.bottom - rect.top
);
// Now create the render target
ID2D1HwndRenderTarget *hwndRT = NULL;
hr = m_pD2DFactory->CreateHwndRenderTarget(
D2D1::RenderTargetProperties(),
D2D1::HwndRenderTargetProperties(hwnd, size),
&hwndRT
);
// And then the bitmap render target
ID2D1BitmapRenderTarget *bmpRT = NULL;
// We want it 3x as wide & 3x as high as the window
D2D1_SIZE_F size = D2D1::SizeF(
(rect.right - rect.left) * 3,
(rect.bottom - rect.top) * 3
);
hr = originalTarget->CreateCompatibleRenderTarget(
size,
&bmpRT
);
// Now I draw the geometry to my bitmap Render target...
// Then get the bitmap
ID2D1Bitmap* bmp = NULL;
bmpRT->GetBitmap(&bmp);
// From here I want to draw that bitmap on my hwndRenderTarget.
// Based on where my mouse was when I started panning, and where it is
// now, I can create a destination rectangle. It's the size of my
// drawing window
D2D1_RECT_U dest = D2D1::RectU(x1, y1, x1+size.width, y1+size.height);
hwndRT->DrawBitmap(
bmp,
NULL,
1.0,
D2D1_BITMAP_INTERPOLATION_MODE_LINEAR,
dest
);
所以,当我检查我的位图的大小时,它会检出OK - 这是我的位图渲染目标的大小,而不是我的hwnd渲染目标。但是,如果我设置x1& y1到0,它应该绘制位图的左上角(这是屏幕上的一些几何)。但它只是在屏幕上显示 的左上角。
有没有人有这方面的经验?如何创建一个相当大的位图,然后在较小尺寸的渲染目标上渲染它的一部分?由于我正在平移,渲染将在每次移动鼠标时进行,因此必须具有合理的性能。
答案 0 :(得分:0)
我不是direct2d专家(direct3d),我发现在你的源和文档中找到的是你传递DrawBitmap的第二个参数 - NULL,而不是提供你的位图的源矩形
m_pRenderTarget->DrawBitmap(
m_pBitmap,
D2D1::RectF(
upperLeftCorner.x,
upperLeftCorner.y,
upperLeftCorner.x + scaledWidth,
upperLeftCorner.y + scaledHeight),
0.75,
D2D1_BITMAP_INTERPOLATION_MODE_LINEAR
);
我建议查看here例如
答案 1 :(得分:0)
不好意思 - 上面的代码运行正常。问题出在我的代码库的其他地方。
不确定如何将此问题标记为“没关系”,但这很可能是应该的。