CListCtrl,clistctrl控件
1。先来介绍报告类型的CListCtrl:
首先使用下面的语句设置CListCtrl的风格:
DWORD SetExtendedStyle(DWORD dwNewStyle);
其中
LVS _ EX _复选框表示添加检验盒
LVS_EX_FULLROWSELECT表示选择整行
LVS _ EX _网格线表示添加表格线
CListCtrl固定标题列宽:
cheaderctrl=(cheader ctrl *)m _ list ctrl .GetHeaderCtrl();pHeaderCtrl-启用窗口(FALSE);
如果设置了LVS _ EX _复选框属性,则可以用
BOOL get check(int nItem)常量;
来得到某一行是否检查过了。
可以先用下面的语句来删除以前的东西:
for(int k=2;k k - ) //注意要从后往前删,否则出错
m_ListCtrl .删除第(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 j)
m_ListCtrl .setcolumnwidth(j,100);
以下为列表加入图标,如果不需要图标,可以跳过这一步。注意只在第一次加入,如果多次加入会出错!
先在头文件中加入声明:
CImageList m _ ImageList
这是必要的,如果在卡片打印处理机(卡片打印处理器的缩写)的某个函数中加入由于生命期结束,CImageList自动释放,则效果是列表中看不到图标,只看到一个白方块。
下面生成CImageList,并将其绑定到CListCtrl中,这是影像清单中还没有图标,只是一个容器:
静态(同Internationalorganizations)国际组织标志=2;
if(flag==2){//只调用一次SetImageList,否则出错
m_ImageList .Create(128,128,ILC_COLORDDBILC_MASK,20,1);
m_ListCtrl .SetImageList( m_ImageList,LVSIL _ SMALL);
}
flag=(flag 1)% 2;
如果CListCtrl已经用过,曾经加过图标进去,这时就要删除上次放进m_ImageList中的图像
for(int kk=0;kk m_ImageList .GetImageCount();kk)
m_ImageList .移除(k)和:
下面介绍如何向CListCtrl里面加入行,并同时为每一行动态加入图标:
假设m_listRowCount为要加入的行数。
CBitmap*位图;
bitmap=新的cbit映射[m _ list 1 rowcount];
HBITMAP hbitmap
for(int I=0;我是m _ listRowCount我)
{
//为每一行插入相应的缩略图
CFile f;
CFileException e;
如果(!f .打开(m _文件名,CFile:modeRead,e)){//m _文件名为位图文件的扩展名文件名,由你来定
hbit map=(hbit map)LoadImage(NULL,路径 blank.bmp ,IMAGE_BITMAP,0,0,
LR _ CREATEDIBSECTION LR _ DEFAULTSIZE LR _ LOADFROMFILE);
}否则{
f . close();
hbit map=(hbit map)LoadImage(NULL,bmpFile,IMAGE_BITMAP,0,0,
LR _ CREATEDIBSECTION LR _ DEFAULTSIZE LR _ LOADFROMFILE);
}
位图[我].附上(hbit图);
m_ImageList .添加(位图[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)
删除[]位图;
2。如果是图标类型的CListCtrl,则要做一点点改动:
把绑定图标集的代码由
SetImageList( m_ImageList,LVSIL _ SMALL);
改为
SetImageList( m_ImageList,LVSIL _ NORMAL);
插入行时只用
InsertItem(i,mainSet.m_FileName,I);
不用
SetItemText(i,1,type);
之类的代码。
3.其他技巧
CListCtrl支持列拖动及排序:
m_ListCtrl .SetExtendedStyle(LVS _ EX _ header dragdrop);即可实现拖动,排序有开源的CSortListCtrl可以使用。
其它常用:
dw style =LVS _ EX _ FULLROWSELECT;//整行选中,报告风格下dw style =LVS _ EX _复选框;//前边带复选框dw style =LVS _ EX _ GRIDLINES;//带网格线
dw style =LVS _ EX _ header dragdrop;//标题栏可以交换顺序m_ListCtrl .SetExtendedStyle(dw样式);
//重写此函数禁用标题栏拖动列宽
BOOL csortlistcrl:on notify(WPARAM WPARAM,LPARAM lParam,LRESULT* pResult)
//TODO:在此添加您的专用代码和/或调用基类
HD _ NOTIFY * pHDN=(HD _ NOTIFY *)lParam;
开关((NMHDR*)lParam)-代码)
{
案例HDN_BEGINTRACKW:
判例HDN-贝京斯卡:
//if (pHDN- iItem==0) //指定哪一列
* pResult=TRUE//禁用跟踪
返回TRUE//已处理的消息
}
返回CListCtrl:OnNotify(wParam,lParam,pResult);
(一)列表控件的主要功能
ListControl视图主要用于以各种方式显示一组数据记录,供用户执行各种操作。Windows98/95中资源管理器中“查看”选项卡下的“大图标小图标列表详细资源”就是一个非常好的典型应用。列表中的记录可以包括多个数据项,也可以包括表示数据内容的大小图标,用于表示数据记录的各种属性。
列表控件提供了操作Windows列表功能的基本方法,使用列表视图的查看功能可以操作列表视图。通过调用视图成员GetListCtrl获取列表视图中嵌入的列表控件的引用(GetListCtrl List=GetListCtrl()),可以像列表控件一样执行各种操作。
操作列表控件和视图的基本方法是:
创建列表控件;
创建列表控件所需的图像列表;
向列表控件添加表格列和项目;
控制列表,包括搜索、排序、删除、显示、排列和各种消息处理功能。
最后,撤销列表控件。
对于一个列表控件,最典型、最常用的显示控件模式有:大图标模式(LVS _图标)、小图标模式(LVS _小图标)、列表显示模式(LVS _列表)和详细信息(即报表LVS _报表)显示模式。这可以通过设置其显示模式属性来实现。要控制列表所在窗口的样式,可以使用函数GetWindowLong和SetWindowLong。为了控制列表图标的对齐,可以设置列表窗口的样式LVS_ALIGNTOP或LVS_ALIGNLEFT。
(2)列表控件的对象结构
1、列表控件的建立方法
定义列表对象的结构。
创建列表控件并绑定对象
控制列表CListCtrl:Create的调用格式如下:
BOOL Create( DWORD dwStyle,const RECT rect,CWnd* pParentWnd,UINT nID);
参数dwStyle用于确定列表控件的样式;Rect用于确定列表控件的大小和位置;PParentWnd用于确定列表控件的父窗口,通常是对话框;nID用于确定列表控制的标识。列表控件的样式可以是下列值的组合:
LVS_ALIGNLEFT用于确定表格项目的大小。图标以左对齐方式显示。
LVS_ALIGNTOP用于确定表格项目的大小。图标以顶部对齐方式显示。
LVS _自动排列用于确定表格项目的大小。图标以自动排列方式显示。
LVS _编辑标签设置表项文本可编辑,父窗口必须具有LVN_ENDLABELEDIT样式;
LVS _图标用于确定大图标的显示方式;
LVS _列表用于确定列表显示;
LVS_NOCOLUMNHEADER用于确定列表标题不在详细模式下显示;
LVS _诺拉贝尔WRAP用于确定在单行中显示图标的文本项;
LVS_NOSCROLL用来屏蔽滚动条;
LVS _诺瑟德用于确定列表头不能作为按钮功能使用;
LVS _ ownerdrawfird允许在详细列表模式下自绘窗口;
LVS _报表用于确定详细信息的显示,即报表;
LVS _共享图像列表用于确定共享图像列表的方式;
LVS_SHOWSELALWAYS用于确定总是显示所选条目的方式;
LVS_SINGLESEL用于确定某一时刻只能选择一个项目;
LVS_SMALLICON用于确定小图标的显示方式;
LVS_SORTASCENDING用于确定条目的排序是基于条目文本的升序方式;
LVS_SORTDESCENDING用于确定条目的排序是基于条目文本的降序方式;
2.由列表控制的属性类
列表控件的属性类包括获取列表控件的背景色GetBkColor,设置列表控件的背景色SetBkColor,获取列表控件的图像列表GetImageList,设置列表控件的图像列表SetImageList,获取列表项的数量GetItemCount,获取列表控件的属性GetItem,获取与条目相关的数据GetItemData,设置条目的属性SetItem,设置与条目相关的值SetItemData, 获取下一个关联条目GetNextItem,设置列表控件的文本颜色,获取列表控件文本的背景颜色GetTextBkColor,设置最大条目数SetItemCount和获取选中条目数GetSelectedCount等。
3.列表控件的操作方法
列表控件的操作方法包括插入新表项InsertItem、删除表项DeleteItem、排序表项SortItems、测试列表命中位置、重绘表项RedrawItems、插入表列InsertColumn、删除表列DeleteColumn、编辑表项text EditLabel和重绘表项DrawItem等。
(C)列表控件的数据结构
该列表包含两个非常重要的数据结构LV_ITEM和LV_COLUMN。LV_ITEM用于定义列表控件的表项,LV_COLUMN用于定义列表控件的表列。定义格式如下:
typedef struct _LV_ITEM {
UINT掩码;//结构成员掩码位
项目间;//条目的索引号
int iSubItem//子表项索引号
UINT状态;//条目状态
UINT状态掩码;//状态有效性屏蔽位
LPTSTR pszText//条目名称的文本
int cchTextMax//条目名称的最大长度
int iImage//表格项目图标的索引号
LPARAM lParam//与条目相关的32位数字
}吕_项;
typedef结构_ LV _列{
UINT掩码;//结构成员有效性掩码位
int fmt//表格列对齐
int cx//表格列的像素宽度
LPTSTR pszText//表格列的标题名
int cchTextMax//表格列名的文本长度
int iSubItem//与表列关联的子表项的索引号
} LV _列;
fmt可以采用以下值:
LVCFMT_CENTER表格列居中对齐。
LVCFMT_LEFT表列左对齐。
(4)列表控件应用技巧举例
本文通过一个具体的例子来演示列表控件和以前的表头控件、图片列表的应用技巧。步骤如下:
1.通过“文件-新建-项目-MFC appwizard (exe)”建立一个名为VCLIST的项目,在建立过程中根据对话框选择应用程序;删除对话框中的默认控件,将所有对话框属性中的语言字段设置为中文(P.R.C ),使应用程序可以支持中文;
建立了两个图标,IDI_GJ和IDI_XS,以指示图标的选中和未选中状态。每个图标要有32X32和16X16两种尺寸,以保证节目的需要。
3.在对话框中设计一个组合框。组合框中设置了“大图标小图标列表数据”四个单选按钮。同时设置了排序、删除、关闭三个控制按钮(按键)。在对话框中,设置一个大小合适的列表控件(List Ctrl)。相应的徽标如下:
控制名称标题名称标识符
控制列表IDC_LISTCTRL
组合框模式IDC_STATIC
无线按钮图标IDC_STDICON
图标IDC_SMLICON
列IDC_LIST
材料IDC _报告
按钮排序IDC_SORT
删除IDC_DEL
关闭IDOK
4.在设置无线按钮时,需要注意的是,只有大图标的Group属性被选中,其他无线按钮的状态都是默认值。
5.选择列表控件,选择“视图-class wizard-内存变量”,使用IDC_ LISTCTRL引入成员变量,成员变量的类型有:
变量名称类型变量类型
m_ListCtrl控件ClistCtrl
同时,“消息映射”用于为每个无线按钮和命令按钮添加控制功能。
6.然后,将以下代码分别添加到包含文件和代码的文件中:
(1)在VCLISTDlg.h中添加数据结构和定义
Typefstruct标记PS {//定义结构
char szPm[10];//产品名称
int Lx//0-GJ 1-XS
char szSl[10];//数量
char szDj[10];//单价
char szJe[10];//金额
} SPS
int回调CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort);
(2)在VCLISTDlg .刑事诉讼法中的起始处增加初始化数据和程序定义
//在文件开始处增加数据结构初始化
Sps[]={//信息
-什么红梅 0 、 1000 、 30 、 30000},
-什么黄梅 0 、 1000 、 29 、 29000},
-什么绿梅 0 、 1000 、 28 、 28000},
-什么青梅 0 、 1000 、 27 、 27000},
-什么白梅 0 、 1000 、 31 、 31000},
-什么红梅 1 、 1000 、 30 、 30000},
-什么黄梅1、 1000 、 29 、 29000},
-什么绿梅 1 、 1000 、 28 、 28000},
-什么青梅 1 、 1000 、 27 、 27000},
-什么白梅, 1, 1000 , 31 , 31000 };
CImageList Cil1,cil 2;//大小图像列表
(3)在程序初始化处增加表头~我爱你~图像和列表控制建立代码
BOOL CVCLISTDlg:OnInitDialog()
{ CD dialog:on init dialog();
//.我.//其它代码
//全部:在此新增额外初始化此处增加代码
lv _ item lvitem
lv _ column
内部我、iPos、iitemnum
cvclistapp * pap=(cvclistapp *)afx getap();//创建图象列表
智利一号。创建(32、32、真、2、2);
智利一号. add(pap-load图标(idi _ gj));
智利一号. add(pap-load图标(idi _ xs));
智利2号。创建(16、16、真、2、2);
智利2号. add(pap-load图标(idi _ gj));
智利2号. add(pap-load图标(idi _ xs));//设置图象列表
S7-1200可编程控制器. SetImageList( Cil1,lvsil _ normal);
S7-1200可编程控制器. SetImageList( Cil2,lvsil _ small);//向列表控制中添加表列
lvcol。mask=lvcf _ fmt lvcf _ sub item lvcf _ text lvcf _ width;
lvcol。fmt=lvcfmt _ center//居中
i=0
lvcol。psztext=品名";
lvcol。isubitem=i
lvcol。cx=70
S7-1200可编程控制器。插入列(一、lvcol);
lvcol。psztext=数量";
lvcol。isubitem=i
lvcol。cx=70
S7-1200可编程控制器。插入列(一、lvcol);
lvcol。psztext=单价";
lvcol。isubitem=i
lvcol。cx=70
S7-1200可编程控制器。插入列(一、lvcol);
lvcol。psztext=金额";
lvcol。isubitem=i
lvcol。cx=70
S7-1200可编程控制器。插入列(一、lvcol);
//向列表控制中添加表项
iitm num=sizeof(PLC)/sizeof(PLC);
for(I=0);伊特米姆人;>
lvitem。mask=lvif _ text lvif _ image lvif _ param;
lvitem。iitem=i
lvitem。isubitem=0
lvitem。pszttext=PLC[I].szpm
LV项目。iii image=PLC[I].Lx标记;
lvitem。lparam=i
iPos=m_ListCtrl .insert item(lvitem);//返回表项插入后的索引号
lvitem.mask=LVIF_TEXT:
lvitem。iitem=首次公开募股
lvitem。isubitem=1
lvitem。pszttext=PLC[I].深圳电视台
S7-1200可编程控制器setitem(lvitem);
lvitem。isubitem=2
lvitem。pszttext=PLC[I].辉仔
S7-1200可编程控制器setitem(lvitem);
lvitem。isubitem=3
lvitem。pszttext=PLC[I].szje
S7-1200可编程控制器setitem(lvitem);
}
CheckRadioButton(IDC_STDICON、IDC_REPORT、IDC _ STDICON);
返回true//返回没错,除非您将焦点设定为控制项
}
(4)完善列表显示方式代码
在利用类向导类向导创建各功能按钮显示功能函数之后,必须依次完善这些功能函数的代码,这些功能函数如下:
请参见cvclistd LG:con dicon()//设置大图标显示方式
{ //全部:在此处添加您的控制通知处理程序代码
龙伊斯梅尔;
我会的
lstyle=~ lvs _ typemask//清除显示方式位
lstyle =lvs _ icon//设置显示方式
setwindowlong(m _ listctrl。m _ hwnd、GWL_STYLE、l STYLE);//设置窗口类型
}
参见cvclistd LG:on licon()//设置小图标显示方式
{ //全部:在此处添加您的控制通知处理程序代码
长伊斯梅尔;
我会的
lstyle=~ lvs _ typemask//清除显示方式位
lstyle =lvs _ smallicon//设置显示方式
setwindowlong(m _ listctrl。m _ hwnd、GWL_STYLE、l STYLE);//设置窗口类型
}
请参阅cvclistd:onlist()//设置列表显示方式
{ //全部:在此处添加您的控制通知处理程序代码
长伊斯梅尔;
我会的
lstyle=~ lvs _ typemask//清除显示方式位
lstyle =lvs _ list//设置显示方式
setwindowlong(m _ listctrl。m _ hwnd、GWL_STYLE、l STYLE);//设置窗口类型
}
请参阅CVCLISTDlg:OnReport() //详细资料显示方式
{ //全部:在此处添加您的控制通知处理程序代码
长伊斯梅尔;
我会的
lstyle=~ lvs _ typemask//清除显示方式位
lstyle =lvs _ report//设置显示方式
setwindowlong(m _ listctrl。m _ hwnd、GWL_STYLE、l STYLE);//设置窗口类型
}
(5)删除功能的实现
要实现删除功能,必须获取选中条目的数量和条目总数,从后向前依次删除。原因是删除每个条目后,每个条目的索引号都会减少。如果采用从前向后删除的方法,则不能正常删除选中的条目。其功能代码如下:
voicvlistdlg:ondel()//删除按钮函数
{ //TODO:在此添加控件通知处理程序代码
int i,iState
int nItemSelected=m_ListCtrl。GetSelectedCount();//所选条目的数量
int nItemCount=m_ListCtrl。GetItemCount();//条目总数
if(nItemSelected 1)返回;
for(I=nitem count-1;我我- ){
iState=m_ListCtrl。GetItemState(i,LVIS _ SELECTED);
if(iState!=0) m_ListCtrl。删除项目(一);
}
}
(6)排序功能的实现。
列表控件有一个特殊的功能。详细显示时,列表顶部的表头可以作为按钮使用,按钮可以由创建列表控件时的样式控制。当鼠标单击列表标题的名称时,列表控件将向其父窗口发送一条LNV _列单击消息。通过将类指南中列表控件IDC_LISTCTRL对应的LNV_COLUMNCLICK消息添加到对应的处理函数中,可以按照特定的顺序排列列表列。有关该函数的用法,请参见过程,其中,iSort是已排序的表列的索引号,而(PFNLVCOMPARE)CompareFunc是用于特定排序的回调函数。也就是说,用鼠标点击表头实现的排序过程,是通过第三方开发的特殊排序功能实现的。排序函数只实现表项的具体比较操作,整个排序过程是通过SortItems方法不断调用这个函数来实现的。正常的排序过程是按升序进行的。通过改变排序函数中的参数值,可以实现降序排列,即PARAM1和PARAM2可以改变位置。这个回调函数的前两个参数是表列中表项的索引号,第三个参数是排序后的表列索引号。
void CVCLISTDlg:OnColumnclickListctrl(NMHDR * pNMHDR,LRESULT* pResult)
{//用鼠标左键单击表头处理功能。
NM _ LISTVIEW * pNMListView=(NM _ LISTVIEW *)pnm HDR;
//TODO:在此添加控件通知处理程序代码
静态int iso rted=-1;//排列顺序号
if(pNMListView-iSubItem==is orted)返回;
is orted=pNMListView-iSubItem;
m_ListCtrl。sort items((PFNLVCOMPARE)compare func,is orted);
* pResult=0;
}
//排序时比较表项的回调函数
int回调CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort)
{ char *text1,* text2
开关(lParamSort){
案例0L:text1=Sps[lParam1]。szPm
text2=Sps[lParam2]。szPm打破;
案例1L:text1=Sps[lParam1]。szSl
text2=Sps[lParam2]。szSl打破;
案例2L:text1=Sps[lParam1]。szDj
text2=Sps[lParam2]。szDj打破;
案例3L:text1=Sps[lParam1]。szJe
text2=Sps[lParam2]。szJe打破;
}
return (strcmp(text1,text 2));//结果是0=0 0
}
同样,排序功能也可以通过特殊按钮来实现。例如,本文中排序按钮对应的功能代码如下:
void CVCLISTDlg:OnSort()
{ //TODO:在此添加控件通知处理程序代码
m_ListCtrl。sort items((PFNLVCOMPARE)compare func,0);}
7.列表查看的练习技巧
使用listview时,其方法与列表控件基本相同,只是listview在一个窗口中实现,listcontrol在一个对话框中实现,listview的各种功能通过菜单实现,list control通过按钮实现等。Listcontrol需要在对话框中创建列表控件控件,listview直接占据整个窗口。在设计过程中,只要把按钮和listcontrol的设计过程改成菜单设计就可以了。并且注意函数添加是通过类向导中的菜单命令来操作的,同时在每个函数前面添加了获取列表可视化引用的命令(CListCtrl ListCtrl=GetListCtrl()),而其余的数据结构和代码都不需要修改,所以很容易实现。
作者实现的列表控件和可视化程序运行结果如下:
列表控件演练示例结果
请参见演练示例结果列表
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。