BitmapButton..



  • On 29/08/2014 at 05:36, xxxxxxxx wrote:

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

    ---------
    I have an object generator plugin and using the GetDDescription override to insert a BitmapButton into the plugins AM..

    This is working when using existing icon IDs ( Osphere and Ocube ) but what id like to do is use my own bitmap images instead.  Im aware that one option is to register unique icon ids for these, but i see that BitmapButtonCustomGui has a ->SetImage() method to allocate a BaseBitmap..

    The problem is im not instantiating my BitmapButton im just creating the BaseContainer for it inside GetDDescription and adding it to the resource container.  How can i then use SetImage() to apply a bitmap to it?

    Or do i have to register them as icons and if so where do i do that?

    Here`s roughly the code i have:

    Bool MyPlugin::GetDDescription(GeListNode *node, Description *description, DESCFLAGS_DESC &flags)
    {
    	if (!description->LoadDescription(node->GetType())) return FALSE;
      
    	BaseContainer *props = description->GetParameterI(DescLevel(ID_MYGROUP), NULL);  //Get existing Group from my static resource
    	if (props)
    	{
    		BaseContainer bbutn;
    		bbutn= GetCustomDataTypeDefault(DTYPE_BUTTON);
    		bbutn.GetCustomDataType(DTYPE_BUTTON, CUSTOMGUI_BITMAPBUTTON);
    		bbutn.SetLong(DESC_CUSTOMGUI,        CUSTOMGUI_BITMAPBUTTON);
    		bbutn.SetLong(BITMAPBUTTON_BORDER,    BORDER_NONE);
    		bbutn.SetBool(BITMAPBUTTON_BUTTON,    TRUE);
    		bbutn.SetBool(BITMAPBUTTON_TOGGLE,    TRUE);
    		bbutn.SetLong(BITMAPBUTTON_ICONID1, Osphere);   //Existing icon ID for testing
    		bbutn.SetLong(BITMAPBUTTON_ICONID2, Ocube);     //Existing icon ID for testing
      
    		description->SetParameter(DescLevel(MYPLUGIN_BBUTN, DESC_CUSTOMGUI, 0), bbutn, DescLevel(ID_MYGROUP));  //Shove the new description basecontainer into the resource
    	}
        
    	flags |= DESCFLAGS_DESC_LOADED;
      
    	return SUPER::GetDDescription(node, description, flags);
    }
    {
    


  • On 29/08/2014 at 10:04, xxxxxxxx wrote:

    It might be possible to use SetImage() for this.  But I don't know how to do that.
    I do know how to register your icon though.

    Generic ObjectData plugin Example:

      
    //This is how to register a custom icon   
    //Then use it in the GetDDescription() method to create a dynamically created bitmapbutton with your icon on it  
      
      
    Bool MyObject::GetDDescription(GeListNode *node, Description *description, DESCFLAGS_DESC &flags)  
    {  
      if (!description || !node) return FALSE;   
      
      //Loads the gui stuff from the .res file in case we want to use them  
      if (!description->LoadDescription(node->GetType())) return FALSE;  
        
      //We will load the BitmapButton GUI into the first description level(much like loading UD entries into levels)  
      DescID did = DescLevel(1, DTYPE_NONE, 0);  
      BaseContainer settings;  
      settings.SetLong(DESC_CUSTOMGUI, CUSTOMGUI_BITMAPBUTTON);   
      settings.SetString(DESC_NAME,"My Button");  
      settings.SetBool(BITMAPBUTTON_BUTTON, TRUE);  
      settings.SetLong(DESC_GUIOPEN, TRUE);  
      settings.SetBool(BITMAPBUTTON_BUTTON,  TRUE);  
      settings.SetBool(BITMAPBUTTON_TOGGLE,  TRUE);  
      settings.SetLong(BITMAPBUTTON_ICONID1, 200000000);  //Uses a custom icon we registered in the register() method  
      settings.SetLong(BITMAPBUTTON_ICONID2, Ocube);      //Uses the cube icon that C4D already registered for us  
      if(!description->SetParameter(did,settings,DescLevel(ID_OBJECTPROPERTIES))) return FALSE;  
        
        
      flags |= DESCFLAGS_DESC_LOADED;  
        
      return SUPER::GetDDescription(node, description, flags);  
    }  
      
      
    Bool RegisterMyObject(void)  
    {   
      Filename fn = GeGetPluginPath()+"res"+"myicon.tif";  
      AutoAlloc<BaseBitmap> bmp;  
      if(IMAGERESULT_OK != bmp->Init(fn)) return FALSE;  
      
      //Register our custom icon image with c4d so we can use it like the other icons  
      //NOTE:The ID# 200000000 is for testing purposes only!!...Be sure to get a proper one from c4dcafe.com    
      RegisterIcon(200000000, bmp, 0*32, 0, 32, 32, ICONFLAG_COPY);                                                           
      
      return RegisterObjectPlugin(PLUGIN_ID, GeLoadString(IDS_MYOBJECT), OBJECT_GENERATOR|OBJECT_ISSPLINE|OBJECT_CALL_ADDEXECUTION, MyObject::Alloc, "MyObject", AutoBitmap("MyIcon.tif"), 0);  
    }
    

    -ScottA



  • On 29/08/2014 at 15:08, xxxxxxxx wrote:

    Thanks much for that Scott, got it.

    The docs say that when using the RegisterIcon() function, if the optional x/y/width/height/copy arent specified that it will use the full bitmap.  What i found was that it didnt work at all unless i specified the bitmap size  - in my case RegisterIcon(2000000000, bmp, 0*128, 0, 128, 64, ICONFLAG_COPY).  Maybe it was just the COPY flag that got it working though, not sure..  What is the 0*32 bit about for the x-position btw?



  • On 29/08/2014 at 17:31, xxxxxxxx wrote:

    Sorry about that. Just ignore it and use 128 (or whatever  size you want) .
    When I cut and paste from my notes sometimes I miss little things like that.
    I was probably doing dynamic sizing with the code at one point and forgot to change it.

    -ScottA


Log in to reply