VC语言6.0程序设计从入门到精通-第33部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
LVS_SINGLESEL 指定一个单选择列表视图。默认时可以多项选择
LVS_SMALLICON 指定小图标显示格式
LVS_SORTASCENDING 按升序排列表项
LVS_SORTDESCENDING 按降序排列表项
除上表的风格外,一般还要指定 WS_CHILD 和 WS_VISIBLE 窗口风格。风格组合
WS_CHILD|WS_VISIBLE|LVS_REPORT|LVS_AUTOARRANGE|LVS_EDITLABLES 将 指 定
一个自动排列的、可编辑标题的、单选择报告式列表视图控件。要指定大图标、小图标或列
表式的列表视图控件,则应该把 LVS_REPORT 换成 LVS_ICON 、LVS_SMALLICON 或
LVS_LIST 。
对于用对话框模板创建的列表视图控件,可以在控件的属性对话框中指定上表中列出的
控件风格。例如,在属性对话框的 Styles 页的 View 栏中选择 Icon ,相当于指定了 LVS_ICON
风格。
5。8。3 ClistCtrl 类的主要成员函数
CListCtrl 类提供了大量的成员函数。在这里结合实际应用来介绍一些常用的函数。
1.InsertColumn()函数
在以报告格式显示列表视图时,一般会显示一列表项和多列子项。在初始化列表视图时,
先要调用 InsertColumn 插入各个列,该函数的声明如下:
int InsertColumn(int nCol;const LV_COLUMN* pColumn);
其中参数 nCol 是新列的索引,参数 pColumn 指向一个 LV_COLUMN 结构,函数根据该
结构来创建新的列。若插入成功,函数返回新列的索引,否则返回…1 。
2 .DeleteColumn() 函数
要删除某列,应调用 DeleteColumn() 函数,其声明如下:
BOOL DeleteColumn(int nCol);
3 .InsertItem()函数
要插入新的表项,应调用 InsertItem() 函数。如果要显示图标,则应该先创建一个
CImageList 对象并使该对象包含用作显示图标的位图序列。然后调用 SetImageList 来为列表
视图设置位图序列。函数的声明为
int InsertItem(const LV_ITEM* pItem);
·133 ·
…………………………………………………………Page 143……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
参数 pItem 指向一个 LV_ITEM 结构,该结构提供了对表项的描述。若插入成功则函数
返回新表项的索引,否则返回…1 。
4 .SetImageList()函数
该成员函数声明如下:
CImageList* SetImageList(CImageList* pImageList;int nImageList);
参数 pImageList 指向一个 CImageList 对象,参数 nImageList 用来指定图标的类型,若其
值为 LVSIL_NORMAL ,则位图序列用作显示大图标;若值为 LVSIL_SMALL ,则位图序列
用作显示小图标。可用该函数同时指定一套大图标和一套小图标。
5 .DeleteItem() 函数
要删除某表项,应调用 DeleteItem() 函数,要删除所有的项,应调用 DeleteAllItems() 函数。
一旦表项被删除,其子项也被删除。该函数的声明如下:
BOOL DeleteItem(int nItem );
BOOL DeleteAllItems();
6 .GetItemText()和 SetItemText()函数
调用 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 对象。
7 .GetItem()和 SetItem()函数
调用 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()、SetItemTex()t 和 SetItemData()函数用于设置。
8.GetNextItem()函数
要寻找与指定表项相关的表项,或寻找具有某种状态的表项,应该调用 GetNextItem()函
数。该函数的一个重要用处是搜索被选择的表项。该函数的声明如下:
int GetNextItem(int nItem; int nFlags) const;
·134 ·
…………………………………………………………Page 144……………………………………………………………
第 5 章 常用控件
参数 nItem 是指定项的索引,参数 nFlags 是如表 5…21 所示的标志,用来指定查询的关系。
函数返回搜索到的表项的索引,若未找到则返回…1 。
表 5…21 参数 nFlags 的值
标志 含义
LVNI_ABOVE 返回位于指定表项上方的表项
LVNI_ALL 默认标志,返回指定表项的下一个表项(以索引为序)
LVNI_BELOW 返回位于指定表项下方的表项
LVNI_TOLEFT 返回位于指定表项左边的表项
LVNI_TORIGHT 返回位于指定表项右边的表项
LVNI_DROPHILITED 返回拖动操作的目标表项
LVNI_FOCUSED 返回具有输入焦点的表项
LVNI_SELECTED 返回被选择的表项
要对表项进行排列、排序和搜索,可分别调用 Arrange 、SortItems 和 FindItems 函数来完
成。
有时需要在列表视图创建后动态地改变其显示格式,例如,资源管理器中的列表视图就
可以在 4 种显示格式之间切换。改变显示格式其实就是改变列表视图的风格,要改变控件的
风 格 , 应 先 调 用 ::GetWindowLong 获 取 控 件 原 来 的 风 格 , 并 对 其 进 行 修 改 , 然 后 调
用::SetWindowLong 设置新的风格。这两个函数不是成员函数,而是 Windows API 函数,用
来查询和设置窗口的风格。
列表视图控件还会发送自己特有的通知消息,常用的有下面这几个。
o LVN_ITEMCHANGING 和 LVN_ITEMCHANGED 。当列表视图的状态发生变化时,
会发送这两个通知消息 。例如,当用户选择了新的表项时,程序就会收到这两个消息。
消息会附带一个指向 NM_LISTVIEW 结构的指针,消息处理函数可从该结构中获得状
态信息。两个消息的不同之处在于,前者的消息处理函数如果返回 TRUE,那么就阻
止选择的改变,如果返回 FALSE ,则允许改变。
o LVN_KEYDOWN 。该消息表明了一个键盘事件。消息会附带一个指向 LV_KEYDOWN
结构的指针,通过该结构程序可以获得按键的信息。
o LVN_BEGINLABELEDIT 和 LVN_ENDLABELEDIT 。分别在用户开始编辑和结束编
辑标题时发送。消息会附带一个指向 LV_DISPINFO 结构的指针。在前者的消息处理
函数中,可以调用 GetEditControl 成员函数返回一个指向用于编辑标题的编辑框的指
针,如果处理函数返回 FALSE ,则允许编辑,如果返回 TRUE,则禁止编辑。在后者
的消息处理函数中,LV_DISPINFO 结构中的 item。pszText 指向编辑后的新标题,如果
pszText 为 NULL ,那么说明用户放弃了编辑,否则,程序应负责更新表项的标题,这
可以由 SetItem 或 SetItemText 函数来完成。
5。9 树型(Tree Ctrl )控件
5。9。1 树型控件的使用
树型控件是一种特殊的列表,它能以树型分层结构显示数据。在 Windows 95 的资源管
·135 ·
…………………………………………………………Page 145……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
理器的左侧窗口中就有一个用于显示目录的典型的树形视图,如图 5…8 所示。在树形视图中,
每个表项显示一个标题(Label ),有时还会显示一幅图像,图像和标题分别提供了对数据的
形象和抽象描述。通过图 5…8 可以看出,树形视图可以很清楚地显示出数据的分支和层次关
系。由此可见,树形视图非常适合显示目录、网络结构等这样的复杂数据。传统的列表框不
能分层显示数据,因此树形视图可以看作是对列表框的一种重要改进。
树形视图是一种复杂的控件,它的复杂性体现在数据项之间具有分支和层次关系。例如,
如果要向树形视图中加入新的项,则必需描述出该项与树形视图中已有项的相互关系,而不
可能像往列表框中加入新项那样,调用 AddString 即可。另外,树形视图可以在每一项标题
的左边显示一幅图像,这使控件显得更加形象生动,但同时也增加了控件的复杂程度。在介
绍如何使用树形视图控件之前,有必要先介绍一下与该控件有关的一些数据类型。
图 5…8 CTreeCtrl 控件样例
1.HTREEITEM 型句柄
在 Windows 中用 HTREEITEM 型句柄来代表树形视图的一项,通过 HTREEITEM 句柄
来区分和访问树形视图的各个项。
2 .TV_ITEM 结构
该结构用来描述一个表项,它包含了表项的各种属性,其定义如下:
typedef struct _TV_ITEM
{
UINT mask;
//包含一些屏蔽位(下面的括号中列出)的组合,用来表明结构的哪些成员是有效的
HTREEITEM hItem;
//表项的句柄(TVIF_HANDLE)
UINT state;
//表项的状态(TVIF_STATE)
UINT stateMask;
·136 ·
…………………………………………………………Page 146……………………………………………………………
第 5 章 常用控件
//状态的屏蔽组合(TVIF_STATE)
LPSTR pszText;
//表项的标题正文(TVIF_TEXT)
int cchTextMax;
//正文缓冲区的大小(TVIF_TEXT)
int iImage;
//表项的图像索引(TVIF_IMAGE)
int iSelectedImage;
//选中的项的图像索引(TVIF_SELECTEDIMAGE)
int cChildren;
//表明项是否有子项(TVIF_CHILDREN),为 1 则有,为 0 则没有
LPARAM lParam;
//一个 32 位的附加数据(TVIF_PARAM)
}TV_ITEM;FAR *LPTV_ITEM;
下面对上述参数进行解释。如果要使树形视图的表项显示图像,需要为树形视图建立一
个位图序列,这时,iImage 说明表项显示的图像在位图序列中的索引,iSelectedImage 则说明
了选中的表项应显示的图像,在绘制图标时,树形视图可以根据这两个参数提供的索引在位
图序列中找到对应的位图。lParam 可用来放置与表项相关的数据,这常常是很有用的。state
和 stateMask 的常用值在表 5…22 中列出,其中 stateMask 用来说明要获取或设置哪些状态。
表 5…22 列表视图的状态
状态 对应的状态屏蔽 含义
TVIS_SELECTED 同左 项被选中
TVIS_EXPANDED 同左