VC++中CList使用

 

VC++中CList使用

  435人阅读  评论(0)  收藏  举报

在Clist控件中显示网格
m_ctrlListCtrl.SetExtendedStyle(LVS_EX_GRIDLINES );
 


VC++ 列表控件(CList) 使用方法2009-12-07 19:06VC++ 列表控件(CList) 使用方法2009-11-25 10:46列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值。
MFC中使用CListCtrl类来封装列表控件的各种操作。

通过调用BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );创建一个窗口,dwStyle中可以使用以下一些列表控件的专用风格:

LVS_ICON LVS_SMALLICON LVS_LIST LVS_REPORT 这四种风格决定控件的外观,同时只可以选择其中一种,分别对应:大图标显示,小图标显示,列表显示,详细报表显示

LVS_EDITLABELS 结点的显示字符可以被编辑,对于报表风格来讲可编辑的只为第一列。

LVS_SHOWSELALWAYS 在失去焦点时也显示当前选中的结点

LVS_SINGLESEL 同时只能选中列表中一项

首先你需要设置列表控件所使用的ImageList,如果你使用大图标显示风格,你就需要以如下形式调用:

CImageList* SetImageList( CImageList* pImageList, LVSIL_NORMAL);
如果使用其它三种风格显示而不想显示图标你可以不进行任何设置,否则需要以如下形式调用:
CImageList* SetImageList( CImageList* pImageList, LVSIL_SMALL);

通过调用int InsertItem( int nItem, LPCTSTR lpszItem );可以在列表控件中nItem指明位置插入一项,lpszItem为显示字符。除LVS_REPORT风格外其他三种风格都只需要直接调用 InsertItem就可以了,但如果使用报表风格就必须先设置列表控件中的列信息。

通过调用int InsertColumn( int nCol, LPCTSTR lpszColumnHeading, int nFormat , int nWidth, int nSubItem);可以插入列。iCol为列的位置,从零开始,lpszColumnHeading为显示的列名,nFormat为显示对齐方式,nWidth为显示宽度,nSubItem为分配给该列的列索引。

在有多列的列表控件中就需要为每一项指明其在每一列中的显示字符,通过调用BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );可以设置每列的显示字符。nItem为设置的项的位置,nSubItem为列位置,lpszText为显示字符。下面的代码演示了如何设置多列并插入数据:

m_list.SetImageList(&m_listSmall,LVSIL_SMALL);//设置ImageList
m_list.InsertColumn(0,"Col 1",LVCFMT_LEFT,300,0);//设置列
m_list.InsertColumn(1,"Col 2",LVCFMT_LEFT,300,1);
m_list.InsertColumn(2,"Col 3",LVCFMT_LEFT,300,2);

m_list.InsertItem(0,"Item 1_1");//插入行
m_list.SetItemText(0,1,"Item 1_2");//设置该行的不同列的显示字符
m_list.SetItemText(0,2,"Item 1_3");

此外CListCtrl还提供了一些函数用于得到/修改控件的状态。
COLORREF GetTextColor( )/BOOL SetTextColor( COLORREF cr );用于得到/设置显示的字符颜色。
COLORREF GetTextBkColor( )/BOOL SetTextBkColor( COLORREF cr );用于得到/设置显示的背景颜色。

void SetItemCount( int iCount );用于得到添加进列表中项的数量。
BOOL DeleteItem(int nItem);用于删除某一项,BOOL DeleteAllItems( );将删除所有项。
BOOL SetBkImage(HBITMAP hbm, BOOL fTile , int xOffsetPercent, int yOffsetPercent);用于设置背景位图。

CString GetItemText( int nItem, int nSubItem );用于得到某项的显示字符。

列表控件的消息映射同样使用ON_NOTIFY宏,形式如同:ON_NOTIFY( wNotifyCode, id, memberFxn ),wNotifyCode为通知代码,id为产生该消息的窗口ID,memberFxn为处理函数,函数的原型如同void OnXXXList(NMHDR* pNMHDR, LRESULT* pResult),其中pNMHDR为一数据结构,在具体使用时需要转换成其他类型的结构。对于列表控件可能取值和对应的数据结构为:

LVN_BEGINLABELEDIT 在开始某项编辑字符时发送,所用结构:NMLVDISPINFO
LVN_ENDLABELEDIT 在结束某项编辑字符时发送,所用结构:NMLVDISPINFO
LVN_GETDISPINFO 在需要得到某项信息时发送,(如得到某项的显示字符)所用结构:NMLVDISPINFO
关于ON_NOTIFY有很多内容,将在以后的内容中进行详细讲解。

关于动态提供结点所显示的字符:首先你在项时需要指明lpszItem参数为:LPSTR_TEXTCALLBACK。在控件显示该结点时会通过发送 TVN_GETDISPINFO来取得所需要的字符,在处理该消息时先将参数pNMHDR转换为LPNMLVDISPINFO,然后填充其中 item.pszText。通过item中的iItem,iSubItem可以知道当前显示的为那一项。下面的代码演示了这种方法:

char szOut[8][3]={"No.1","No.2","No.3"};
//添加结点
m_list.InsertItem(LPSTR_TEXTCALLBACK,...)
m_list.InsertItem(LPSTR_TEXTCALLBACK,...)
//处理消息
void CParentWnd::OnGetDispInfoList(NMHDR* pNMHDR, LRESULT* pResult)
{
    LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR;
    pLVDI->item.pszText=szOut[pTVDI->item.iItem];//通过iItem得到需要显示的字符在数组中的位置
    *pResult = 0;
}

关于编辑某项的显示字符:(在报表风格中只对第一列有效)首先需要设置列表控件的LVS_EDITLABELS风格,在开始编辑时该控件将会发送 LVN_BEGINLABELEDIT,你可以通过在处理函数中返回TRUE来取消接下来的编辑,在编辑完成后会发送LVN_ENDLABELEDIT,在处理该消息时需要将参数pNMHDR转换为LPNMLVDISPINFO,然后通过其中的item.pszText得到编辑后的字符,并重置显示字符。如果编辑在中途中取消该变量为NULL。下面的代码说明如何处理这些消息:

//处理消息 LVN_BEGINLABELEDIT void CParentWnd::OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult)
{
    LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR;
    if(pLVDI->item.iItem==0);//判断是否取消该操作
         *pResult = 1;
    else
         *pResult = 0;
}
//处理消息 LVN_BEGINLABELEDIT
void CParentWnd::OnBeginEditList(NMHDR* pNMHDR, LRESULT* pResult)
{
    LV_DISPINFO* pLVDI = (LV_DISPINFO*)pNMHDR;
    if(pLVDI->item.pszText==NULL);//判断是否已经取消取消编辑
          m_list.SetItemText(pLVDI->item.iItem,0,pLVDI->pszText);//重置显示字符
    *pResult = 0;
}

上面讲述的方法所进行的消息映射必须在父窗口中进行(同样WM_NOTIFY的所有消息都需要在父窗口中处理)。

如何得到当前选中项位置:在列表控件中没有一个类似于ListBox中GetCurSel()的函数,但是可以通过调用GetNextItem( -1, LVNI_ALL   LVNI_SelectED);得到选中项位置。

 

一、基本使用
1.新加ListControl 控件,属性中的style属性页下的View选择Report。
并设置其对应的控制变量如:m_list1。

2.初始化,即设置列。       用m_list1。
         m_list1.InsertColumn(0,"曲名");           //插入列
m_list1.InsertColumn(1,"类型");
m_list1.InsertColumn(2,"长度");
m_list1.InsertColumn(3,"路径");

CRect rect4;
m_list1.GetClientRect(rect4);                     //获得当前客户区信息
m_list1.SetColumnWidth(0,rect4.Width()/4);         //设置列的宽度。
m_list1.SetColumnWidth(1,rect4.Width()/5);
m_list1.SetColumnWidth(2,rect4.Width()/5);
m_list1.SetColumnWidth(3,rect4.Width()*8/20);

这部分初始化操作,最好放在对话框类的OnInitDialog()函数里,自动初始化。

3.插入数据
         m_list1.InsertItem(0,"大海");       //插入第一个数据,即第0条数据。先插入,然后在修改其他的信息。
         m_list1.SetItemText(0,1,"mp3");     //修改第0条数据的其他信息。
         m_list1.SetItemText(0,2,"4:20");
         m_list1.SetItemText(0,3,"c:/");

4.删除所有数据
         m_list1.DeleteAllItems();

5.补充:
     特别注意的地方是,在插入新项(记录)的时候,使用m_list1.GetItemCount()获取当前报表中的项目总数。但是m_list1.InsertItem()函数调用时候不能使用m_list1.GetItemCount()+1。因为项目是从0
开始计数的。

二、其他技巧
 
 1.如何设置ListView控件的完全行(Full Row)选项。
     这个控件有个地方常常很恼人,那就是在报告视图中选中一行时,它只加亮最左边的一个栏目。
     为了克服这个问题,这里告诉你一个方法:向ListView控件发送一个LVM_SETEXTENDEDLISTVIEWSTYLE消息。
::SendMessage(m_list1.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_FULLROWSelect, LVS_EX_FULLROWSelect);

VC通用控件编程之CList控件2009-03-19 14:30VC通用控件编程之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<iItemNum;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;

lvitem.lParam=i;

iPos=m_ListCtrl.InsertItem(&lvitem);//返回表项插入后的索引号

lvitem.mask=LVIF_TEXT;

lvitem.iItem=iPos;

lvitem.iSubItem=1;

lvitem.pszText=Sps[i].szSl;

m_ListCtrl.SetItem(&lvitem);

lvitem.iSubItem=2;

lvitem.pszText=Sps[i].szDj;

m_ListCtrl.SetItem(&lvitem);

lvitem.iSubItem=3;

lvitem.pszText=Sps[i].szJe;

m_ListCtrl.SetItem(&lvitem);

}

CheckRadioButton(IDC_STDICON,IDC_REPORT,IDC_STDICON);

return TRUE; // return TRUE unless you set the focus to a control

}

(4)完善列表显示方式代码

在利用Classwizard类向导创建各功能按钮显示功能函数之后,必须依次完善这些功能函数的代码,这些功能函数如下:

void CVCLISTDlg::OnStdicon()//设置大图标显示方式

{ // TODO: Add your control notification handler code here

LONG lStyle;

lStyle=GetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE);//获取当前窗口类型

lStyle&=~LVS_TYPEMASK; //清除显示方式位

lStyle|=LVS_ICON; //设置显示方式

SetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE,lStyle);//设置窗口类型

}

void CVCLISTDlg::OnSmlicon() //设置小图标显示方式

{ // TODO: Add your control notification handler code here

LONG lStyle;

lStyle=GetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE);//获取当前窗口类型

lStyle&=~LVS_TYPEMASK; //清除显示方式位

lStyle|=LVS_SMALLICON; //设置显示方式

SetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE,lStyle);//设置窗口类型

}

void CVCLISTDlg::OnList() //设置列表显示方式

{ // TODO: Add your control notification handler code here

LONG lStyle;

lStyle=GetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE);//获取当前窗口类型

lStyle&=~LVS_TYPEMASK; //清除显示方式位

lStyle|=LVS_LIST; //设置显示方式

SetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE,lStyle);//设置窗口类型

}

void CVCLISTDlg::OnReport() //详细资料显示方式

{ // TODO: Add your control notification handler code here

LONG lStyle;

lStyle=GetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE);//获取当前窗口类型

lStyle&=~LVS_TYPEMASK; //清除显示方式位

lStyle|=LVS_REPORT; //设置显示方式

SetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE,lStyle);//设置窗口类型

}

(5)删除功能的实现

要实现删除功能,必须取得选中表项的数和表项总数,并且需要从后向前进行依次删除,其原因是每个表项被删除后,其后各表项的索引号均会发生递减变化,如果采取从前向后删除的方法,就会造成无法正常删除选中的表项,其功能代码如下:

void CVCLISTDlg::OnDel() //删除按钮功能

{ // TODO: Add your control notification handler code here

int i,iState;

int nItemSelected=m_ListCtrl.GetSelectedCount();//所选表项数

int nItemCount=m_ListCtrl.GetItemCount();//表项总数

if(nItemSelected<1) return;

for(i=nItemCount-1;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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值