Радиальная градиентная кисть 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 виртуальной, чтобы я мог переопределить эту функцию в других моих классах. Я не могу понять, где я делаю что-то не так, пожалуйста, исправьте меня, где я должен внести исправления в мой код.

0

Решение

ответ на этот вопрос заключается в том, что функция 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;
}

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

0

Другие решения

Других решений пока нет …