Hello,
I have created this listview (I found it easier than a treeview and it makes what I need) but instead of having checkbox using(LV_COLUMN_CHECKBOX) or buttons (LV_COLUMN_BUTTON) I would like to have bitmap button. I saw that there was LV_COLUMN_BMP for bitmap but I do not know if that will help me and how.
Is there any way I can use something like a bitmap button where I can use icons or images on it for this case.
I would really appreciate if you would offer me an example if such a thing can be done.
Thank you in advance.
Solved Adding Bitmap Button to ListView
Hi @Ogers LV_COLUMN_BMP accept an icon id. You can also register your own icon (meaning you own bitmap) with RegisterIcon from the Icon Librabry.
Note a ListView offer limited support if you want to directly draw into cells you will need to switch to a TreeView.
Here an example for handling LV_COLUMN_BMP .
#include "customgui_listview2.h"
class ListViewDialog : public GeDialog
{
private:
SimpleListView listview;
Int32 GADGET_LISTVIEW = 10001;
public:
virtual Bool CreateLayout();
virtual Bool InitValues();
virtual Bool Command(Int32 id, const BaseContainer& msg);
};
Bool ListViewDialog::CreateLayout()
{
// first call the parent instance
Bool res = GeDialog::CreateLayout();
// Create the LisTView
AddListView(GADGET_LISTVIEW, BFH_SCALEFIT | BFV_SCALEFIT, 0, 0);
listview.AttachListView(this, GADGET_LISTVIEW);
return res;
}
Bool ListViewDialog::InitValues()
{
// first call the parent instance
if (!GeDialog::InitValues())
return false;
// Define our Columns
BaseContainer layout = BaseContainer();
layout.SetInt32('chck', LV_COLUMN_CHECKBOX);
layout.SetInt32('name', LV_COLUMN_TEXT);
layout.SetInt32('bttn', LV_COLUMN_BUTTON);
layout.SetInt32('bmp', LV_COLUMN_BMP);
listview.SetLayout(4, layout);
// Fill our columns with 2 Entry
BaseContainer data = BaseContainer();
for (Int32 i = 0; i < 2; i++)
{
data.SetInt32('chck', true);
data.SetString('name', "Something"_s);
data.SetString('bttn', "..."_s);
data.SetInt32('bmp', IDM_KEY_LAST);
listview.SetItem(i, data);
}
// Update the listView
listview.DataChanged();
return true;
}
Bool ListViewDialog::Command(Int32 id, const BaseContainer& msg)
{
// If there is an action on our ListView
if (id == GADGET_LISTVIEW)
{
// Check the column, if it's an action on the int(bmp) column ID
Int32 ColId = msg.GetInt32(LV_SIMPLE_COL_ID);
if(ColId == 'bmp')
{
// Retrieves all data of this lines
Int32 itemId = msg.GetInt32(LV_SIMPLE_ITEM_ID);
BaseContainer bc;
listview.GetItem(itemId, &bc);
// Get the current data of our int(bmp) column / BaseContainer
Int32 currIconId = bc.GetInt32('bmp');
switch(currIconId)
{
case IDM_KEY_LAST:
bc.SetInt32('bmp', Osphere);
break;
case Osphere:
bc.SetInt32('bmp', IDM_KEY_LAST);
break;
default:
bc.SetInt32('bmp', IDM_KEY_LAST);
break;
}
// Push back our change to the item
listview.SetItem(itemId, bc);
// Update the ListView
listview.DataChanged();
}
}
return true;
}
If you have any question left, please let me know.
Cheers,
Maxime.
MAXON SDK Specialist
Hello @m_adam
Thank you for your answer. I was looking more to have a bitmap button on my listView instead of just an icon, like a toggle button where the icon is changed when clicked. I have done it but not inside a listView. Is that possible to be done inside the listView.
Thank you.
@ogers said in Adding Bitmap Button to ListView:
like a toggle button where the icon is changed when clicked
It's exactly what the code I posted does. Take a look at the Command method.
MAXON SDK Specialist