On 25/12/2017 at 01:22, xxxxxxxx wrote:
User Information:
Cinema 4D Version: R18
Platform: Windows ;
Language(s) : C++ ;
---------
How can I get an animatable parameter by drag and drop?
The Object Manager object was created by adding LinkBoxGUI with AddCustomGui.
Is there a drag-and-drop correspondence GUI for the parameter?
Since I was not able to make LinkBox remodeling because it was difficult, I wanted to create it using user area drag and drop, but I saw the sample file of SDK manual and AsyncTest and made it for the same, but I understood how to receive the message did not.
#pragma once
#include "c4d.h"
#include "c4d_commanddata.h"
#include "c4d_gui.h"
#define IDS_UserAreaTest 1000001
Bool RegisterUserAreaTest(void);
Bool PluginStart(void)
{
if (!RegisterUserAreaTest())
return false;
return true;
}
void PluginEnd(void)
{
}
Bool PluginMessage(Int32 id, void* data)
{
switch (id)
{
case C4DPL_INIT_SYS:
return true;
case C4DMSG_PRIORITY:
return true;
case C4DPL_BUILDMENU:
break;
case C4DPL_COMMANDLINEARGS:
break;
case C4DPL_EDITIMAGE:
return false;
}
return false;
}
class UserAreaLinkBox : public GeUserArea
{
public:
virtual Bool GetMinSize(Int32& w, Int32& h);
virtual void DrawMsg(Int32 x1, Int32 y1, Int32 x2, Int32 y2, const BaseContainer& msg);
};
Bool UserAreaLinkBox::GetMinSize(Int32& w, Int32& h)
{
w = 100;
h = 20;
return true;
}
void UserAreaLinkBox::DrawMsg(Int32 x1, Int32 y1, Int32 x2, Int32 y2, const BaseContainer& msg)
{
this->OffScreenOn();
this->DrawSetPen(Vector(110, 110, 0));
this->DrawRectangle(x1 + 2, y1 + 2, x2 - 2, y2 - 2);
}
class UserAreaTestDialog : public GeDialog
{
public:
virtual Bool CreateLayout();
virtual Int32 Message( const BaseContainer& msg, BaseContainer& result );
virtual Bool CoreMessage( Int32 id, const BaseContainer &msg; );
void Update();
UserAreaLinkBox ua;
};
Bool UserAreaTestDialog::CreateLayout()
{
SetTitle( "UserAreaTest" );
Update();
return true;
}
Int32 UserAreaTestDialog::Message( const BaseContainer& msg, BaseContainer& result )
{
switch (msg.GetId())
{
case BFM_DRAGRECEIVE:
if (msg.GetInt32(BFM_DRAG_LOST))
{
GePrint("BFM_DRAG_LOST");
}
if (msg.GetInt32(BFM_DRAG_FINISHED))
{
GePrint("BFM_DRAG_FINISHED");
}
if (CheckDropArea(200, msg, true, true))
{
GePrint("CheckDropArea");
}
break;
default:
break;
}
return GeDialog::Message( msg, result );
}
void UserAreaTestDialog::Update()
{
LayoutFlushGroup(100);
FreeChildren(100);
GroupBegin(100, BFH_SCALEFIT, 1, 1, "", BFV_BORDERGROUP_FOLD_OPEN, 0);
{
C4DGadget* c4dgadget = AddUserArea(200, BFH_SCALEFIT, 100, 20);
if (c4dgadget)
AttachUserArea(ua, 200);
}
GroupEnd();
LayoutChanged(100);
}
Bool UserAreaTestDialog::CoreMessage( Int32 id, const BaseContainer &msg; )
{
switch( id )
{
case EVMSG_CHANGE:
Update();
break;
}
return GeDialog::CoreMessage( id, msg );
};
class UserAreaTest : public CommandData
{
INSTANCEOF( UserAreaTest, CommandData )
public:
virtual Bool Execute( BaseDocument* doc );
virtual Bool RestoreLayout( void* secret );
static UserAreaTest* Alloc() { return NewObjClear( UserAreaTest ); }
private:
UserAreaTestDialog _dialog;
};
Bool UserAreaTest::Execute( BaseDocument* doc )
{
if( _dialog.IsOpen() == false )
_dialog.Open( DLG_TYPE_ASYNC, IDS_UserAreaTest, -1, -1, 400, 400 );
return true;
}
Bool UserAreaTest::RestoreLayout( void* secret )
{
return _dialog.RestoreLayout( IDS_UserAreaTest, 0, secret );
}
Bool RegisterUserAreaTest( void )
{
return RegisterCommandPlugin( IDS_UserAreaTest, String( "UserAreaTest" ), 0, nullptr, String( "UserAreaTest" ), UserAreaTest::Alloc() );
}
GePrint ("BFM_DRAG_LOST");
GePrint ("BFM_DRAG_FINISHED");
Please tell me how to get to.
Or please tell me if there is better usage.