列表视图
大图标格式(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