友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
VC语言6.0程序设计从入门到精通-第23部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
TVIS_SELECTED 同左 项被选中
TVIS_EXPANDED 同左 项的子项被展开
TVIS_EXPANDEDONCE 同左 项的子项曾经被展开过
TVIS_CUT 同左 项被选择用来进行剪切和粘贴操作
TVIS_FOCUSED 同左 项具有输入焦点
TVIS_DROPHILITED 同左 项成为拖动操作的目标
3 .TV_INSERTSTRUCT 结构
TV_INSERTSTRUCT 结构。在向树形视图中插入新项时要用到该结构,其定义如下:
typedef struct _TV_INSERTSTRUCT{
HTREEITEM hParent;
//父项的句柄
HTREEITEM hInsertAfter;
//说明应插入到同层中哪一项的后面
TV_ITEM item;
}TV_INSERTSTRUCT;
如果 hParent 的值为 TVI_ROOT 或 NULL ,那么新项将被插入到树形视图的最高层(根
位置)。hInsertAfter 的值可以是 TVI_FIRST、TVI_LAST 或 TVI_SORT,其含义分别是将新
项插入到同一层中的开头、最后或排序插入。
·137 ·
…………………………………………………………Page 147……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
4 .NM_TREEVIEW 结构
树形视图的大部分通知消息都会附带指向该结构的指针以提供一些必要的信息 。该结构
的定义如下:
typedef struct _NM_TREEVIEW {
NMHDR hdr;
//标准的 NMHDR 结构
UINT action;
//表明是用户的什么行为触发了该通知消息
TV_ITEM itemOld;
// 旧项的信息
TV_ITEM itemNew;
//新项的信息
POINT ptDrag;
//事件发生时鼠标的客户区坐标
}NM_TREEVIEW;
5 .TV_KEYDOWN 结构
提供与键盘事件有关的信息。该结构的定义如下:
typedef struct _TV_KEYDOWN {
NMHDR hdr;
//标准的 NMHDR 结构
WORD wVKey;
//虚拟键盘码
UINT flags;
//为 0
}TV_KEYDOWN;
6 .TV_DISPINFO 结构
提供与表项的显示有关的信息。该结构的定义如下:
typedef struct _TV_DISPINFO {
NMHDR hdr;
TV_ITEM item;
}TV_DISPINFO;
MFC 的 CTreeCtrl 类封装了树形视图。该类的 Create 成员函数负责控件的创建,该函数
的声明如下:
BOOL Create(DWORD dwStyle; const RECT& rect;CWnd* pParentWnd;UINT nID);
其中参数 dwStyle 是如表 5…23 所示的控件风格的组合。
·138 ·
…………………………………………………………Page 148……………………………………………………………
第 5 章 常用控件
表 5…23 树型控件风格
控件风格 含义
TVS_HASLINES 在父项与子项间连线以清楚地显示结构
TVS_LINESATROOT 只在根部画线
TVS_HASBUTTONS 显示带有"+ "或""的小方框来表示某项能否被展开或已展开
TVS_EDITLABELS 用户可以编辑表项的标题
TVS_SHOWSELALWAYS 即使控件失去输入焦点,仍显示出项的选择状态
TVS_DISABLEDRAGDROP 不支持拖动操作
除上表的风格外,一般还要指定 WS_CHILD 和 WS_VISIBLE 窗口风格。对于用对话框
模板创建的树形视图控件,可以在控件的属性对话框中指定上表中列出的控件风格。例如,
在属性对话框中选择 Has buttons ,相当于指定了 TVS_HASBUTTONS 风格。
5。9。2 CtreeCtrl 类的主要成员函数
CTreeCtrl 类提供了大量的成员函数。对于常用的函数,下面结合实际应用进行介绍。
1.SetImageList()函数
向树形视图中插入新的表项。首先应提供一个 TV_INSERTSTRUCT 结构并在该结构中
对插入项进行描述 。如果要在树形视图中显示图像,则应该先创建一个 CImageList 对象并使
该对象包含一个位图序列,然后调用 SetImageList 为树形视图设置位图序列。最后调用
InsertItem 函数把新项插入到树形视图中。该函数的声明如下:
CImageList* SetImageList(CImageList * pImageList;int nImageListType);
参数pImageList 指向一个CImageList 对象,参数nImageListType 一般应为TVSIL_NORMAL。
2 .InsertItem()函数
该成员函数声明如下:
HTREEITEM InsertItem( LPTV_INSERTSTRUCT lpInsertStruct );
参数 lpInsertStruct 指向一个 TV_INSERTSTRUCT 结构。函数返回新插入项的句柄。
3 .DeleteItem()和 DeleteAllItems() 函数
用 DeleteItem() 函数来删除指定项,用 DeleteAllItems() 函数删除所有项。函数的声明如下:
BOOL DeleteItem(HTREEITEM hItem);
BOOL DeleteAllItems();
操作成功则函数返回 TRUE,否则返回 FALSE 。
4 .Expand() 函数
树形视图控件会根据用户的输入自动展开或折叠子项 。但有时需要在程序中展开或折叠
指定项,则应该调用 Expand ,该函数的声明为
BOOL Expand(HTREEITEM hItem;UINT nCode);
参数 hItem 指定了要展开或折叠的项。参数 nCode 是一个标志,指定了函数应执行的操
作,它可以是 TVE_COLLAPSE (折叠)、TVE_COLLAPSERESET(折叠并移走所有的子项 )、
·139 ·
…………………………………………………………Page 149……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
TVE_EXPAND (展开)或TVE_TOGGLE (在展开和折叠状态之间翻转)。
5 .GetSelectedItem()和 SelectItem()函数
要查询或设置选择项,应调用 GetSelectedItem 或 SelectItem。函数的声明如下:
HTREEITEM GetSelectedItem();
BOOL SelectItem(HTREEITEM hItem);
6 .GetItem()和 SetItem()函数
要查询或设置指定的项,可调用 GetItem()和 SetItem()函数。用这两个函数,几乎可以查
询和设置项的所有属性,包括表项的正文、图像及选择状态。函数的声明如下:
BOOL GetItem(TV_ITEM* pItem);
BOOL SetItem(TV_ITEM* pItem);
参数 pItem 是指向 TV_ITEM 结构的指针,函数通过该结构来查询或设置指定的项,在
调用函数前应该使该结构的 hItem 成员有效以指定表项。CtreeCtrl 类还提供了一系列函数可
完成 GetItem 和 SetItem 的部分功能,其中 GetItemState 、GetItemText 、GetItemData 、
GetItemImage 和 ItemHasChildren 函数用于查询,SetItemState、SetItemText、SetItemData 和
SetItemImage 函数用于设置。
7 .GetNextItem()函数
在使用树形视图控件时,一个经常遇到的问题是对于一个已知表项,如何找到与该项有
某种关系的项,例如,父项、子项、兄弟项、下一个或前一个可见的项。利用 GetNextItem()
函数可以解决这个问题,该函数也可以用来搜索具有某种状态的表项。GetNextItem()函数在
遍历树形视图时是很有用的,它的声明如下:
HTREEITEM GetNextItem(HTREEITEM hItem;UINT nCode);
参数 hItem 指定了一个项。参数 nCode 是一个标志,标明了与指定项的关系,nCode 可
以是如表 5…24 所示的各种标志。如果找到相关的项,函数返回该项的句柄,否则函数返回
NULL 。
表 5…24 树型控件中 nCode 的取值
风格 含义
TVGN_CARET 返回当前的选择项
TVGN_CHILD 返回指定表项的子项
TVGN_DROPHILITE 返回拖动操作的目标项
TVGN_FIRSTVISIBLE 返回第一个可见项
TVGN_NEXT 返回指定项的下一个兄弟项(Sibling Item)
TVGN_NEXTVISIBLE 返回指定项的后一个可见项
TVGN_PARENT 返回指定项的父项
TVGN_PREVIOUS 返回指定项的前一个兄弟项
TVGN_PREVIOUSVISIBLE 返回指定项的前一个可见项
TVGN_ROOT 返回位于最高层(根位置)的第一个表项
CTreeCtrl 类 提 供 了 一 系 列 的 成 员 函 数 来 完 成 GetNextItem 的 某 一 项 功 能 , 包 括
GetRootItem()、GetFirstVisibleItem()、GetNextVisibleItem()、GetPrevVisibleItem()、GetChildItem()、
·140 ·
…………………………………………………………Page 150……………………………………………………………
第 5 章 常用控件
GetNextSiblingItem() 、 GetPrevSiblingItem() 、 GetParentItem() 、 GetSelectedItem() 和
GetDropHilightItem() 。
5。9。3 树型控件的通知消息
树形视图控件还可发送自己特有的通知消息,其中常用的有下面这几个。
o TVN_SELCHANGING 和 TVN_SELCHANGED 。在用户改变了对表项的选择时,控件
会发送这两个消息。消息会附带一个指向 NM_TREEVIEW 结构的指针,程序可从该
结构中获得必要的信息。两个消息都会在该结构的 itemOld 成员中包含原来的选择项
信息,在 itemNew 成员中包含新选择项的信息,在 action 成员中表明是用户的什么行
为 触 发 了 该 通 知 消 息 ( 若 是 TVC_BYKEYBOARD 则 表 明 是 键 盘 , 若 是
TVC_BYMOUSE 则表明是鼠标,若是 TVC_UNKNOWN 则表示未知)。两个消息的不
同之处在于,如果 TVN_SELCHANGING 的消息处理函数返回 TRUE,那么就阻止选
择的改变,如果返回 FALSE ,则允许改变。
o TVN_KEYDOWN 。该消息表明了一个键盘事件。消息会附带一个指向 TV_KEYDOWN
结构的指针,通过该结构程序可以获得按键的信息。
o TVN_BEGINLABELEDIT 和 TVN_ENDLABELEDIT 。分别在用户开始编辑和结束编
辑项的标题时发送。消息会附带一个指向 TV_DISPINFO 结构的指针,程序可从该结
构中获得必要的信息 。在前者的消息处理函数中,可以调用 GetEditControl()成员函数
返回一个指向用于编辑标题的编辑框的指针 。如果处理函数返回 FALSE ,则允许编辑,
如果返回 TRUE,则禁止编辑。在后者的消息处理函数中,TV_DISPINFO 结构中的
item。pszText 指向编辑后的新标题,如果 pszText 为 NULL ,那么说明用户放弃了编辑,
否则,程序应负责更新项的标题,这可以由 SetItem()或 SetItemText()函数来完成。
5。10 选项卡(Tab Ctrl )控件
5。10。1 选项卡控件的使用
Tab 属性页控件可以在一个窗口中添加不同的页面,然后在页选择发生改变时得到通知。
典型的选项卡控件,如图 5…9 所示。
图 5…9 CTabCtrl 控件样例
·141 ·
…………………………………………………………Page 151……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
MFC 中使用 CTabCtrl 类来封装属性页控件的各种操作。通过调用 Create 函数创建一个
窗口,Create 函数声明如下:
BOOL Create(DWORD dwStyle;const RECT& rect;CWnd* pParentWnd;UINT nID)
其中 dwStyle 中可以使用以下一些属性页控件的专用风格。
o TCS_BUTTONS :使用按钮来表示页选择位置。
o TCS_MULTILINE :分行显示页选择位置。
o TCS_SINGLELINE :只使用一行显示页选择位置。
在控件创建后必需向其中添加页面才可以使用,添加页面的函数为:
BOOL InsertItem(int nItem;LPCTSTR lpszItem);
其中 nItem 为位置,从 0 开始,lpszItem 为页选择位置上显示的文字。如果希望在页选
择位置处显示一个图标,可以调用 InsertItem (在此之前必须调用SetImageList 设置正确的
ImageList )。
对组成选项卡(TabControl )控件(CTabCtrl )选项卡的外观和行为可以有相当多的设置
方法。每个选项卡可以有与之关联的标签、图标、项状态和应用程序定义的 32 位数值。对每
个选项卡,可以显示图标、标签或两者都显示。
另外,每个选项卡项可以有 3 种可能的状态:已按下、非按下或突出显示 。该状态仅能
通过修改现有选项卡项来设置 。若要修改现有选项卡项,应调用 GetItem()函数检索它,修改
TCITEM 结构(特别是 dwState 和 dwStateMask 数据成员),然后通过调用 SetItem 返回修改
过的 TCITEM 结构。若要清除 CTabCtrl 对象中所有选项卡项的项状态,应调用 DeselectAll()
函数。该函数重新设置所有选项卡项或所有项的状态(当前选定的项除外)。
下列代码清除所有选项卡项的状态,然后修改第三项的状态:
//modify the third item to be highlighted
TCITEM curItem;
m_tabCtrl。DeselectAll(FALSE); //reset all tab items
curItem。mask= TCIF_STATE;
m_tabCtrl。GetItem(2; &curItem);
curItem。mask= TCIF_STATE;
curItem。dwState= TCIS_HIGHLIGHTED;
curItem。dwStateMask= TCIS_HIGHLIGHTED;
m_tabCtrl。SetItem(2; &curItem);
5。10。2 选项卡控件通知消息
当单击选项卡或按钮时,选项卡(TabControl )控件(CTabCtrl )向其父窗口发送通知消
息。如果要进行某种响应,应对这些消息进行处理。例如,当单击选项卡时,也许想在显示
选项卡之前在页面上预设控件数据,即响应单击选项卡消息时作出预设数据的响应。
处理来自视图或对话框类中的选项卡(TabControl )控件的 WM_NOTIFY 消息,用“属
性”窗口创建带 switch 语句的 OnChildNotify()处理函数。选项卡控件向父窗口发送的主要通
知消息如表 5…25 所示。
·142 ·
…………………………………………………………Page 152……………………………………………………………
第 5 章 常用控件
表 5…25 选项卡控件的通知消息
通知消息 含义
NM_CLICK 通知父窗口用户在控件区域范围内点击了鼠标左键
NM_RCLICK 通知父窗口用户在控件区域范围内点击了鼠标右键
NM_RELEASEDCAPTURE 通知父窗口在控件区域范围内释放鼠标捕获消息
TCN_FOCUSCHANGE 通知父窗口控件的按钮聚焦已经改变
TCN_GETOBJECT 当具有 TCS_EX_REGISTERDROP 扩展特性时并且对象被拖动的通知消息
TCN_KEYDOWN 通知父窗口在控件范围内键盘被按下
TCN_SELCHANGE 通知父窗口控件的选项卡选择项已经改变
TCN_SELCHANGING 通知父窗口控件的选项卡选择项正在改变
选项卡控件还涉及到一些重要的数据结构,这些预定义的数据结构在该控件应用中起着
重要作用。主要涉及到的的结构如下。
1.NMTCKEYDOWN 结构
该结构包含键盘按下时的相关信息,主要用于处理 TCN_KEYDOWN 通知消息,该结构
定义如下:
typedef struct tagNMTCKEYDOWN {
NMHDR hdr;
WORD wVKey;
UINT flags;
} NMTCKEYDOWN
2 .TCHITTESTINFO 结构
该结构主要用于鼠标单击测试的通知消息,定义如下:
typedef struct tagTCHITTESTINFO {
POINT pt;
UINT flags;
} TCHITTESTINFO; *LPTCHITTESTINFO;
3 .TCITEM 结构
该结构指定选项卡控件选项的具体属性,定义如下:
typedef struct tagTCITEM {
UINT mask;
#if (_WIN32_IE 》= 0x0300)
DWORD dwState;
DWORD dwStateMask;
#else
UINT lpReserved1;
UINT lpReserved2;
#endif
LPTSTR pszText;
·143 ·
…………………………………………………………Page 153……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
int cchTextMax;
int iImage;
LPARAM lParam;
} TCITEM; *LPTCITEM;
4 .TCITEMHEADER 结构
该结构用于指定或接收选项卡控件本身的属性,定义如下:
typedef struct tagTCITEMHEADER {
UINT mask;
UINT lpReserved1;
UINT lpReserved2;
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!