友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
富士康小说网 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

VC语言6.0程序设计从入门到精通-第22部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!





     2 .LV_ITEM 结构  



     该结构用来描述一个表项或子项,它包含了项的各种属性,其定义为如下:  



     typedef struct _LV_ITEM {    



          UINT mask;    



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



          int iItem;    



          //从 0 开始编号的表项索引(行索引)  



          int iSubItem;    



          //从 1 开始编号的子项索引(列索引),若值为 0 则说明该成员无效,结构描述的是一个表项而不 



是子项  



          UINT state;    



          //项的状态(LVIF_STATE)  



          UINT stateMask;    



          //项的状态屏蔽  



          LPTSTR pszText;    



          //指向存放项的正文的缓冲区(LVIF_TEXT)  



      



          int cchTextMax;    



          //正文缓冲区的长度(LVIF_TEXT)  



          int iImage;    



          // 图标的索引(LVIF_IMAGE)  



          LPARAM lParam;    



          //32 位的附加数据(LVIF_PARAM)  



     }LV_ITEM;  



     其中    lParam   成员可用来存储与项相关的数据,这在有些情况下是很有用的。state                                            和 

stateMask 的值如表 5…19 所示,stateMask 用来说明要获取或设置哪些状态。  



     表 5…19                               列表视图的状态  



              状态                        对应的状态屏蔽                               含义  

 LVIS_CUT                          同左                         项被选择用来进行剪切和粘贴操作  

 LVIS_DROPHILITED                  同左                         项成为拖动操作的目标  

 LVIS_FOCUSED                      同左                         项具有输入焦点  

 LVIS_SELECTED                     同左                         项被选中  



     3 .NM_LISTVIEW 结构  



     该结构用于存储列表视图通知消息的有关信息,大部分列表视图的通知消息都会附带指 

向该结构的指针。 

                    NM_LISTVIEW  的定义如下:  



     typedef struct tagNM_LISTVIEW {  



          NMHDR hdr;    



          //标准的 NMHDR 结构  



          int iItem;    



                                                                                             ·131 ·  


…………………………………………………………Page 141……………………………………………………………

Visual C++ 6。0 程序设计从入门到精通  



         //表项的索引,若为…1 则无效  



         int iSubItem;    



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



         UINT uNewState;    



         //项的新状态  



         UINT uOldState;    



         //项原来的状态  



         UINT uChanged;    



         //取值与 LV_ITEM 的 mask 成员相同,用来表明哪些状态发生了变化  



         POINT ptAction;    



         //事件发生时鼠标的客户区坐标  



         LPARAM lParam;    



         //32 位的附加数据  



     }NM_LISTVIEW;  



     4 .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; //总为 0  



     } LV_KEYDOWN;  



     MFC  的 CListCtrl 类封装了列表视图控件。该类的 Create 函数负责创建控件,函数的声 

明为:  



     BOOL Create(DWORD dwStyle;const RECT& rect; CWnd* pParentWnd;UINT nID );  



     其中参数 dwStyle 是如表 5…20 所示的控件风格的组合。  



     表 5…20                            列表视图的风格  



            风格                                            含义  

                              显示格式是大图标或小图标时,标题放在图标的左边。默认情况下标题 

 LVS_ALIGNLEFT  

                              放在图标的下面  

 LVS_ALIGNTOP                 当显示格式是大图标或小图标时,标题放在图标的上边  

 LVS_AUTOARRANGE              当显示格式是大图标或小图标时,自动排列控件中的表项  

 LVS_EDITLABELS               用户可以修改标题  

 LVS_ICON                     指定大图标显示格式  

 LVS_LIST                     指定列表显示格式  

 LVS_NOCOLUMNHEADER           在报告格式中不显示列的表头  



 ·132 ·  


…………………………………………………………Page 142……………………………………………………………

                                                              第 5 章    常用控件  



                                                                    续表  



          风格                                   含义  

 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_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                 同左                       项的子项被展开  

 TVIS_EXPANDEDONCE           
返回目录 上一页 下一页 回到顶部 0 0
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!