3、图像控制在标签控制中的应用技巧
①设置图像控制CTabCtrl::SetImageList的调用格式 CImageList * SetImageList( CImageList * pImageList );
其返回值为指向前一个图像列表的指针,如果不存在前一个图像列表则为NULL;pImageList为标识TAB控制的图像列表指针。
②取得图像控制CTabCtrl::GetImageList的调用格式 HIMAGELIST GetImageList() const;
其返回值为指向TAB控制的图像列表指针,如果调用不成功则为NULL。 其应用技巧较前两种更加简单,这里不再赘述。 三、PWIN98/95下演练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; char szSl[10]; char szDj[10]; char szJe[10]; } SPS;
int CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort); (2)在VCLISTDlg.CPP中的起始处增加初始化数据和程序定义 //在文件开始处增加数据结构初始化 SPS Sps[]={//信息
{\红梅\ {\黄梅\ {\绿梅\ {\青梅\ {\白梅\ {\红梅\ {\黄梅\ {\绿梅\ {\青梅\ {\白梅\ CImageList Cil1,Cil2;//大小图像列表
(3)在程序初始化处增加表头、图像和列表控制建立代码 BOOL CVCLISTDlg::OnInitDialog() {CDialog::OnInitDialog(); //......//其它代码
// TODO: Add extra initialization here此处增加代码 LV_ITEM lvitem; LV_COLUMN lvcol;
//品名 //0-GJ 1-XS //数量 //单价 //金额
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 lvitem.mask=LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM; lvitem.iItem=i; lvitem.iSubItem=0; lvitem.pszText=Sps[i].szPm; lvitem.iImage=Sps[i].Lx;