要求:添加学生信息并显示在树形控件中;双击树形控件的叶子结点,将学生信息显示在List Control 中;在列表框中显示添加、清空、双击操作的操作记录,并添加删除操作记录的功能。

一、界面设计

修改Combo Box的Data属性,每一项以英文分号分隔。

修改LIstControl的view属性,改为report(报表)

修改List Box的Selection属性,如果要求只能单行删除列表框的数据,设置成Single,要求能一次删除多项数据,设置成Multiple

二、添加变量

三、初始化

在Dlg.cpp中的初始化函数OnInitDialog里添加代码,设置树形控件和可视化列表框的外观

	this->m_TreeCon.ModifyStyle(0, TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT);

	///强制类型转换


	root = this->m_TreeCon.InsertItem((CString)"年级");///根节点
	root1 = this->m_TreeCon.InsertItem((CString)"一年级", root);
	root2 = this->m_TreeCon.InsertItem((CString)"二年级", root);
	root3 = this->m_TreeCon.InsertItem((CString)"三年级", root);
	m_TreeCon.Expand(root, TVE_EXPAND);///展开当前父节点和三个子节点

	m_Inquiry.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_ONECLICKACTIVATE);
	m_Inquiry.InsertColumn(0, (CString)"姓名", LVCFMT_LEFT, 80);///插入第0列,宽度80
	m_Inquiry.InsertColumn(1, (CString)"学号", LVCFMT_LEFT, 90);
	m_Inquiry.InsertColumn(2, (CString)"年级", LVCFMT_LEFT, 80);
	m_Inquiry.InsertColumn(3, (CString)"Sub1", LVCFMT_LEFT, 85);
	m_Inquiry.InsertColumn(4, (CString)"Sub2", LVCFMT_LEFT, 85);
	m_Inquiry.InsertColumn(5, (CString)"Sub3", LVCFMT_LEFT, 85);
	m_Inquiry.InsertColumn(6, (CString)"Average", LVCFMT_LEFT, 85);///平均分

到目前为止,root、root1、root2、root3还没有定义,我们把它们定义为全局变量。

在Dlg.h 中添加定义:

HTREEITEM root, root1, root2, root3;

四、add

要求点击add向树形控件添加节点,向列表框添加操作记录

首先我们需要定义一个新类,将输入的学生信息储存下来,以备后续使用。

在Dlg.cpp中定义新类Student (在add控件代码前就好):

class Student : public CDialogEx
{
    public:
	CString name;
	CString ID;
	CString grade;
	double sub1;
	double sub2;
	double sub3;
	double aver;
}st[100010];

int tot = 0;///计数

双击add按钮,添加操作:

void COOPEx4Dlg::OnBnClickedadd()
{
	// TODO: 在此添加控件通知处理程序代码

	UpdateData(true);///实时更新

	++tot;///学生数++

	CString s;
	m_Grade.GetLBText(m_Grade.GetCurSel(), s);///获取ComboBox中的年级选项

	if (s == "一年级")
	{
		m_TreeCon.InsertItem(m_Name, root1);///在root1下添加叶子节点
		m_TreeCon.Expand(root1, TVE_EXPAND);///将刚添加的这一层展开
		st[tot].grade =(CString)"一年级";///存储
	}
	else if (s == "二年级")
	{
		m_TreeCon.InsertItem(m_Name, root2);
		m_TreeCon.Expand(root2, TVE_EXPAND);
		st[tot].grade = (CString)"二年级";
	}
	else if (s == "三年级")
	{
		m_TreeCon.InsertItem(m_Name, root3);
		m_TreeCon.Expand(root3, TVE_EXPAND);
		st[tot].grade = (CString)"三年级";
	}

        ///存储
	st[tot].ID = m_ID;
	st[tot].name = m_Name;
	st[tot].sub1 = m_Sub1;
	st[tot].sub2 = m_Sub2;
	st[tot].sub3 = m_Sub3;
	st[tot].aver = 1.0*(m_Sub1 + m_Sub2 + m_Sub3) / 3.0;

        //获取系统时间   
	CString str;
	CTime time;
	time = CTime::GetCurrentTime();
	str = time.Format("%X DATA ADD");
	m_Log.AddString(str);///显示在列表框里(下面那个大白框)

	UpdateData(false);
}

五、Reset

要求通过“Reset”按钮,实现向数据输入区的数据初始值重置功能。

即通过点击“ReSet”按钮,使得数据输入区的所有内容恢复到初始状态。

双击Reset,添加操作:

void COOPEx4Dlg::OnBnClickedreset()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(true);

	m_ID = _T("");
	m_Name = _T("");
	m_Sub1 = 0;
	m_Sub2 = 0;
	m_Sub3 = 0;

	m_Grade.SetCurSel(-1);

	CString str; //获取系统时间   
	CTime time;
	time = CTime::GetCurrentTime();
	str = time.Format("%X DATA RESET");
	m_Log.AddString(str);///将该操作显示在列表框中

	UpdateData(false);
}

七、双击树形控件 显示学生信息

要求:为树形控件增加Double Click事件。通过双击叶子节点,在list Control控件中将选中的节点的详细数据显示出来。

右键树形控件,添加事件处理程序,选择“NM_DBLCLK”,编辑代码

添加代码:

void COOPEx4Dlg::OnNMDblclkTree1(NMHDR *pNMHDR, LRESULT *pResult)
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(true);
	*pResult = 0;

	CString tmp = m_TreeCon.GetItemText(m_TreeCon.GetSelectedItem());///获取当前选中的人名

	for (int i = 1; i <= tot; i++)///遍历查询
	{
		if (st[i].name == tmp)///将该学生的详细信息显示出来
		{
			m_Inquiry.InsertItem(0, st[i].name);///先插入一行,默认从0开始,否则下面不能插入文本
			m_Inquiry.SetItemText(0, 1, st[i].ID);
			m_Inquiry.SetItemText(0, 2, st[i].grade);

			CString str;
			str.Format(_T("%lf"), st[i].sub1);
			m_Inquiry.SetItemText(0, 3, str);

			str.Format(_T("%lf"), st[i].sub2);
			m_Inquiry.SetItemText(0, 4, str);

			str.Format(_T("%lf"), st[i].sub3);
			m_Inquiry.SetItemText(0, 5, str);

			str.Format(_T("%lf"), st[i].aver);
			m_Inquiry.SetItemText(0, 6, str);

			break;
		}

	}

	CString str; //获取系统时间   
	CTime time;
	time = CTime::GetCurrentTime();
	str = time.Format("%X TREE DOUBLE CHICKED");
	m_Log.AddString(str);///向列表框中添加操作记录

	UpdateData(false);
}

八、clear

要求选中一个或多个列表项,单击clear可以删除

双击clear,添加代码

void COOPEx4Dlg::OnBnClickedclear()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(true);

	int cnt = m_Log.GetSelCount();///当前选中了多少项
	int *id = new int[cnt];///开个数组存这些选中项的地址,首先获取第一项的地址
	memset(id, -1, sizeof(int)*cnt);///清空地址数组

	m_Log.GetSelItems(cnt, id);///获取其他所有地址

	for (int i = cnt-1; i >=0; i--)///遍历这些列表项
	{
		m_Log.DeleteString(id[i]);///将它们删除
	}
	delete[] id;///释放

	UpdateData(false);
}

九、结果图