MFC4 基本对话框的使用(四)树形控件、列表框、列表控件

要求:添加学生信息并显示在树形控件中;双击树形控件的叶子结点,将学生信息显示在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);
}

九、结果图

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
5015次浏览 47人参与
# 你的实习产出是真实的还是包装的? #
1103次浏览 27人参与
# 巨人网络春招 #
11175次浏览 223人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
6907次浏览 37人参与
# 简历第一个项目做什么 #
31251次浏览 312人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186349次浏览 1115人参与
# MiniMax求职进展汇总 #
22891次浏览 293人参与
# 面试紧张时你会有什么表现? #
30371次浏览 188人参与
# 简历中的项目经历要怎么写? #
309379次浏览 4152人参与
# 网易游戏笔试 #
6304次浏览 83人参与
# 职能管理面试记录 #
10687次浏览 59人参与
# 把自己当AI,现在最消耗你token的问题是什么? #
6850次浏览 154人参与
# 从哪些方向判断这个offer值不值得去? #
56698次浏览 357人参与
# 腾讯音乐求职进展汇总 #
160394次浏览 1105人参与
# 小红书求职进展汇总 #
226845次浏览 1356人参与
# AI时代,哪些岗位最容易被淘汰 #
62406次浏览 728人参与
# 你怎么看待AI面试 #
179254次浏览 1163人参与
# 正在春招的你,也参与了去年秋招吗? #
362517次浏览 2631人参与
# 你的房租占工资的比例是多少? #
92123次浏览 896人参与
# 机械求职避坑tips #
94396次浏览 567人参与
# 校招笔试 #
466318次浏览 2950人参与
# 面试官最爱问的 AI 问题是...... #
27111次浏览 834人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务