0

こんにちは、私は Direct2D を使用しており、Radial Gradient Brush を使用していますが、1 か所で立ち往生しています。

私の放射状グラデーション ブラシ コード

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 関数を仮想にして、他のクラスでこの関数をオーバーライドできるようにします。どこが間違っているのか理解できません。コードのどこを修正すればよいかを修正してください。

4

1 に答える 1

0

この質問の答えは、レンダリングターゲットが初期化される前にマウス移動機能が来るため、この失敗を回避するには、このメソッドを使用することです。

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

これで、コードは正常に実行されます

于 2012-12-26T15:16:55.443 に答える