Привет всем и спасибо за внимание.Это продолжение исходного вопроса, опубликованного здесь .
У меня есть базовый класс, который я определяю таким образом:
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;
}
Я хочу нарисовать случайное количество эллипсов и прямоугольниковна экране, поэтому я сначала выясняю эти случайные числа, создаю массив 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();
}
}
Это должно было сработать, но это не так.Кроме того, после этого я понимаю, что мне лучше создать массив в какой-то функции инициализации и вызвать рисование массива в функции OnRender.Пожалуйста, помогите !!
РЕДАКТИРОВАТЬ: Хорошо, у меня есть формы, работающие с указателями, проблема заключается в построении массива.Итак, у меня есть что-то вроде этого:
MyD2DRectangle rect1;
MyD2DEllipse ell1;
DrawableShape *shape1 = &rect1;
DrawableShape *shape2 = &ell1;
shape1->DrawShape(m_pRenderTarget);
shape2->DrawShape(m_pRenderTarget);
Это, кажется, работает само по себе.Как я могу создать массив DrawableShape без нарезки?