Control (View) with multiple parameters?

Arne, thanks to your tip I got it working now!

Here’s the code with some comments:

MyView.h

namespace VSTGUI {

class MyView : public CView
             , public Steinberg::FObject
             , public DelegationController
{
public:
    MyView (Steinberg::Vst::EditController* editController = nullptr);
    ~MyView ();

    // --- CView methods ---
    
    void draw (CDrawContext *pContext) override;
    
    CMouseEventResult onMouseDown (CPoint& where, const CButtonState& buttons) override;
    CMouseEventResult onMouseUp (CPoint& where, const CButtonState& buttons) override;
    CMouseEventResult onMouseMoved (CPoint& where, const CButtonState& buttons) override;
    
    CLASS_METHODS (MyView, CView)

private:
    
    // --- IDependent (FObject) methods ---
    
    void PLUGIN_API update (Steinberg::FUnknown* changedUnknown, Steinberg::int32 message) override;

    // --- attributes ---
    
    Steinberg::Vst::EditController* editController;
     
    Steinberg::Vst::Parameter* parameter1;
    Steinberg::Vst::Parameter* parameter2;
    
    float mValue1;
    float mValue2;
};
}

MyView.cpp

namespace VSTGUI {

MyView::MyView (Steinberg::Vst::EditController* editController)
: DelegationController (nullptr)
, CView (CRect(0,0,0,0))
, editController(editController)
, mValue1(0)
, mValue2(0)
{
    // retrieve the parameter that we are interested in from controller
    parameter1 = editController->getParameterObject (kParamId1);
    parameter2 = editController->getParameterObject (kParamId2);
    
    // listen to these parameters (parameter changes will trigger update() )
    if (parameter1)
        parameter1->addDependent (this);
    if (parameter2)
         parameter2->addDependent (this);
}

MyView::~MyView ()
{
    if (parameter1)
        parameter1->removeDependent (this);
    if (parameter2)
        parameter2->removeDependent (this);
}

// ...

CMouseEventResult MyView::onMouseDown (CPoint& where, const CButtonState& buttons)
{
    // ...
    // editController->beginEdit(tag);
    // ...
}


CMouseEventResult MyView::onMouseMoved (CPoint& where, const CButtonState& buttons)
{
    // ...
    // editController->performEdit (tag, value);
    // editController->setParamNormalized (tag, value);
    // ...
}

CMouseEventResult MyView::onMouseUp (CPoint& where, const CButtonState& buttons)
{
     // ...
    // editController->endEdit(tag);
    // ...
    
}

void PLUGIN_API MyView::update (Steinberg::FUnknown* changedUnknown,
                                      Steinberg::int32 message)
{
    // if a parameter value is changed (by host or by another control) this
    // method is called
    
    auto* p = Steinberg::FCast<Steinberg::Vst::Parameter> (changedUnknown);
    if (p)
    {
        if (message == kChanged)
        {
            // update local parameter value and draw()
            switch (p->getInfo().id) {
                 case kParamId1:
                     mValue1 = p->getNormalized ();
                     setDirty (true);
                    break;
                 case kParamId2:
                     mValue2 = p->getNormalized ();
                     setDirty (true);
                    break;
                 default:
                     break;
             }
         } else if (message == kWillDestroy)
        {
            // stop listening to parameter changes
            if (parameter1)
                parameter1->removeDependent (this);
            if (parameter2)
                parameter2->removeDependent (this);
            parameter1 = nullptr;
            parameter2 = nullptr;
        }
    }
}
}