Direct2D - Ничто не отображается на экране, что-то не так в том, как я обрабатываю массивы в C ++ - PullRequest
2 голосов
/ 20 января 2011

Привет всем и спасибо за внимание.Это продолжение исходного вопроса, опубликованного здесь .

У меня есть базовый класс, который я определяю таким образом:

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 без нарезки?

1 Ответ

4 голосов
/ 21 января 2011

shapes - это массив MyShape экземпляров.Когда вы говорите shapes[i] = ellipse1; или shapes[i] = rect1;, вы теряете данные подкласса как часть этого назначения, которое известно как нарезка в C ++.

Таким образом, каждый вызов shapes[i].DrawMyShape(m_pRenderTarget); просто возвращает S_OK, как определено в MyShape.

Чтобы правильно использовать полиморфизм в C ++, вам нужно использовать указатели или ссылки на экземпляры MyShape (обычно выделяемые с использованием new),Если вам не разрешено делать это (домашнее задание?), Вам нужно найти способ сделать это без полиморфизма.

...