列表视图控件 CListCtrl《转》

列表视图

大图标格式(Large Icons).可逐行显示多列表项,图标的大小可由应用程序指定,通常是32×32像素,在图标的下面显示标题.

小图标格式(Small Icons).可逐行显示多列表项,图标的大小可由应用程序指定,通常是16×16像素,在图标的右面显示标题.表项以行的方式组织.

列表格式(List).与小图标格式类似.不同之处在于表项是逐列多列显示的.

报告格式(Report或Details).每行仅显示一个表项,在标题的左边显示一个图标,表项可以不显示图标而只显示标题.表项的右边可以附加若干列子项(Subitem),子项只显示正文.在控件的顶端还可以显示一个列表头用来说明各列的类型.列表视图的报告格式很适合显示报表(如数据库报表).

 在讨论如何使用列表视图控件以前,显向读者介绍一下与该控件有关的一些数据类型:

LV_COLUMN

结构.该结构仅用于报告式列表视图,用来描述表项的某一列.要想向表项中插入新的一列,需要用到该结构.LV_COLUMN结构的定义为
typedef struct _LV_COLUMN {

UINT mask; //

int fmt; /*

int cx; //

LPTSTR pszText; //

int cchTextMax; //

int iSubItem; //

} LV_COLUMN;

LV_ITEM

屏蔽位的组合(见下面括号),表明哪些成员是有效的.该列的表头和子项的标题显示格式(LVCF_FMT).可以是LVCFMT_CENTER、LVCFMT_LEFT或LVCFMT_RIGHT*/以像素为单位的列的宽度(LVCF_FMT)指向存放列表头标题正文的缓冲区(LVCF_TEXT)标题正文缓冲区的长度(LVCF_TEXT)说明该列的索引(LVCF_SUBITEM)结构.该结构用来描述一个表项或子项,它包含了项的各种属性,其定义为
typedef struct _LV_ITEM {

UINT mask; //

屏蔽位的组合(见下面括号),表明哪些成员是有效的
int iItem; //

int iSubItem; /*

UINT state; //

UINT stateMask; //

从1开始编号的子项索引(列索引),若值为0则说明该成员无效,结构描述的是一个表项而不是子项从0开始编号的表项索引(行索引)*/项的状态(LVIF_STATE)项的状态屏蔽
LPTSTR pszText; //

int cchTextMax; //

int iImage; //

LPARAM lParam; // 32

} LV_ITEM;

指向存放项的正文的缓冲区(LVIF_TEXT)正文缓冲区的长度(LVIF_TEXT)图标的索引(LVIF_IMAGE)位的附加数据(LVIF_PARAM)
其中

lParam成员可用来存储与项相关的数据,这在有些情况下是很有用的.state和stateMask的值如表6.28所示,stateMask用来说明要获取或设置哪些状态.6.28 列表视图的状态

 

 

状态
 对应的状态屏蔽
 含义
 
LVIS_CUT
 同左
 项被选择用来进行剪切和粘贴操作.
 
LVIS_DROPHILITED
 同左
 项成为拖动操作的目标.
 
LVIS_FOCUSED
 同左
 项具有输入焦点.
 
LVIS_SELECTED
 同左
 项被选中.
 

NM_LISTVIEW

MFC

 dwStyle是如表6.29所示的控件风格的组合.
6.29 列表视图的风格

其中参数

控件风格
 含义
 
LVS_ALIGNLEFT
 当显示格式是大图标或小图标时,标题放在图标的左边.缺省情况下标题放在图标的下面.
 
LVS_ALIGNTOP
 当显示格式是大图标或小图标时,标题放在图标的上边.
 
LVS_AUTOARRANGE
 当显示格式是大图标或小图标时,自动排列控件中的表项.
 
LVS_EDITLABELS
 用户可以修改标题.
 
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
 按降序排列表项.
 

 
除上表的风格外,一般还要指定WS_CHILD和WS_VISIBLE窗口风格.风格组合WS_CHILD| WS_VISIBLE|LVS_REPORT|LVS_AUTOARRANGE|LVS_EDITLABLES|LVS_SINGLESEL将指定一个自动排列的、可编辑标题的、单选择报告式列表视图控件.要指定大图标、小图标或列表式的列表视图控件,则应该把LVS_REPORT换成LVS_ICON、LVS_SMALLICON或LVS_LIST.对于用对话框模板创建的列表视图控件,可以在控件的属性对话框中指定上表中列出的控件风格。例如,在属性对话框的Styles页的View栏中选择Icon,相当于指定了LVS_ICON风格.类提供了大量的成员函数.在这里,我们结合实际应用来介绍一些常用的函数:InsertColumn插入各个列,该函数的声明为
int InsertColumn( int nCol, const LV_COLUMN* pColumn );
其中参数nCol是新列的索引,参数pColumn指向一个LV_COLUMN结构,函数根据该结构来创建新的列.若插入成功,函数返回新列的索引,否则返回-1.
要删除某列,应调用DeleteColumn函数,其声明为
BOOL DeleteColumn( int nCol );

表项的插入.要插入新的表项,应调用

要删除某表项,应调用

InsertItem.如果要显示图标,则应该先创建一个CImageList对象并使该对象包含用作显示图标的位图序列.然后调用SetImageList来为列表视图设置位图序列.函数的声明为
int InsertItem( const LV_ITEM* pItem );


参数pItem指向一个LV_ITEM结构,该结构提供了对表项的描述.若插入成功则函数返回新表项的索引,否则返回-1.
CImageList* SetImageList( CImageList* pImageList, int nImageList );


参数pImageList指向一个CImageList对象,参数nImageList用来指定图标的类型,若其值为LVSIL_NORMAL,则位图序列用作显示大图标,若值为LVSIL_SMALL,则位图序列用作显示小图标.可用该函数同时指定一套大图标和一套小图标.DeleteItem,要删除所有的项,应调用DeleteAllItems.一旦表项被删除,其子项也被删除.函数的声明为
BOOL DeleteItem( int nItem );
BOOL DeleteAllItems( );
调用

调用

要查询表项的数目,应该调用

GetItemText和SetItemText来查询和设置表项及子项显示的正文.SetItemText的一个重要用途是对子项进行初始化.函数的声明为
int GetItemText( int nItem, int nSubItem, LPTSTR lpszText, int nLen ) const;
CString GetItemText( int nItem, int nSubItem ) const;
BOOL SetItemText( int nItem, int nSubItem, LPTSTR lpszText );
其中参数nItem是表项的索引(行索引),nSubItem是子项的索引(列索引),若nSubItem为0则说明函数是针对表项的.参数lpszText指向正文缓冲区,参数nLen说明了缓冲区的大小.第二个版本的GetItemText返回一个含有项的正文的Cstring对象.GetItem和SetItem来查询和设置.用这两个功能强大的函数,几乎可以查询和设置指定项的所有属性,包括正文、图标及选择状态.函数的声明为
BOOL GetItem( LV_ITEM* pItem ) const;
BOOL SetItem( const LV_ITEM* pItem );
参数pItem是指向LV_ITEM结构的指针,函数是通过该结构来查询或设置指定项的,在调用函数前应该使该结构的iItem或iSubItem成员有效以指定表项或子项.CListCtrl还提供了一系列函数可完成GetItem和SetItem的部分功能,其中GetItemState、GetItemText和GetItemData函数用于查询,SetItemState、SetItemText和SetItemData函数用于设置.GetItemCount,其声明为 int GetItemCount( );
要寻找与指定表项项相关的表项,或寻找具有某种状态的表项,应该调用

GetNextItem.该函数的一个重要用处是搜索被选择的表项.函数的声明为
int GetNextItem( int nItem, int nFlags ) const;
参数nItem是指定项的索引,参数nFlags是如表6.30所示的标志,用来指定查询的关系.函数返回搜索到的表项的索引,若未找到则返回-1.

6.30 关系标志

 

 

CListCtrl

列的插入和删除.在以报告格式显示列表视图时,一般会显示一列表项和多列子项.在初始化列表视图时,先要调用

标志
 含义
 
LVNI_ABOVE
 返回位于指定表项上方的表项.
 
LVNI_ALL
 缺省标志,返回指定表项的下一个表项(以索引为序).
 
LVNI_BELOW
 返回位于指定表项下方的表项.
 
LVNI_TOLEFT
 返回位于指定表项左边的表项.
 
LVNI_TORIGHT
 返回位于指定表项右边的表项.
 
LVNI_DROPHILITED
 返回拖动操作的目标表项.
 
LVNI_FOCUSED
 返回具有输入焦点的表项.
 
LVNI_SELECTED
 返回被选择的表项.
 

  

要对表项进行排列、排序和搜索,可分别调用

有时需要在列表视图创建后动态地改变其显示格式,例如,资源管理器中的列表视图就可以在四中显示格式之间切换.改变显示格式其实就是改变列表视图的风格,要改变控件的风格,应先调用

Arrange、SortItems和FindItems函数来完成.::GetWindowLong获取控件原来的风格,并对其进行修改,然后调用::SetWindowLong设置新的风格.这两个函数不是成员函数,而是Windows API函数,用来查询和设置窗口的风格.

 

 除了表6.22列出的控件消息外,列表视图控件还会发送自己特有的通知消息,其中常用的有下面这几个:

LVN_ITEMCHANGING

和LVN_ITEMCHANGED.当列表视图的状态发生变化时,会发送这两个通知消息.例如,当用户选择了新的表项时,程序就会收到这两个消息.消息会附带一个指向NM_LISTVIEW结构的指针,消息处理函数可从该结构中获得状态信息.两个消息的不同之处在于,前者的消息处理函数如果返回TRUE,那么就阻止选择的改变,如果返回FALSE,则允许改变.
LVN_KEYDOWN

.该消息表明了一个键盘事件.消息会附带一个指向LV_KEYDOWN结构的指针,通过该结构程序可以获得按键的信息.
LVN_BEGINLABELEDIT

和LVN_ENDLABELEDIT.分别在用户开始编辑和结束编辑标题时发送.消息会附带一个指向LV_DISPINFO结构的指针.在前者的消息处理函数中,可以调用GetEditControl成员函数返回一个指向用于编辑标题的编辑框的指针,如果处理函数返回FALSE,则允许编辑,如果返回TRUE,则禁止编辑.在后者的消息处理函数中,LV_DISPINFO结构中的item.pszText指向编辑后的新标题,如果pszText为NULL,那么说明用户放弃了编辑,否则,程序应负责更新表项的标题,这可以由SetItem或SetItemText函数来完成.

 

 列表视图控件还可以支持拖放操作,这里就不详细介绍了. 改变显示风格:

 

{

long lStyle;

lStyle=GetWindowLong(m_List.GetSafeHwnd(),GWL_STYLE);

//清除所有与显示格式有关的风格标志设置新的风格刷新

lStyle&=~(LVS_ICON|LVS_SMALLICON|LVS_LIST|LVS_REPORT);

lStyle|=nStyle[m_ComboBox.GetCurSel()];

//

SetWindowLong(m_List.GetSafeHwnd(),GWL_STYLE,lStyle);

m_List.Invalidate(); //

}

结构.该结构用于存储列表视图的通知消息的有关信息,大部分列表视图的通知消息都会附带指向该结构的指针.NM_LISTVIEW的定义为
typedef struct tagNM_LISTVIEW {

NMHDR hdr; //

标准的NMHDR结构
int iItem; //

表项的索引,若为-1则无效
int iSubItem; //

子项的索引,若为0则无效
UINT uNewState; //

项的新状态
UINT uOldState; //

UINT uChanged; /*

POINT ptAction; //

取值与LV_ITEM的mask成员相同,用来表明哪些状态发生了变化项原来的状态*/事件发生时鼠标的客户区坐标
LPARAM lParam; //32

位的附加数据
} NM_LISTVIEW;

LV_DISPINFO

结构.该结构包含了与项的显示有关的信息,其定义为
typedef struct tagLV_DISPINFO {

NMHDR hdr;

LV_ITEM item;

} LV_DISPINFO;

LV_KEYDOWN

结构.该结构包含一些与键盘有关的信息,其定义为
typedef struct tagLV_KEYDOWN {

NMHDR hdr;

WORD wVKey; //

虚拟键盘码
UINT flags; //

} LV_KEYDOWN;

总为0的CListCtrl类封装了列表视图控件.该类的Create函数负责创建控件,函数的声明为
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

(List View)用来成列地显示数据.在Windows 95的资源管理器的右侧窗口中就有一个典型的列表视图,如图6.5所示.列表视图的表项通常包括图标(Icon)和标题(Label)两部分,它们分别提供了对数据的形象和抽象描述.列表视图控件是对传统的列表框的重大改进,它能够以下列四种格式显示数据.读者可以在资源管理器中的视图(View)菜单中切换列表视图的显示格式,来看看四种格式的不同之处.

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/freesky918/archive/2007/11/14/1885722.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值