CListCtrl,clistctrl控件

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: