C++控件之 CList

(一)列表控制的主要功能 列表控制和视(List Control&View)主要用来以各种方式显示一组数据记录供用户进行各种操作,Windows98/95中资源管理器中的“查看”标签下的 “大图标|小图标|列表|详细资源”就是一个非常好的典型应用。列表中的记录可以包括多个数据项,也可以包括表示数据内容的大小图标,用来表示数据记录的各种属性。 列表控制提供了对Windows列表功能操作的基本方法,而使用列表视的视函数可以对列表视进行各种操作,通过调用视成员GetListCtrl获取嵌在列表视内列表控制的引用(GetListCtrl& ctrlList = GetListCtrl()),就可以和列表控制一样进行各种操作。操作一个列表控制和视的基本方法为:创建列表控制;创建列表控制所需要的图像列表;向列表控制添加表列和表项;对列表进行各种控制,主要包括查找、排序、删除、显示方式、排列方式以及各种消息处理功能等;最后撤消列表控制。 对于一个列表控制,其最典型最常用的显示控制方式为:大图标方式(LVS_ICON)、小图标方式(LVS_SMALLICON)、列表显示方式(LVS_LIST)和详细资料(即报告LVS_REPORT)显示方式。这可以通过设置其显示方式属性来实现。要控制列表所在窗口的风格,可通过功能函数GetWindowLong和SetWindowLong来实现,要控制列表图标的对齐方式,可通过设置列表窗口的风格LVS_ALIGNTOP或LVS_ALIGNLEFT来实现, (二)列表控制的对象结构 1、列表控制的建立方法 CListCtrl&listCtrl 定义列表对象的结构 Create 建立列表控制并绑定对象 列表控制CListCtrl::Create的调用格式如下: BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ); 其中参数dwStyle用来确定列表控制的风格;rect用来确定列表控制的大小和位置;pParentWnd用来确定列表控制的父窗口,通常是一个对话框;nID用来确定列表控制的标识。其中列表控制的风格可以是下列值的组合: LVS_ALIGNLEFT 用来确定表项的大小图标以左对齐方式显示; LVS_ALIGNTOP 用来确定表项的大小图标以顶对齐方式显示; LVS_AUTOARRANGE 用来确定表项的大小图标以自动排列方式显示; LVS_EDITLABELS 设置表项文本可以编辑,父窗口必须设有LVN_ENDLABELEDIT风格; LVS_ICON 用来确定大图标的显示方式; LVS_LIST 用来确定列表方式显示; LVS_NOCOLUMNHEADER 用来确定在详细资料方式时不显示列表头; LVS_NOLABELWRAP 用来确定以单行方式显示图标的文本项; LVS_NOSCROLL 用来屏蔽滚动条; LVS_NOSORTHEADER 用来确定列表头不能用作按钮功能; LVS_OWNERDRAWFIXED 在详细列表方式时允许自绘窗口; LVS_REPORT 用来确定以详细资料即报告方式显示; LVS_SHAREIMAGELISTS用来确定共享图像列表方式; LVS_SHOWSELALWAYS 用来确定一直显示被选中表项方式; LVS_SINGLESEL 用来确定在某一时刻只能有一项被选中; LVS_SMALLICON 用来确定小图标显示方式; LVS_SORTASCENDING 用来确定表项排序时是基于表项文本的升序方式; LVS_SORTDESCENDING 用来确定表项排序时是基于表项文本的降序方式; 2、列表控制的属性类 列表控制的属性类包括取得列表控制的背景色GetBkColor、设置列表控制的背景色 SetBkColor、取得列表控制的图像列表GetImageList、设置列表控制的图像列表SetImageList、取得列表项数目 GetItemCount、取得列表控制的属性GetItem、取得与表项相关的数据GetItemData、设置表项的属性SetItem、设置与表项相关的数值SetItemData、取得相关联的下一个表项GetNextItem、设置列表控制的文本颜色SetTextColor、取得列表控制的文本背景颜色GetTextBkColor、设置表项的最大数目SetItemCount和取得被选中表项的数目GetSelectedCount等。 3、列表控制的操作方法 列表控制的操作方法包括插入一个新的表项InsertItem、删除一个表项DeleteItem、排序表项SortItems、测试列表的位置HitTest、重绘表项RedrawItems、插入一个表列InsertColumn、删除一个表列 DeleteColumn、编辑一个表项文本EditLabel和重绘一个表项DrawItem等。 (三)列表控制的数据结构 列表控制中包含两个非常重要的数据结构LV_ITEM和LV_COLUMN。LV_ITEM用于定义列表控制的一个表项,LV_COLUMN用于定义列表控制的一个表列,其定义格式分别为: typedef struct _LV_ITEM { UINT mask; //结构成员屏蔽位 int iItem; //表项索引号 int iSubItem; //子表项索引号 UINT state; //表项状态 UINT stateMask; //状态有效性屏蔽位 LPTSTR pszText; //表项名文本 int cchTextMax; //表项名最大长度 int iImage; // 表项图标的索引号 LPARAM lParam; // 与表项相关的32位数 } LV_ITEM; typedef struct _LV_COLUMN { UINT mask; //结构成员有效性屏蔽位 int fmt; //表列对齐方式 int cx; //表列的象素宽度 LPTSTR pszText; //表列的表头名 int cchTextMax; //表列名的文本长度 int iSubItem; //与表列关联的子表项索引号 } LV_COLUMN; 其中fmt可以取如下值: LVCFMT_CENTER 表列居中对齐 LVCFMT_LEFT 表列左对齐 (四)列表控制的应用技巧示例 本文给出具体实例演示列表控制及前面的表头控制和图像列表的应用技巧。步骤如下: 1、通过“FILE->NEW->PROJECTS->MFC AppWizard(EXE)”建立名为VCLIST的工程,在建立过程中选择基于对话框(Dialog based)的应用;将对话框中的默认控件删除,并将所有对话框属性中的Language域设置为Chinese(P.R.C.),以使应用程序支持中文; 2. 建立两个图标IDI_GJ和IDI_XS,用来表示图标的选中和非选中状态,对于每个图标都应建立32X32和16X16两种大小,以保证程序的需要; 3、在对话框窗口中设计组合框(Group Box),组合框中设置四个无线按钮(Radio)“大图标|小图标|列表|资料”,同时设置排序、删除和关闭三个控制按钮(Button),并在对话框中设置大小合适的列表控制(List Ctrl),其对应标识分别如下: 控制名称 标题名称 标识符号 列表控制 IDC_LISTCTRL 组合框 方式 IDC_STATIC 无线按钮 大图标 IDC_STDICON 小图标 IDC_SMLICON 列 表 IDC_LIST 资 料 IDC_REPORT 按钮 排 序 IDC_SORT 删 除 IDC_DEL 关 闭 IDOK 4、在设置无线按钮时,需要注意的是只有大图标的Group属性为选中状态,而其它无线按钮的状态均为默认值。 5、选中列表控制控件,选择“VIEW->ClassWizard->Memory Variables”,并利用IDC_ LISTCTRL引入成员变量,其变量类型为: 变量名 种类 变量类型 m_ListCtrl Control ClistCtrl 同时利用“MESSAGES MAP”为各无线按钮和命令按钮增加控制功能。 6、然后在包含文件和代码文件中分别加入如下代码: (1)在VCLISTDlg.h中增加数据结构和定义 typedef struct tagSPS { //定义结构 char szPm[10]; //品名 int Lx; //0-GJ 1-XS char szSl[10]; //数量 char szDj[10]; //单价 char szJe[10]; //金额 } SPS; int CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort); (2)在VCLISTDlg.CPP中的起始处增加初始化数据和程序定义 //在文件开始处增加数据结构初始化 SPS 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,Cil2;//大小图像列表 (3)在程序初始化处增加表头、图像和列表控制建立代码 BOOL CVCLISTDlg::OnInitDialog() {CDialog::OnInitDialog(); //......//其它代码 // TODO: Add extra initialization here此处增加代码 LV_ITEM lvitem; LV_COLUMN lvcol; int i,iPos,iItemNum; CVCLISTApp *pApp=(CVCLISTApp *)AfxGetApp();//创建图象列表 Cil1.Create(32,32,TRUE,2,2); Cil1.Add(pApp->LoadIcon(IDI_GJ)); Cil1.Add(pApp->LoadIcon(IDI_XS)); Cil2.Create(16,16,TRUE,2,2); Cil2.Add(pApp->LoadIcon(IDI_GJ)); Cil2.Add(pApp->LoadIcon(IDI_XS));//设置图象列表 m_ListCtrl.SetImageList(&Cil1,LVSIL_NORMAL); m_ListCtrl.SetImageList(&Cil2,LVSIL_SMALL);//向列表控制中添加表列 lvcol.mask=LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH; lvcol.fmt=LVCFMT_CENTER;//居中 i=0; lvcol.pszText="品 名"; lvcol.iSubItem=i; lvcol.cx=70; m_ListCtrl.InsertColumn(i++,&lvcol); lvcol.pszText="数 量"; lvcol.iSubItem=i; lvcol.cx=70; m_ListCtrl.InsertColumn(i++,&lvcol); lvcol.pszText="单 价"; lvcol.iSubItem=i; lvcol.cx=70; m_ListCtrl.InsertColumn(i++,&lvcol); lvcol.pszText="金 额"; lvcol.iSubItem=i; lvcol.cx=70; m_ListCtrl.InsertColumn(i++,&lvcol); //向列表控制中添加表项 iItemNum=sizeof(Sps)/sizeof(SPS); for(i=0;i =0;i--){ iState=m_ListCtrl.GetItemState(i,LVIS_SELECTED); if(iState!=0) m_ListCtrl.DeleteItem(i); } } (6)排序功能的实现 列表控制有一个特殊的功能,当以详细资料方式显示时,列表顶部的表头可以当作按钮来使用,这可以通过列表控制创建时的风格来控制。当鼠标点击列表头名称时,列表控制就会向其父窗口发送一个LNV_COLUMNCLICK消息,利用类导向中列表控制 IDC_LISTCTRL对应的LNV_COLUMNCLICK消息加入相应处理函数,就可将表列按照特定顺序进行排列。其函数使用方法见程序,其中 iSort为排序的表列索引号,(PFNLVCOMPARE)CompareFunc为进行具体排序的回调函数,也就是说,通过鼠标点击表头实现的排序过程是由第三方开发的专用排序函数来实现的,排序函数只是实现表项的具体比较操作,而整个排序过程是由SortItemS属性通过不断调用这个函数来实现的。正常的排序过程是升序方式,通过调换排序函数中的参数值,就可实现降序排列,即将PARAM1与PARAM2调换位置。这个回调函数的前两个参数为表列中表项的索引号,第三个参数为排序的表列索引号。 void CVCLISTDlg::OnColumnclickListctrl(NMHDR* pNMHDR, LRESULT* pResult) { //鼠标左键单击表头处理函数 NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: Add your control notification handler code here static int iSorted=-1;//排列序号 if (pNMListView->iSubItem==iSorted) return; iSorted=pNMListView->iSubItem; m_ListCtrl.SortItems((PFNLVCOMPARE)CompareFunc,iSorted); *pResult = 0; } //排序时比较表项的回调函数 int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2,LPARAM lParamSort) { char *text1,*text2; switch (lParamSort){ case 0L:text1=Sps[lParam1].szPm; text2=Sps[lParam2].szPm;break; case 1L:text1=Sps[lParam1].szSl; text2=Sps[lParam2].szSl;break; case 2L:text1=Sps[lParam1].szDj; text2=Sps[lParam2].szDj;break; case 3L:text1=Sps[lParam1].szJe; text2=Sps[lParam2].szJe;break; } return (strcmp(text1,text2));//结果为>0 =0 <0 } 同样,也可以通过专用按钮来实现排序功能,如本文的排序按钮对应的功能代码如下: void CVCLISTDlg::OnSort() { // TODO: Add your control notification handler code here m_ListCtrl.SortItems((PFNLVCOMPARE)CompareFunc,0);} 7、列表视的演练技巧 在使用列表视时,其方法与列表控制基本相同,只不过列表视是在窗口中来实现的而列表控制是在对话框中实现,列表视的各种功能是通过菜单来实现的而列表控制是通过按钮等方式来实现的,列表控制需要在对话框中创建列表控制控件而列表视直接占据整个窗口,在设计过程中只要将按钮和列表控制设计过程变为菜单设计,并注意在功能增加是在类向导中是通过菜单命令来操作,同时在每个功能函数前面增加取得列表视引用的命令( CListCtrl& ListCtrl = GetListCtrl()),而其余数据结构和代码均不需要修改,实现起来比较容易。 笔者实现的列表控制和视程序的运行结果如下: 列表控制演练示例结果 列表视演练示例结果
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1,indicator.ZIP数据棒图控件(200KB)2,xjtpripr.ZIP 打印预览控件(257KB) 3,trend.ZIP趋势控件可用于科学,工业监控,数据采集,股市分析等领域的数据显示、分析、打印(305KB) 4,dxcontrol.ZIP API 函数控件,包含输入、声音、图形等(358KB)5,gauge.ZIP 控件支持多数据处理和鼠标控制操作(232KB)6,meter.ZIP 圆盘仪表控件(240KB) 7,percent.ZIP 百分比控件的应用范围非常广泛,既适用于通用的软件系统,也可用于科学、统计、工业监控等多种实时数据领域(192KB)8,slider.ZIP Slider 控件不但可生成通用的滑块控制,而且内置了大量的指针、刻度、数据棒风格用于组合生成各式各样的线形控制(246KB)9,imgctls.ZIP 该控件包含两个控件,ImgListBox和ImgComboBox(56KB)10,nslock15.ZIPSheridan Soft出品Outlook风格的工具栏控件(97KB)11,CDrom.ZIP 控制光驱的东东(5KB)12,ActiveSkin.ZIP界面美化(69KB)13,FOXHWND.ZIP 一个比MCI32更出色的多媒体控件(14KB)14,ACTIVEXSQL.ZIP SQL接口控件(29KB)15,Big2GB.ZIP 简繁体转换(41KB) 16,ACTIVEZIPPER.ZIP 高效率的压缩控件(11KB)17,BOOKMARK.ZIP BOOKMARK控件(20KB)18,AresButtonPro.ZIP 任意形状立体动态按钮(306KB)19,SysTray.ZIP 托盘控件(9KB) 20,Recorder.ZIP 录音控件(15KB)21,CRESCENT2.ZIP crescent公司的internet 编程套件2.0(2,642KB)22,XCEEDZIP.ZIP XCEEDZIP解压缩控件(987KB) 23,ZIP_ACTOCX.ZIP ZIP_ACT解压缩控件(26KB)24,Dssocket.ZIP Dssocket是用来设计TCP/IP软件的VBX/OCX控件(781KB)25,ZIPOCXCMP.ZIP ZIPOCXCMP解压缩控件(83KB)26,DYNACUBE.ZIP DynamiCube 32-bit数据库控件(1,282KB)27,DYNAZIP30.ZIP DynaZIP解压缩控件(299KB)28,f[1].ZIP 使你的程序提供打印和打印预览功能控件(59KB)29,b[1].ZIP 使你的应用程序能够通过internet连接在线检查更新版本(511KB)30,c[1].ZIP 可以清晰朗读汉字,英文字母和数字的ActiveX控件(3,768KB) 31,cdnotiy.ZIP 当光盘被放进光驱或光驱里有光盘时便触发了这个控件(38KB)32,Mp3play.ZIP MP3PLAY 1.4 新版, 播放MP3的控件(181KB)33,mp3dll.ZIP 又一个简单播放MP3的控件(82KB)34,Zcg_3DLabel.ZIP 一个3D标签控件(15KB)<b
1,cstatic_filespec.zip静态文本中用省略号显示长文件名(3KB)2,cstatic_filespec_demo.zip静态文本中用省略号显示长文件名的演示程序(14KB)3,newlabel_app.zipCNewLabel--高级的CStatic派生(39KB)4,jumpytext_demo.zip跳动的文本类演示程序(138KB)<END)5,jumpytext_src.zip跳动的文本类(5KB)<END)6,alexf_histogram_src.zip由CStatic派生的柱状图控制(3KB)7,alexf_histogram.zip由CStatic派生的柱状图控制演示程序(20KB)8,history_edit.zip滚动显示历史信息的编辑控制 (2KB)9,history_edit_demo.zip滚动显示历史信息的编辑控制演示程序 (14KB)10,bcmenu23.zip用工具条的位图资源制作自绘菜单(59KB)11,owner_drawn_menu4.zip自动使用工具条的位图资源制作自绘菜单(109KB)12,contentmenu.zip一个非常COOL的导航菜单(3KB)13,contentmenu_demo.zip一个非常COOL的导航菜单演示程序(37KB)14,freemenu.zip随意设定颜色和字体的自绘菜单(35KB)15,menutip.zip实现菜单的工具提示演示程序(33KB)16,dockmenubar_src.zipDevStudio样式的泊位菜单条(不用MSIE)(27KB)17,dockmenubar_demo.zipDevStudio样式的泊位菜单条演示程序(不用MSIE)(58KB)18,label_edit.zip可编辑的标号控制(5KB)19,flat_scrollbar.zip扁平滚动条控制(11KB)20,avidemo.zip动画控制的例子(145KB)21,balloontooltip_src.zip像气球一样的工具提示(7KB)22,balloontooltip_demo.zip像气球一样的工具提示演示程序(49KB)23,check_frame.zip一个有用的CheckFrame控制(31KB)24,extended_tooltip.zip扩展的ToolTipCtrl类(21KB)25,progress_in_status2_src.zip在状态栏里显示进度条(4KB)26,progress_in_status2_demo.zip在状态栏里显示进度条演示程序(39KB)27,vcmenu.zipVisual Studio/Office 97 式样的扁平工具条和可泊位菜单条(350KB)28,flatbar_source.zip另一个扁平工具条(不需要MSIE)(11KB)29,flatbar_sample_project.zip另一个扁平工具条(不需要MSIE)工程程序(185KB)30,enh_flatbar_source.zip另一个扁平工具条(不需要MSIE)增强版(25KB)31,enh_flatbar_sample.zip另一个扁平工具条(不需要MSIE)演示增强版(56KB)32,customizable_tb.zip可定制的工具条(25KB)33,treemenudemo.zip一个类似IE4的收藏夹/历史/频道视图的控制(72KB)34,cdirtreectrl_demo.zipDirTreeCtrl--显示文件夹和文件演示程序(56KB)35,cdirtreectrl_src.zipDirTreeCtrl--显示文件夹和文件(6KB)36,a

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值