1。先来介绍report类型的clistctrl:
首先使用下面的语句设置clistctrl的style:
dword setextendedstyle( dword dwnewstyle );
其中
lvs_ex_checkboxes 表示添加checkbox
lvs_ex_fullrowselect 表示选择整行
lvs_ex_gridlines 表示添加表格线
如果设置了lvs_ex_checkboxes属性,则可以用
bool getcheck( int nitem ) const;
来得到某一行是否checked。
可以先用下面的语句来删除以前的东西:
for(int k=2;k>=0;k--) //注意要从后往前删,否则出错
m_listctrl.deletecolumn(k);
m_listctrl.deleteallitems();
用下面的语句新建列:
m_listctrl.insertcolumn(0,_t("文件名"),lvcfmt_image|lvcfmt_left);
m_listctrl.insertcolumn(1,_t("仪器类别"));
m_listctrl.insertcolumn(2,_t("项目类别"));
其中lvcfmt_image表示可以在第一列加入图标。如果不要图标可以删去。
然后设置列宽:
for(j=0;j<3;j++)
m_listctrl.setcolumnwidth(j ,100);
以下为列表加入图标,如果不需要图标,可以跳过这一步。注意只在第一次加入,如果多次加入会出错!
先在头文件中加入声明:
cimagelist m_imagelist;
这是必要的,如果在cpp的某个函数中加入由于生命期结束,cimagelist自动释放,则效果是列表中看不到图标,只看到一个白方块。
下面生成cimagelist,并将其绑定到clistctrl中,这是cimagelist中还没有图标,只是一个容器:
static int flag=2;
if(flag==2){//只调用一次setimagelist,否则出错
m_imagelist.create(128, 128, ilc_colorddb|ilc_mask, 20, 1);
m_listctrl.setimagelist(&m_imagelist,lvsil_small);
}
flag=(flag+1)%2;
如果clistctrl已经用过,曾经加过图标进去,这时就要删除上次放进m_imagelist中的image
for(int kk=0;kk<m_imagelist.getimagecount();kk++)
m_imagelist.remove(k);
下面介绍如何向clistctrl里面加入行,并同时为每一行动态加入图标:
假设m_listrowcount为要加入的行数。
cbitmap* bitmap;
bitmap=new cbitmap[m_list1rowcount];
hbitmap hbitmap;
for(int i = 0; i < m_listrowcount; i++)
{
//为每一行插入相应的缩略图
cfile f;
cfileexception e;
if( !f.open(m_filename, cfile::moderead, &e )){ //m_filename为bmp文件名,由你来定
hbitmap = (hbitmap)loadimage(null,path+"blank.bmp",image_bitmap,0,0,
lr_createdibsection|lr_defaultsize|lr_loadfromfile);
}else{
f.close();
hbitmap = (hbitmap)loadimage(null,bmpfile,image_bitmap,0,0,
lr_createdibsection|lr_defaultsize|lr_loadfromfile);
}
bitmap[i].attach(hbitmap);
m_imagelist.add(&bitmap[i], rgb(0, 128, 128));
//插入行
m_listctrl.insertitem(i,m_filename,i);
m_listctrl.setitemtext(i,1,type);
m_listctrl.setitemtext(i,2,m_path);
}
//记得删除已经没用的临时文件
if(m_list1rowcount!=0)
delete[] bitmap;
2。如果是icon类型的clistctrl,则要做一点点改动:
把绑定图标集的代码由
setimagelist(&m_imagelist,lvsil_small);
改为
setimagelist(&m_imagelist,lvsil_normal);
插入行时只用
insertitem(i,mainset.m_filename,i);
不用
setitemtext(i,1,type);
之类的代码。