第 33 章
询或设置选择项,应调用GetSelectedItem 或SelectItem。函数的声明如下:
HTREEITEM GetSelectedItem();
BOOL SelectItem(HTREEITEM hItem);
6.GetItem()和SetItem()函数
要查询或设置指定的项,可调用GetItem()和SetItem()函数。用这两个函数,几乎可以查
询和设置项的所有属xìng,包括表项的正文、图像及选择状态。函数的声明如下:
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 返回拖动cāo作的目标项
TVGN_FIRSTVISIBLE 返回第一个可见项
TVGN_NEXT 返回指定项的下一个兄弟项(Sibling Item)
TVGN_NEXTVISIBLE 返回指定项的后一个可见项
TVGN_PARENT 返回指定项的父项
TVGN_PREVIOUS 返回指定项的前一个兄弟项
TVGN_PREVIOUSVISIBLE 返回指定项的前一个可见项
TVGN_ROOT 返回位于最高层(根位置)的第一个表项
CTreeCtrl 类提供了一系列的成员函数来完成GetNextItem 的某一项功能, 包括
GetRootItem()、GetFirstVisibleItem()、GetNextVisibleItem()、GetPrevVisibleItem()、GetChildItem()、
枫叶文学网www.fywxw.com
第5 章 常用控件
·141·
GetNextSiblingItem() 、GetPrevSiblingItem() 、GetParentItem() 、GetSelectedItem() 和
GetDropHilightItem()。
5.9.3 树型控件的通知消息
树形视图控件还可发送自己特有的通知消息,其中常用的有下面这几个。
? TVN_SELCHANGING 和TVN_SELCHANGED。在用户改变了对表项的选择时,控件
会发送这两个消息。消息会附带一个指向NM_TREEVIEW 结构的指针,程序可从该
结构中获得必要的信息。两个消息都会在该结构的itemOld 成员中包含原来的选择项
信息,在itemNew 成员中包含新选择项的信息,在action 成员中表明是用户的什么行
为触发了该通知消息( 若是TVC_BYKEYBOARD 则表明是键盘, 若是
TVC_BYMOUSE 则表明是鼠标,若是TVC_UNKNOWN 则表示未知)。两个消息的不
同之处在于,如果TVN_SELCHANGING 的消息处理函数返回TRUE,那么就阻止选
择的改变,如果返回FALSE,则允许改变。
? TVN_KEYDOWN。该消息表明了一个键盘事件。消息会附带一个指向TV_KEYDOWN
结构的指针,通过该结构程序可以获得按键的信息。
? 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 属xìng页控件可以在一个窗口中添加不同的页面,然后在页选择发生改变时得到通知。
典型的选项卡控件,如图5-9 所示。
图5-9 CTabCtrl 控件样例
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·142·
MFC 中使用CTabCtrl 类来封装属xìng页控件的各种cāo作。通过调用Create 函数创建一个
窗口,Create 函数声明如下:
BOOL Create(DWORD dwStyle,const RECT& rect,CWnd* pParentWnd,UINT nID)
其中dwStyle 中可以使用以下一些属xìng页控件的专用风格。
? TCS_BUTTONS:使用按钮来表示页选择位置。
? TCS_MULTILINE:分行显示页选择位置。
? 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 消息,用“属
xìng”窗口创建带switch 语句的OnChildNotify()处理函数。选项卡控件向父窗口发送的主要通
知消息如表5-25 所示。
枫叶文学网www.fywxw.com
第5 章 常用控件
·143·
表5-25 选项卡控件的通知消息
通知消息 含义
NM_CLICK 通知父窗口用户在控件区域范围内点击了鼠标左键
NM_RCLICK 通知父窗口用户在控件区域范围内点击了鼠标右键
NM_RELEASEDCAPTURE 通知父窗口在控件区域范围内释放鼠标捕获消息
TCN_FOCUSCHANGE 通知父窗口控件的按钮聚焦已经改变
TCN_GETOBJECT 当具有TCS_EX_REGISTERDROP 扩展特xìng时并且对象被拖动的通知消息
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 结构
该结构指定选项卡控件选项的具体属xìng,定义如下:
typedef struct tagTCITEM {
UINT mask;
#if (_WIN32_IE >= 0x0300)
DWORD dwState;
DWORD dwStateMask;
#else
UINT lpReserved1;
UINT lpReserved2;
#endif
LPTSTR pszText;
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·144·
int cchTextMax;
int iImage;
LPARAM lParam;
} TCITEM, *LPTCITEM;
4.TCITEMHEADER 结构
该结构用于指定或接收选项卡控件本身的属xìng,定义如下:
typedef struct tagTCITEMHEADER {
UINT mask;
UINT lpReserved1;
UINT lpReserved2;
LPTSTR pszText;
int cchTextMax;
int iImage;
} TCITEMHEADER, *LPTCITEMHEADER;
此外CTabCtrl 还提供了一些函数用于得到和修改控件的状态:
int GetCurSel()/int SetCurSel(int nItem);//用于得到/设置当前被选中的页位置
BOOL DeleteItem(int nItem)/BOOL DeleteAllItems();//用于删除指定/所有页面
void RemoveImage(int nImage);//用于删除某页选择位置上的图标
在当前页发生改变时需要隐藏当前的一些子窗口,并显示其他的子窗口。下面的代码演
示了如何实现上述功能,主要的代码如下:
CParentWnd::OnCreate(...)
{
m_tab.Create(...);
m_tab.InsertItem(0,"Option 1");
m_tab.InsertIt
松语文学免费小说阅读_www.16sy.com
HTREEITEM GetSelectedItem();
BOOL SelectItem(HTREEITEM hItem);
6.GetItem()和SetItem()函数
要查询或设置指定的项,可调用GetItem()和SetItem()函数。用这两个函数,几乎可以查
询和设置项的所有属xìng,包括表项的正文、图像及选择状态。函数的声明如下:
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 返回拖动cāo作的目标项
TVGN_FIRSTVISIBLE 返回第一个可见项
TVGN_NEXT 返回指定项的下一个兄弟项(Sibling Item)
TVGN_NEXTVISIBLE 返回指定项的后一个可见项
TVGN_PARENT 返回指定项的父项
TVGN_PREVIOUS 返回指定项的前一个兄弟项
TVGN_PREVIOUSVISIBLE 返回指定项的前一个可见项
TVGN_ROOT 返回位于最高层(根位置)的第一个表项
CTreeCtrl 类提供了一系列的成员函数来完成GetNextItem 的某一项功能, 包括
GetRootItem()、GetFirstVisibleItem()、GetNextVisibleItem()、GetPrevVisibleItem()、GetChildItem()、
枫叶文学网www.fywxw.com
第5 章 常用控件
·141·
GetNextSiblingItem() 、GetPrevSiblingItem() 、GetParentItem() 、GetSelectedItem() 和
GetDropHilightItem()。
5.9.3 树型控件的通知消息
树形视图控件还可发送自己特有的通知消息,其中常用的有下面这几个。
? TVN_SELCHANGING 和TVN_SELCHANGED。在用户改变了对表项的选择时,控件
会发送这两个消息。消息会附带一个指向NM_TREEVIEW 结构的指针,程序可从该
结构中获得必要的信息。两个消息都会在该结构的itemOld 成员中包含原来的选择项
信息,在itemNew 成员中包含新选择项的信息,在action 成员中表明是用户的什么行
为触发了该通知消息( 若是TVC_BYKEYBOARD 则表明是键盘, 若是
TVC_BYMOUSE 则表明是鼠标,若是TVC_UNKNOWN 则表示未知)。两个消息的不
同之处在于,如果TVN_SELCHANGING 的消息处理函数返回TRUE,那么就阻止选
择的改变,如果返回FALSE,则允许改变。
? TVN_KEYDOWN。该消息表明了一个键盘事件。消息会附带一个指向TV_KEYDOWN
结构的指针,通过该结构程序可以获得按键的信息。
? 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 属xìng页控件可以在一个窗口中添加不同的页面,然后在页选择发生改变时得到通知。
典型的选项卡控件,如图5-9 所示。
图5-9 CTabCtrl 控件样例
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·142·
MFC 中使用CTabCtrl 类来封装属xìng页控件的各种cāo作。通过调用Create 函数创建一个
窗口,Create 函数声明如下:
BOOL Create(DWORD dwStyle,const RECT& rect,CWnd* pParentWnd,UINT nID)
其中dwStyle 中可以使用以下一些属xìng页控件的专用风格。
? TCS_BUTTONS:使用按钮来表示页选择位置。
? TCS_MULTILINE:分行显示页选择位置。
? 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 消息,用“属
xìng”窗口创建带switch 语句的OnChildNotify()处理函数。选项卡控件向父窗口发送的主要通
知消息如表5-25 所示。
枫叶文学网www.fywxw.com
第5 章 常用控件
·143·
表5-25 选项卡控件的通知消息
通知消息 含义
NM_CLICK 通知父窗口用户在控件区域范围内点击了鼠标左键
NM_RCLICK 通知父窗口用户在控件区域范围内点击了鼠标右键
NM_RELEASEDCAPTURE 通知父窗口在控件区域范围内释放鼠标捕获消息
TCN_FOCUSCHANGE 通知父窗口控件的按钮聚焦已经改变
TCN_GETOBJECT 当具有TCS_EX_REGISTERDROP 扩展特xìng时并且对象被拖动的通知消息
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 结构
该结构指定选项卡控件选项的具体属xìng,定义如下:
typedef struct tagTCITEM {
UINT mask;
#if (_WIN32_IE >= 0x0300)
DWORD dwState;
DWORD dwStateMask;
#else
UINT lpReserved1;
UINT lpReserved2;
#endif
LPTSTR pszText;
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·144·
int cchTextMax;
int iImage;
LPARAM lParam;
} TCITEM, *LPTCITEM;
4.TCITEMHEADER 结构
该结构用于指定或接收选项卡控件本身的属xìng,定义如下:
typedef struct tagTCITEMHEADER {
UINT mask;
UINT lpReserved1;
UINT lpReserved2;
LPTSTR pszText;
int cchTextMax;
int iImage;
} TCITEMHEADER, *LPTCITEMHEADER;
此外CTabCtrl 还提供了一些函数用于得到和修改控件的状态:
int GetCurSel()/int SetCurSel(int nItem);//用于得到/设置当前被选中的页位置
BOOL DeleteItem(int nItem)/BOOL DeleteAllItems();//用于删除指定/所有页面
void RemoveImage(int nImage);//用于删除某页选择位置上的图标
在当前页发生改变时需要隐藏当前的一些子窗口,并显示其他的子窗口。下面的代码演
示了如何实现上述功能,主要的代码如下:
CParentWnd::OnCreate(...)
{
m_tab.Create(...);
m_tab.InsertItem(0,"Option 1");
m_tab.InsertIt
松语文学免费小说阅读_www.16sy.com