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 ID
s ( Osphere and Ocube ) but what i
d like to do is use my own bitmap images instead. Im aware that one option is to register unique icon id
s for these, but i see that BitmapButtonCustomGui has a ->SetImage() method to allocate a BaseBitmap..The problem is i
m not instantiating my BitmapButton i
m 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 aren
t specified that it will use the full bitmap. What i found was that it didn
t 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