Bitmap button / advice needed [SOLVED]



  • On 22/10/2014 at 09:53, xxxxxxxx wrote:

    User Information:
    Cinema 4D Version:   r14 
    Platform:   Windows  ;   
    Language(s) :     C++  ;

    ---------
    hi there,
    i am having a hard time creating a few bitmap buttons for my object plugin. maybe someone can tell me how i can create 5 buttons using different images.

    edit: i've updated the code for all five buttons. they do show up and work correctly, but strangely they look the same....

    in the res file:
    		GROUP {
    			LAYOUTGROUP; COLUMNS 5;
    			GROUP {
    				BITMAPBUTTON BUTTON1 {ANIM OFF;}
    			}
    			GROUP {
    				BITMAPBUTTON BUTTON2 {ANIM OFF;}
    			}
    			GROUP {
    				BITMAPBUTTON BUTTON3 {ANIM OFF;}
    			}
    			GROUP {
    				BITMAPBUTTON BUTTON4 {ANIM OFF;}
    			}
    			GROUP {
    				BITMAPBUTTON BUTTON5 {ANIM OFF;}
    			}
    		}
      
    and the source:
      
    #define pluginID 1000001
    #define pluginName "test"
      
    #include "c4d.h"
    #include "c4d_symbols.h"
    #include "test.h"
      
      
    class test : public ObjectData
    {
    	INSTANCEOF(test,ObjectData);
    private:
    	LONG myType;
    public:
    	virtual BaseObject* GetVirtualObjects(BaseObject *op, HierarchyHelp *hh);
    	virtual Bool Message(GeListNode *node, LONG type, void *t_data);
    	static NodeData *Alloc(void) { return gNew test; }
    	virtual Bool Init(GeListNode *node);
    	virtual Bool GetDParameter(GeListNode *node, const DescID &id, GeData &t_data, DESCFLAGS_GET &flags)  ;
    	virtual Bool GetDDescription(GeListNode *node, Description *description, DESCFLAGS_DESC &flags);
    };
      
    Bool test::Init(GeListNode *node)
    {
    	myType = BUTTON1;
    	return true;
    }
      
    Bool test::GetDParameter(GeListNode *node, const DescID &id, GeData &t_data, DESCFLAGS_GET &flags)  
    {
    	LONG dirty = 0;
    	BitmapButtonStruct bbs(static_cast<BaseObject*>(node), id, dirty);
      
    	switch(id[0].id) 
    	{
    	case BUTTON1:
    		t_data = GeData(CUSTOMDATATYPE_BITMAPBUTTON, bbs);	
    		flags |= DESCFLAGS_GET_PARAM_GET;
    		break;
    	case BUTTON2:
    		t_data = GeData(CUSTOMDATATYPE_BITMAPBUTTON, bbs);				   
    		flags |= DESCFLAGS_GET_PARAM_GET;
    		break;
    	case BUTTON3:
    		t_data = GeData(CUSTOMDATATYPE_BITMAPBUTTON, bbs);				   
    		flags |= DESCFLAGS_GET_PARAM_GET;
    		break;
    	case BUTTON4:
    		t_data = GeData(CUSTOMDATATYPE_BITMAPBUTTON, bbs);				   
    		flags |= DESCFLAGS_GET_PARAM_GET;
    		break;
    	case BUTTON5:
    		t_data = GeData(CUSTOMDATATYPE_BITMAPBUTTON, bbs);				   
    		flags |= DESCFLAGS_GET_PARAM_GET;
    		break;
    	}
    	return SUPER::GetDParameter(node, id, t_data, flags);
    }
      
    Bool test::GetDDescription(GeListNode *node, Description *description, DESCFLAGS_DESC &flags)
    {
    	if (!description->LoadDescription(node->GetType())) return false;
      
    	DescID btnId1 = DescLevel(BUTTON1, CUSTOMDATATYPE_BITMAPBUTTON, 0);
    	BaseContainer btnBC1 = GetCustomDataTypeDefault(CUSTOMDATATYPE_BITMAPBUTTON);
    	btnBC1.SetLong(BITMAPBUTTON_BORDER, BORDER_OUT);
    	btnBC1.SetBool(BITMAPBUTTON_BUTTON, TRUE);		
    	if (myType==BUTTON1) btnBC1.SetLong(BITMAPBUTTON_BACKCOLOR, COLOR_EDGELT);						
    	if (!description->SetParameter(btnId1,btnBC1,DescLevel(ID_OBJECTPROPERTIES))) return false;
      
    	DescID btnId2 = DescLevel(BUTTON2, CUSTOMDATATYPE_BITMAPBUTTON, 0);
    	BaseContainer btnBC2 = GetCustomDataTypeDefault(CUSTOMDATATYPE_BITMAPBUTTON);
    	btnBC2.SetLong(BITMAPBUTTON_BORDER, BORDER_OUT);
    	btnBC2.SetBool(BITMAPBUTTON_BUTTON, TRUE);	
    	if (myType==BUTTON2) btnBC2.SetLong(BITMAPBUTTON_BACKCOLOR, COLOR_EDGELT);	
    	if (!description->SetParameter(btnId2,btnBC2,DescLevel(ID_OBJECTPROPERTIES))) return false;
      
    	DescID btnId3 = DescLevel(BUTTON3, CUSTOMDATATYPE_BITMAPBUTTON, 0);
    	BaseContainer btnBC3 = GetCustomDataTypeDefault(CUSTOMDATATYPE_BITMAPBUTTON);
    	btnBC3.SetLong(BITMAPBUTTON_BORDER, BORDER_OUT);
    	btnBC3.SetBool(BITMAPBUTTON_BUTTON, TRUE);	
    	if (myType==BUTTON3) btnBC3.SetLong(BITMAPBUTTON_BACKCOLOR, COLOR_EDGELT);	
    	if (!description->SetParameter(btnId3,btnBC3,DescLevel(ID_OBJECTPROPERTIES))) return false;
      
    	DescID btnId4 = DescLevel(BUTTON4, CUSTOMDATATYPE_BITMAPBUTTON, 0);
    	BaseContainer btnBC4 = GetCustomDataTypeDefault(CUSTOMDATATYPE_BITMAPBUTTON);
    	btnBC4.SetLong(BITMAPBUTTON_BORDER, BORDER_OUT);
    	btnBC4.SetBool(BITMAPBUTTON_BUTTON, TRUE);	
    	if (myType==BUTTON4) btnBC4.SetLong(BITMAPBUTTON_BACKCOLOR, COLOR_EDGELT);	
    	if (!description->SetParameter(btnId4,btnBC4,DescLevel(ID_OBJECTPROPERTIES))) return false;
      
    	DescID btnId5 = DescLevel(BUTTON5, CUSTOMDATATYPE_BITMAPBUTTON, 0);
    	BaseContainer btnBC5 = GetCustomDataTypeDefault(CUSTOMDATATYPE_BITMAPBUTTON);
    	btnBC5.SetLong(BITMAPBUTTON_BORDER, BORDER_OUT);
    	btnBC5.SetBool(BITMAPBUTTON_BUTTON, TRUE);	
    	if (myType==BUTTON5) btnBC5.SetLong(BITMAPBUTTON_BACKCOLOR, COLOR_EDGELT);	
    	if (!description->SetParameter(btnId5,btnBC5,DescLevel(ID_OBJECTPROPERTIES))) return false;
      
    	flags |= DESCFLAGS_DESC_LOADED;
    	return SUPER::GetDDescription(node, description, flags);
    }
      
    Bool test::Message(GeListNode *node, LONG type, void *t_data)
    {
    	BaseObject *op = (BaseObject* )node;
    	if (!op) return false;
    	BaseContainer *data = op->GetDataInstance();
    	switch(type)
    	{
    	case MSG_DESCRIPTION_COMMAND:
    		switch(static_cast<DescriptionCommand*>(t_data)->id[0].id) 
    		{
    		case BUTTON1:
    			data->SetString(NFO,"Button1");
    			myType = BUTTON1;
    			break;
    		case BUTTON2:
    			data->SetString(NFO,"Button2");
    			myType = BUTTON2;
    			break;
    		case BUTTON3:
    			data->SetString(NFO,"Button3");
    			myType = BUTTON3;
    			break;
    		case BUTTON4:
    			data->SetString(NFO,"Button4");
    			myType = BUTTON4;
    			break;
    		case BUTTON5:
    			data->SetString(NFO,"Button5");
    			myType = BUTTON5;
    			break;
    		}
      
    		break;
    	case MSG_DESCRIPTION_GETBITMAP:
    		DescriptionGetBitmap *dgb1 = static_cast<DescriptionGetBitmap*>(t_data); 
    		dgb1->id[0] == BUTTON1;                                              
    		AutoAlloc<BaseBitmap> bm1;
    		bm1->Init(GeGetPluginPath()+"res"+"btn1.tif");
    		dgb1->bmp = bm1.Release();
      
    		DescriptionGetBitmap *dgb2 = static_cast<DescriptionGetBitmap*>(t_data); 
    		dgb2->id[0] == BUTTON2;                                              
    		AutoAlloc<BaseBitmap> bm2;
    		bm2->Init(GeGetPluginPath()+"res"+"btn2.tif");
    		dgb2->bmp = bm2.Release();
      
    		DescriptionGetBitmap *dgb3 = static_cast<DescriptionGetBitmap*>(t_data); 
    		dgb3->id[0] == BUTTON3;                                              
    		AutoAlloc<BaseBitmap> bm3;
    		bm3->Init(GeGetPluginPath()+"res"+"btn3.tif");
    		dgb3->bmp = bm3.Release();
      
    		DescriptionGetBitmap *dgb4 = static_cast<DescriptionGetBitmap*>(t_data); 
    		dgb4->id[0] == BUTTON4;                                              
    		AutoAlloc<BaseBitmap> bm4;
    		bm4->Init(GeGetPluginPath()+"res"+"btn4.tif");
    		dgb4->bmp = bm4.Release();
      
    		DescriptionGetBitmap *dgb5 = static_cast<DescriptionGetBitmap*>(t_data); 
    		dgb5->id[0] == BUTTON5;                                              
    		AutoAlloc<BaseBitmap> bm5;
    		bm5->Init(GeGetPluginPath()+"res"+"btn5.tif");
    		dgb5->bmp = bm5.Release();
      
    		break;
    	}
        return true;
    }
      
    BaseObject *test::GetVirtualObjects(BaseObject *op, HierarchyHelp *hh)
    {
    	Bool dirty = op->CheckCache(hh) || op->IsDirty(DIRTYFLAGS_DATA);
    	dirty = dirty || !op->CompareDependenceList();
    	if (!dirty) 
    	{
    		return op->GetCache(hh);
    	}
    	BaseObject *main = BaseObject::Alloc(Onull);
    	main->SetName("test");
    	if (main)
    	{
    		return main;
    	}
    	return NULL;
    }
      
    Bool Register_test(void)
    {
    	GePrint(pluginName);
    	return RegisterObjectPlugin(pluginID,pluginName,OBJECT_GENERATOR|OBJECT_INPUT,test::Alloc,"Test",AutoBitmap("test.tif"),0);
    }
    [CODE]
      
    hope someone can bring some light here. 
      
    cheers,
    ello
    


  • On 23/10/2014 at 03:21, xxxxxxxx wrote:

    Hello,

    you are comparing the DescID with the button's ID without any context. So this line

      
    dgb1->id[0] == BUTTON1;      
    

    won't make sense. You have to add a "if" structure or use a switch.

    Best wishes,
    Sebastian



  • On 23/10/2014 at 03:37, xxxxxxxx wrote:

    thank you very much! this works now:

      
    		DescriptionGetBitmap *dgb = static_cast<DescriptionGetBitmap*>(t_data);                                  
    		AutoAlloc<BaseBitmap> bm;
    		switch(dgb->id[0].id)
    		{
    		case BUTTON1:             
    			bm->Init(GeGetPluginPath()+"res"+"btn1.tif");
    			break;
    		case BUTTON2:           
    			bm->Init(GeGetPluginPath()+"res"+"btn2.tif");
    			break;
    		case BUTTON3:            
    			bm->Init(GeGetPluginPath()+"res"+"btn3.tif");
    			break;
    		case BUTTON4:            
    			bm->Init(GeGetPluginPath()+"res"+"btn4.tif");
    			break;
    		case BUTTON5:             
    			bm->Init(GeGetPluginPath()+"res"+"btn5.tif");
    			break;
    		}
    		dgb->bmp = bm.Release();
    

Log in to reply