Радиальная градиентная щетка C++ Direct2D

Здравствуйте, я использую Direct2D, и я использую Radial Gradient Brush, но я застрял в одном месте.

Мой Код Радиальной Градиентной кисти

struct SampleWindow: DesktopWindow

{
    //FOr Radial Gradient Brush

    ComPtr<ID2D1RadialGradientBrush> radialBrush;

    void CrateDeviceResources()
    {
        D2D1_GRADIENT_STOP stops[] =
        {
            {0.0f, COLOR_WHITE},
            {1.0f, COLOR_BLUE}
        };

        ComPtr<ID2D1GradientStopCollection> collection;
        m_target->CreateGradientStopCollection(stops, _countof(stops),collection.ReleaseAndGetAddressOf());

        D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES props = {};
        m_target->CreateRadialGradientBrush(props,collection.Get(),radialBrush.ReleaseAndGetAddressOf());
    }

    void Draw()
    {
        auto size = m_target->GetSize();
        radialBrush -> SetCenter(Point2F(size.width / 2.0f, size.height / 2.0f));
        radialBrush -> SetRadiusX(size.width / 2.0f);
        radialBrush -> SetRadiusY(size.height / 2.0f);

        auto rect = RectF(0.0f, 0.0f, size.width, size.height);
        m_target -> FillRectangle(rect,radialBrush.Get());
    }

    void MouseMoved(int x, int y, WPARAM)
    {
        auto centere = radialBrush->GetCenter();
        radialBrush->SetGradientOriginOffset(Point2F(x - centere.x, y - centere.y));
        Invalidate();
    }
}

В функции мыши двигаться, когда я использую эту строку

auto centere = radialBrush->GetCenter();

моя программа ломается, скажи мне, что

Access violation Exception

Код класса DesktopWindow:

BEGIN_MSG_MAP()
        MESSAGE_HANDLER(WM_PAINT, PaintHandler)
        MESSAGE_HANDLER(WM_DESTROY, DestroyHandler)
        MESSAGE_HANDLER(WM_SIZE, SizeHandler)
        MESSAGE_HANDLER(WM_DISPLAYCHANGE, DisplayChangeHandler)
        MESSAGE_HANDLER(WM_MOUSEMOVE, MouseMovedHandler)
    END_MSG_MAP()

LRESULT MouseMovedHandler(UINT, WPARAM wParam, LPARAM lParam,BOOL &)
    {
        MouseMoved(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam),wParam);
        return 0;
    }

     virtual void MouseMoved(int x, int y, WPARAM)
     {

     }

я делаю функцию MouseMoved виртуальной, чтобы я мог переопределить эту функцию в других моих классах. Я не могу понять, где я делаю что-то не так, пожалуйста, исправьте меня, где я должен внести исправления в мой код

1 ответ

Ответ на этот вопрос заключается в том, что функция Mouse Move перед тем, как инициализировать цель рендеринга, поэтому, чтобы избежать этой ошибки, используйте этот метод.

LRESULT MouseMovedHandler(UINT, WPARAM wParam, LPARAM lParam,BOOL &)
    {
        if (m_target)
        {
            MouseMoved(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam),wParam);
        }
        return 0;
    }

теперь код будет работать нормально

Другие вопросы по тегам