大家好,感谢您的关注。这是发布到here的原始问题的后续内容。Direct2D - 没有任何东西被绘制到屏幕上,我用C++处理数组的方式出错了。
我有一个基类,我正是如此定义:
class DrawableShape
{
public:
virtual HRESULT DrawShape(ID2D1HwndRenderTarget* m_pRenderTarget)
{
return S_OK;
}
};
我有一个继承这个类,两者是相似的两个班,所以我列出一个:
class MyD2DEllipse : public DrawableShape
{
private:
D2D1_ELLIPSE data;
public:
MyD2DEllipse();
HRESULT DrawShape(ID2D1HwndRenderTarget* m_pRenderTarget);
};
的DrawShape功能实现是这样的:
HRESULT MyD2DEllipse::DrawShape(ID2D1HwndRenderTarget* m_pRenderTarget)
{
HRESULT hr = E_FAIL;
ID2D1SolidColorBrush* m_pBrush;
hr = m_pRenderTarget->CreateSolidColorBrush(
D2D1::ColorF(D2D1::ColorF::OrangeRed),
&m_pBrush
);
m_pRenderTarget->DrawEllipse(&data, m_pBrush, 10.f);
return hr;
}
我要画椭圆和矩形t的随机数在屏幕上,所以我首先找出这些随机数,创建一个具有该大小的DrawableShape数组(因为我不能动态地在C++中分配对象),用子对象替换父对象,然后调用draw函数该阵列,随机再次。这是我的代码的样子:
HRESULT Demo::OnRender()
{
HRESULT hr = S_OK;
hr = CreateDeviceResources();
if (SUCCEEDED(hr))
{
m_pRenderTarget->BeginDraw();
m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity());
m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White));
// Decide on # of primitives
randEllipse = 1 + (rand() % 5);
randRectangle = 1 + (rand() % 5);
totalPrimitives = randEllipse + randRectangle;
DrawableShape *shapes;
shapes = new MyShape[totalPrimitives];
for (int i=0; i<randEllipse; i++)
{
MyEllipse ellipse1;
shapes[i] = ellipse1;
}
for (int i=randEllipse; i<(randEllipse + randRectangle); i++)
{
MyRectangle rect1;
shapes[i] = rect1;
}
for (int i=0; i<totalPrimitives; i++)
{
hr = shapes[i].DrawMyShape(m_pRenderTarget);
}
hr = m_pRenderTarget->EndDraw();
}
}
这应该已经工作,但它没有。另外,写完这些之后,我意识到我最好在某种init函数中创建数组,然后在OnRender函数中调用数组的draw。请帮忙!!
编辑:好吧我有指针的形状工作,问题是数组的构造。所以我有这样的事情:
MyD2DRectangle rect1;
MyD2DEllipse ell1;
DrawableShape *shape1 = &rect1;
DrawableShape *shape2 = &ell1;
shape1->DrawShape(m_pRenderTarget);
shape2->DrawShape(m_pRenderTarget);
这似乎自行工作。如何创建DrawableShape数组而不切片?
如果您尝试避免切片,则无法创建MyShape数组,只有MyShape *。 – 2011-01-20 23:41:44