第七课——常用控件

时间:2022-09-28 20:04:03

一、静态控件

1. 概述

特性:一般不接收用户输入,也不产生通知消息

包括:静态文本、组框、静态图片

注:每个静态控件的ID都是IDC_STATIC

 

二、按钮

  • 分类:按键按钮、单选按钮、复选框按钮

1. 按键按钮

  • 也称为命令按钮,可立即产生某个动作,执行某个命令
  • 两种风格:标准按键按钮、默认按键按钮(表示该按钮已接收到键盘的输入焦点)

2. 单选按钮

  • 外形是在文本前有一个圆圈,当它被选中时,单选按钮中就标上一个黑点
  • 分类:一般类型、自动类型(选中同组中某个按钮,其余的选中状态会清除)

3. 复选框

  • 外形是在文本前有一个空心方框

4. 按钮的消息

  • 常见的只有两个:BN_CLICKED、BN_DOUBLE_CLICKED

5. 按钮操作

①设置或获取一个按钮或多个按钮的选中状态

//CButton类的成员函数

void SetCheck(int nCheck);  //设置指定按钮的选中状态

int GetCheck() const;           //获取指定按钮的选中状态

  • 注:nCheck和GetCheck函数返回的值可以是0(不选中)、1(选中)和2(不确定)

②设置或获取同组多个单选按钮的选中状态

void CheckRadioButton(int nIDFirstButton, int nIDLastButton, int nIDCheckButton);

int GetCheckedRadioButton(int nIDFirstButton, int nIDLastButton);

  • 注:前两个参数分别指定同组单选按钮的第一个和最后一个按钮ID值,nIDCheckButton用来指定要设置选中状态的按钮ID值,函数GetCheckedRadioButton返回被选中的按钮ID值。

6. 制作问卷调查

  • 使用到的控件:组框、静态文本、单选按钮、复选框

【要点】

①通过CheckRadioButton函数来设置同组单选按钮的最初选中状态

②通过SetCheck函数来设置指定复选框的选中状态

③通过GetDlgItemText或GetWindowText获取选中控件的窗口文本

【过程】

  1. 基于对话框的应用程序Ex_Research
  2. 添加控件并设置其属性
  3. 初始化代码:在OnInitDialog函数中添加初始化代码
  4. IDOK按钮的BN_CLICKED消息映射:在消息函数OnOK中添加代码

【说明】

  • 单选按钮的分组:将每一组的第一个单选按钮的“组”属性选中
  • 初始化代码相当于默认实参
  • 消息映射部分的目的是设置在你单击确定按钮后弹出的对话框的内容

 

三、编辑框

1. 通知消息

当编辑框的文本修改或者被滚动时,会向其父窗口发送一些消息(正如前面所述,该消息也被称为通知消息)

编辑框的通知消息包含EN_CHANGE、EN_HSCROLL、ENKILLFOCUS等等。(列出来的意思是通知消息很多,对应于按钮的BN_CLICKED消息,当然还有WM_COMMAND消息)

2. 基本操作

①口令设置

  • 用户输入的每个字符都被口令字符代替显示
  • 默认的口令字符是“*”
  • 设置口令字符:void SetPasswordChar(TCHAR ch);

②选择文本

CEdit::SetSel                //确定编辑框内文本的选择范围
CEdit::GetSel //获取编辑框选择的开始和结束位置
CEdit::ReplaceSel //替换被选择的文本

③获取多行编辑框的文本

  • 情形一:使用DDX/DDV,将编辑框控件与类型为CString的变量关联
  • 情形二:使用编辑框CEdit类的成员函数(可获得某特定行文本)

 

四、旋转按钮控件

1. 概述

  • 一个旋转按钮控件通常是与其“伙伴窗口”一起使用的,该伙伴窗口常常是一个编辑框。

  使得其能够改变伙伴窗口的值的条件:

  ①伙伴窗口的Tab键次序刚好在其前面

  ②其属性要选中“自动结伴”和“设置结伴整数”

2. 基本操作

  • CSpinButtonCtrl类提供了旋转按钮控件的各种操作函数
int SetBase(int nBase);         //设置基数,决定其伙伴窗口显示的数字的进制
int SetPos(int nPos); //设置旋转按钮控件的当前位置
void SetRange(int nLower, int nUpper); //设置旋转按钮控件的范围

3. 通知消息

  • 只有一个:UDN_DELTAPOS
  • 何时发送:在控件的当前数值将要改变时向其父窗口发送

4. 用对话框输入学生成绩示例

  • 使用到的控件:编辑框、旋转控制按钮

【要点】

  • 将编辑框设置成旋转按钮控件的伙伴窗口

【过程】

  1. 单文档应用程序Ex_Ctrl1SDI
  2. 添加一个ID为IDD_INPUT的对话框资源,创建对话框类CInputDlg
  3. 添加控件并设置其属性
  4. 设置好控件的Tab键次序
  5. 添加控件变量(5个编辑框及3个旋转按钮控件)
  6. 初始化代码:为CInputDlg添加WM_INITDIALOG消息映射,并添加相应的代码  //即在OnInitDialog成员函数内设置旋转按钮控件范围
  7. 为CInputDlg添加旋转按钮控件1的UDN_DELTAPOS消息映射,并添加代码
  8. 添加菜单项并添加其的COMMAND消息映射,并添加代码
  9. 在应用程序中添加对话框类CInputDlg的头文件包含

【说明】

  • 三个消息映射:初始化消息、控件的消息、COMMAND消息
  • 各处添加的代码值得研读

 

五、列表框

1. 概述

  • 特性:列表框中项的数目是可灵活变化的,程序运行时可往其中添加或删除某些项。
  • 注:列表框的项除了用字符串来标识外,还常常通过索引来确定。

2. 通知消息

  • 常用的通知消息包含LBN_DBLCLK、LBN_KILLFOCUS、LBN_SELCANCEL等等。

3. 基本操作

  • CListBox类提供了列表框的各种操作函数。

①添加列表项

int AddString(LPCTSTR lpszItem);             //自动排序
int InsertString(int nIndex, LPCTSTR lpszItem);

根据列表项使用其他数据时,调用以下函数会使用户数据和某个列表项关联起来:

int SetItemData(int nIndex, DWORD dwItemData);
int SetItemDataPtr(int nIndex, void *pData);

②删除列表项

int DeleteString(UINT nIndex);
void ResetContent();
  • 注:若在添加列表项时使用了SetItemDataPtr函数,在进行删除操作时应及时将关联数据所占的内存空间释放出来。

③查找列表项

int FindString(int nStartAfter, LPCTSTR lpszItem) const;
int FindStringExact(int nIndexStart, LPCTSTR lpszFind) const;
  • 注:lpszItem和lpszFind指定要查找的列表项文本,其余两个参数指定查找的开始位置。
  • 注:查到后,它们都返回所匹配列表项的索引,否则返回LB_ERR

④列表框的单项选择

int GetCurSel() const;          //返回当前选择项的索引
int SetCurSel(int nSelect);
  • 注:错误时这两个函数都返回LB_ERR。
int GetText(int nIndex, LPTSTR lpszBuffer) const;
void GetText(int nIndex, CString &rString) const;
  • 注:lpszBuffer和rString用来存放列表项文本

⑤列表框的多项选择

  较为复杂,暂略。

4. 创建并使用城市邮编对话框示例

【要点】

  • 添加时需要通过FindStringExact来判断添加的列表项是否重复
  • 通过EnbaleWindow(FALSE)使“删除”按钮灰显(即不能单击它)

【过程】

  1. 单文档应用程序Ex_Ctrl2SDI
  2. 添加一个ID为IDD_CITYZIP的对话框资源,创建对话框类CCityDlg
  3. 添加控件并设置其属性
  4. 添加控件变量(1个列表框及2个编辑框)
  5. 向CCityDlg类添加成员函数IsValidate,并添加相应的代码    //上述函数的功能:判断城市名编辑框中的内容是否是有效的字符串
  6. 为对话框添加WM_INITDIALOG消息映射,并添加代码
  7. 为添加按钮和删除按钮添加BN_CLICKED的消息映射,并添加代码
  8. 为列表框添加LBN_SELCHANGE的消息映射,并添加代码    //效果:单击列表框的城市名时,在编辑框显示出城市名和邮编代码
  9. 添加菜单项并添加其的COMMAND消息映射,并添加代码
  10. 在应用程序中添加对话框类CCityDlg的头文件包含

【说明】

  • IsValidate函数不是映射函数
  • 了解各处的代码的作用,梳理整个过程

 

六、组合框

1. 概述

  • 特点:结合列表框和编辑框的特点,取二者之长。
  • 分类:简单组合框、下拉式组合框、下拉式列表框(没有文字编辑功能)

2. 通知消息

  • 组合框的通知消息中,有的是列表框发出的,有的是编辑框发出的。
  • 常用的通知消息包含CBN_CLOSEUP、CBN_DBLCLK、CBN_DROPDOWN等。

3. 常见操作

  • 组合框的操作分为两类:其一是对列表框进行操作,其二是对编辑框进行操作。
  • 上面的操作可以通过调用CComboBox类成员函数来实现,具体如表3.13所示。
  • 注:由于组合框的一些编辑操作与编辑框CEdit的成员函数类似,如GetEditSet、SetEditSel等,故上表没有这些成员函数。

4. 创建并使用城市邮政编码和区号对话框示例

【要点】

  • 使组合框中的项关联邮政编码和区号内容。
  • 对话框即将关闭时用delete运算符来释放组合框中的项所关联的数据的内存空间

【过程】

  1. 单文档应用程序Ex_Ctrl3SDI
  2. 添加一个ID为IDD_CITYZONE的对话框资源,创建对话框类CCityZoneDlg
  3. 添加控件并设置其属性
  4. 添加控件变量(1个组合框及2个编辑框)
  5. 向CCityZoneDlg类添加成员函数IsValidate,并添加相应的代码
  6. 为添加按钮和修改按钮添加BN_CLICKED的消息映射,并添加代码
  7. 为组合框添加CBN_SELCHANGE的消息映射,并添加代码
  8. 为对话框添加WM_DESTROY消息映射,并添加代码  //此消息与WM_INITDIALOG相对应,是对话框关闭时发送的消息
  9. 添加菜单项并添加其的COMMAND消息映射,并添加代码
  10. 在应用程序中添加对话框类CCityZoneDlg的头文件包含

【说明】

  • 组合框有两个控件变量
  • 合并字符串和分解字符串的妙用(CString类的4个成员函数)
  • 设置和获取列表项的关联数据(列表框中的函数)及关闭对话框时应释放内存

 

七、进展条

1. 基本操作

  • CProgressCtrl类提供了进展条的各种操作函数。

①位置相关

int SetPos(int nPos);            //设置进展条的当前位置
int GetPos(); //获取进展条的当前位置

②范围相关

void SetRange(short nLower, short nUpper);
void SetRange32(int nLower, int nUpper);
void GetRange(int &nLower, int &nUpper);

③设置增量

int SetStep(int nStep);         //设置进展条的步长并返回原来的步长
int StepIt(); //将当前位置向前移动一个步长

2. 使用进展条示例

【要点】

  • 进展条的百分比显示

【过程】

  1. 程序+对话框+控件变量
  2. 为对话框类添加成员函数UpdatePercentText    //更新静态文本控件内容(百分比)
  3. 为对话框类添加WM_INITDIALOG消息映射            //设置进展条初始化状态
  4. 为按钮添加BN_CLICKED消息映射
  5. 菜单项及其COMMAND消息映射

【说明】

  • 在前进和后退按钮的BN_CLICKED消息映射函数中都要调用UpdatePercentText

 

八、滚动条

1. 基本操作

  • CScrollBar类提供了滚动条的各种操作函数。
  • 包括:设置和获取滚动条的范围及滚动块的相应位置。

①设置滚动条的滚动范围

SetScrollRange(int nMinPos, int nMaxPos, BOOL bRedraw = TRUE);
  • 注:滚动条控件的默认滚动范围是0到0,故如果不设置其滚动范围,那么滚动块就滚动不起来。
  • 注:前两个参数表示滚动位置的最小值和最大值。

②设置滚动块位置

int SetScrollPos(int nPos, BOOL bRedraw = TRUE);
  • 注:nPos表示滚动块的新位置

③获取滚动条的当前范围以及当前滚动位置

void GetScrollRange(LPINT lpMinPos, LPINT lpMaxPos); //LPINT是整型指针类型
int GetScrollPos();

2. 通知消息

水平滚动条向父窗口(对话框)发送WM_HSCROLL消息(它是在其父窗口中进行映射的),其映射函数OnHScroll的原型如下:

afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar *pScrollBar);
  • 注:nSBCode(滚动条的通知消息)、nPos(滚动块当前位置)、pScrollBar(滚动条控件的指针)
  • 注:鼠标单击滚动条的不同部位时,所产生的通知消息也不同,如SB_LEFT、SB_RIGHT、SB_THUMBTRACK等。
  • 疑问:滚动条控件为啥会发送WM_HSCROLL消息??

 

九、滑动条

1. 概述

  • 组成: 滑动块、可选的刻度线
  • 特性:按照应用程序中指定的增量来移动
  • 增量:就是相邻两个刻度线之间的大小(并不准确,详见SetTicFreq函数注释)

2. 通知消息

  • 常见的有TB_BOTTOM、TB_THUMBTRACK等。
  • 注:上述这些消息代码都来自于WM_HSCROLL和WM_VSCROLL消息,其具体含义同滚动条。

3. 基本操作

  • CSliderCtrl类提供了滑动条的各种操作函数。

①设置滑动条的位置和范围

void SetPos(int nPos);
void SetRange(int nMin, int nMax, BOOL bRedraw = FALSE);
  • 注:nMin和nMax表示滑动条的最小和最大位置
  • 注:对应的GetPos和GetRange函数分别用来获取滑动条的位置和范围

②其他函数

//设置滑动条中的一个刻度线的位置
BOOL SetTic(int nTic);
//设置显示在滑动条中的刻度线的疏密程度
void SetTicFreq(int nFreq);    //如nFreq为2,那么每2个增量显示一条刻度线
//删除当前的刻度线
void ClearTics(BOOL bRedraw = FALSE);
//设置一个滑动条 中当前选择的开始和结束位置
void SetSelection(int nMin, int nMax);  //分别表示滑动条的开始和结束位置

4. 调整对话框背景颜色示例

【说明】

  • 目的:设置对话框背景颜色
  • 过程:通过滚动条和滑动条来调整Visual C++所使用的RGB颜色的三个分量(R、G、B)
  • 方法:通过映射WM_CTLCOLOR(当子窗口将要绘制时发送的消息,以便能使用指定的颜色绘制控件)来达到改变背景颜色的目的。

【过程】

  1. 单文档应用程序Ex_Ctrl5SDI
  2. 添加一个ID为IDD_COLOR的对话框资源,创建对话框类CBkColorDlg
  3. 添加控件并设置其属性
  4. 添加控件变量(1个滚动块框及2个滑动块,每个滑动块对应2个控件变量
  5. 为CBkColorDlg类添加两个成员变量,其一是用来设置红色分量的int型,其二是用来设置对话框背景所需要的画刷CBrush型
  6. 初始化代码:为CBkColorDlg添加WM_INITDIALOG消息映射,并添加相应的代码
  7. 为CBkColorDlg添加WM_HSCROLL消息映射,并添加代码
  8. 为CBkColorDlg添加WM_CTLCOLOR消息映射,并添加代码
  9. 添加菜单项并添加其的COMMAND消息映射,并添加代码
  10. 在应用程序中添加对话框类CBkColorDlg的头文件包含

【说明】

  • 滚动条和滑动条等许多控件都能产生WM_HSCROLL或WM_VSCROLL消息,故当它们(即控件)处在同一方向(如水平)时,需要判断消息是谁产生的
  • 添加WM_HSCROLL消息映射,为什么不是添加滑动块或滚动块的其他通知消息
  • 仔细研读添加WM_CTLCOLOR消息映射的作用

 

十、日期时间控件

1. 基本操作

  • CDateTimeCtrl类提供了日期时间控件的各种操作函数。
// 设置日期时间控件的日期或时间
BOOL SetTime(const CTime *pTimeNew);
// 获取日期时间控件的日期或时间
DWORD GetTime(CTime &timeDest) const;
  • 注:CTime是Visual C++中用于时间操作的类。

2. 创建并使用学生基本信息对话框示例

【过程】

  1. 单文档应用程序Ex_Ctrl6SDI
  2. 添加一个ID为IDD_STUINFO的对话框资源,创建对话框类CStuInfoDlg
  3. 添加控件并设置其属性
  4. 添加控件变量(1个日期时间控件、2个编辑框以及1个组合框,其中组合框对应2个控件变量
  5. 为CStuInfoDlg类添加一个BOOL型成员变量m_bMale,并在CStuInfoDlg类设置其初始值
  6. 初始化代码:为CStuInfoDlg添加WM_INITDIALOG消息映射,并添加相应的代码
  7. 为两个单选按钮和确定按钮分别添加BN_CLICKED消息映射,并添加代码
  8. 添加菜单项并添加其的COMMAND消息映射,并添加代码
  9. 在应用程序中添加对话框类CStuInfoDlg的头文件包含

【说明】

  • 添加成员变量m_bMale后是如何在程序中使用它的

 

十一、图像列表控件

1. 概述

  • 地位:列表控件或树控件可以与“图像列表”相关联,为各项目指定不同的图标或位图。
  • 作用:用来管理多个位图图标
  • 特性:是一系列相同大小的图像的集合,每一个图像均提供一个以0为基数的索引

2. 图像列表的创建

  • 图像列表控件是使用CImageList类来创建、显示和管理图像的。
  • 不能通过对话框编辑器来创建,而是必须通过调用Create函数来创建。
BOOL Create(int cx, int cy, UINT nFlags, int nInitial, int nGrow);
  • 注:cx/cy(图像的像素大小)、nFlags(图像类型)、nInitial(图像列表中最初的图像数目)、nGrow(当图像列表的大小发生改变时图像可以增加的数目)
  • 注:nFlags一般取ILC_COLOR和ILC_MASK(指定屏蔽对象)的组合,默认的ILC_COLOR为ILC_COLOR4(16色)

3. 基本操作

①(向图像列表)添加一个图标或多个位图

int Add(CBitmap *pbmImage, CBitmap *pbmMask);
int Add(CBitmap *pbmImage, COLORREF crMask);
int Add(HICON hIcon); //hIcon表示图标句柄
  • 注:pbmImage(包含图像的位图指针)、pbmMask(包含屏蔽的位图指针)、crMask(屏蔽色)

②(从图像列表)删除一个图像

BOOL Remove(int nImage);    //被删除的图像由nImage指定

③绘制一个图像

BOOL Draw(CDC *pdc, int nImage, POINT pt, UINT nStyle);  //在pt指定的位置绘制
  • 注:pdc(绘制的设备环境指针)、nImage(要绘制的图像的索引号)、nStyle(绘制图像时采用的方式)

④将nImage指定的图像扩展为图标

HICON ExtractIcon(int nImage);

⑤设置图像列表的背景色

COLORREF SetBkColor(COLORREF cr);
  • 注:cr可以是CLR_NONE,成功时返回先前的背景色,否则为CLR_NONE。

 

十二、列表控件

1. 概述

  • 用处:当每项内容包含多组信息时,就用列表控件来呈现。
  • 特性:有4种方式(“大图标”、“小图标”、“列表视图”、“报表视图”)来显示一组信息

2. 样式

  • 有两类,分别是一般样式和扩展样式

①列表控件的一般风格及其含义

风格 含义

LVS_ICON

LVS_SMALLICON

LVS_LIST

LVS_REPORT

“大图标”显示方式

“小图标”显示方式

“列表视图”显示方式

“报表视图”显示方式

LVS_SHAREIMAGELISTS

共享图像列表

 

LVS_ALIGNLEFT

LVS_ALIGNTOP

LVS_AUTOARRANGE

(在“大/小图标”显示方式中)

所有列表项左对齐

所有列表项在控件顶部

图标自动排列

LVS_NOSCROLL 禁用滚动条
LVS_NOSORTHEADER 当用户单击标题头时,不产生任何动作
LVS_SINGLESEL 只允许单项选择,默认是多项选择

LVS_SORTASCENDING

LVS_SORTDESCENDING

按升序排列

按降序排列

②常见扩展风格及其含义

风格 含义
LVS_EX_FULLROWSELECT 整行选择(仅限于“报表视图”显示方式)
LVS_EX_BORDERSELECT 用边框选择方式代替高亮显示列表项
LVS_EX_GRIDLINES 列表项各行显示线条(仅用于“报表视图”)

③修改列表控件的风格

  • 一般风格:调用GetWindowLong获取当前风格,调用SetWindowLong设置新的风格
  • 扩展风格:直接调用CListCtrl::SetExtendedStyle加以设置

3. 基本操作

  • 列表控件类CListCtrl提供了多种用于列表项操作的成员函数。

①为列表控件设置一个关联的图像列表

CImageList* SetImageList(CImageList *pImageList, int nImageList);
  • 注:nImageList(指定图像列表的类型,它可以是LVSIL_NORMAL<大图标>、LVSIL_SMALL<小图标>、LVSIL_STATE<表示状态的图像列表>)

②(向列表控件中)插入一个列表项

int InsertItem(const LVITEM *pItem);
int InsertItem(int nItem, LPCTSTR lpszItem);
int InsertItem(int nItem, LPCTSTR lpszItem, int nImage);
  • 注:nItem(要插入的列表项的索引号)、lpszItem(列表项的文本标签)、nImage(列表项图标在图像列表中的索引号)
  • 注:pItem(指向LVITEM结构的指针)

③删除列表项

BOOL DeleteItem(int nItem);
BOOL DeleteAllItem();

④查询列表项

int FindItem(LVFINDINFO *pFindInfo, int nStart = -1) const;
  • 注:pFindInfo(要查找的信息)

⑤其他函数

BOOL Arrange(...);                 // 重排列表项
int InsertColumn(...); // 插入新列
BOOL DeleteColumn(...); // 删除指定列
BOOL SetColumnWidth(...); // 设置指定列的像素宽度
int GetItemCount(); // 返回列表项个数

4. 消息

  • 在列表视图中,可以用MFC ClassWizard映射的控件消息公共控件消息、标题头控件消息、列表控件消息

  ①公共控件消息:NM_DBLCLK

  ②常用的列表控件消息:LVN_BEGINDRAG、LVNCOLUMNCLICK等。

  • 注:在用ClassWizard处理上述消息时,其消息处理函数参数中往往会出现NM_LISTVIEW结构。

5. 学生基本信息的添加和显示示例

【要点】

  • 知识:用一个列表控件来显示学生基本信息
  • 关联:与日期时间控件的示例联合,从那里填写学生信息,然后作为列表项添加到本例的列表控件中
  • 要点:可将列表控件按不同方式显示列表信息

【过程】

  1. 打开单文档应用程序Ex_Ctrl6SDI
  2. 添加一个ID为IDD_LIST的对话框资源,创建对话框类CListDlg
  3. 添加控件并设置其属性
  4. 添加控件变量(1个列表控件)
  5. 为CListDlg类添加成员函数SetCtrlStyle  //设置列表控件的不同显示方式
  6. 初始化代码:为CListDlg类添加WM_INITDIALOG消息映射,并添加相应的代码
  7. 为四个单选按钮和添加按钮分别添加BN_CLICKED消息映射,并添加代码
  8. 文件ListDlg.cpp中添加CStuInfoDlg的头文件包含
  9. 添加菜单项并添加其的COMMAND消息映射,并添加代码
  10. 在应用程序中添加对话框类CListDlg的头文件包含

【说明】

  • 仔细研读成员函数SetCtrlStyle的代码,加深对各种方式的理解 

 

十三、树控件

1. 结点

  • 树控件由父结点和子结点组成。
  • 每一个结点都可由一个文本和一个可选的位图图像组成,单击结点可展开或收缩该结点下的子结点。

2. 风格

①一般风格(样式)

风格 含义

TVS_HASLINES

TVS_LINESATROOT

子结点与它们的父结点之间用线连接

用线连接子结点和根结点

TVS_HASBUTTONS 在每一个父结点的左边添加一个按钮“+”和“-”
TVS_EDITLABELS 允许用户编辑结点的标签文本内容
TVS_SHOWSELALWAYS 当控件失去焦点时,被选择的结点仍然保持被选择
TVS_DISABLEDRAGDROP 该控件被禁止发送TVN_BEGINDRAG通知消息
TVS_SINGLEEXPAND 当使用这个风格时,结点可展开收缩
TVS_NOSCROLL 不使用水平或垂直滚动条

②修改风格

  • 方法:与列表控件的一般风格修改方法相同。

3. 常用操作

  • 树控件类CTreeCtrl提供了多种操作函数。

①向树控件插入一个新结点

②删除结点

③展开或收缩指定父结点的所有子结点

④获取下一个结点的句柄

⑤返回鼠标当前操作的结点的句柄

⑥其他常见操作

// 获取树中结点的数目
UINT GetCount();
// 判断一个结点是否有子结点
BOOL ItemHasChildren(HTREEITEM hItem);
// 获取由hItem指定的结点的子结点句柄
HTREEITEM GetChildItem(HTREEITEM hItem);
// 获取由hItem指定的结点的父结点句柄
HTREEITEM GetParentItem(HTREEITEM hItem);
// 获取当前被选择的结点的句柄
HTREEITEM GetSelectedItem();
// 获取根结点句柄
HTREEITEM GetRootItem();
// 选中指定结点
BOOL SeleceItem(HTREEITEM hItem);
// ...

4. 消息

  • 同列表控件相类似,树控件也可以用MFC ClassWizard映射公共控件消息和树控件消息。
  • 常用的树控件消息有TVN_BEGINDRAG、TVN_BEGINLABELEDIT等。
  • 注:在用ClassWizard处理上述消息时,其消息处理函数参数中往往会出现NM_TREEVIEW结构。

5. 使用树控件示例

【要点】

  • 与图像列表相关联,为项目指定特定图像

【过程】

  1. 单文档应用程序Ex_Ctrl7SDI
  2. 添加一个ID为IDD_TREE的对话框资源,创建对话框类CTreeDlg
  3. 添加控件并设置其属性
  4. 添加控件变量(1个树控件
  5. 为CTreeDlg类添加一个图像列表类CImageList对象m_ImageList
  6. 初始化代码:为CTreeDlg类添加WM_INITDIALOG消息映射,并添加相应的代码
  7. 为树控件添加NM_RCLICK(右击)消息映射,并添加代码
  8. 添加菜单项并添加其的COMMAND消息映射,并添加代码
  9. 在应用程序中添加对话框类CTreeDlg的头文件包含

【小结】

  • 各处添加的代码乃是对该小节说学知识的提炼与运用,正因为如此,我现在会了模子,只剩料子(具体内容)。