计算机软件技术实习日志项目四(二) 淘宝卖家管理系统项目实现

计算机软件技术实习日志项目四(二) 淘宝卖家管理系统项目实现



前言

大家好,我将以界面设计为主线为大家介绍我实现淘宝管理系统的细节。本将将着重介绍具体实现,相关原理请结合《计算机软件技术实习日志项目四(一) 淘宝卖家管理系统项目准备》


一、登录窗口

我们将主窗口编辑如下,点击后我们需要弹出新的窗口,其操作见下文介绍。
在这里插入图片描述
双击登录按钮编辑响应函数。

void CmosDlg::OnBnClickedlogin()
{
	// TODO: 在此添加控件通知处理程序代码
	CString username, password;
	GetDlgItemText(edit_username, username);
	GetDlgItemText(edit_password, password);
	bool is_ok = !username.CompareNoCase(_T("mxy")) && !password.CompareNoCase(_T("123456"));
	if(is_ok){											//如果用户名和密码正确
		ShowWindow(SW_HIDE);							//登录窗口隐藏
		osopDlg dlg;									//打开我们新建的窗口,具体介绍见下文。
		dlg.DoModal();									//新建窗口的弹窗
	}
	else {
		MessageBox(_T("用户名或密码错误!!!"));			//错误就提示
	}


}

二、操作窗口

我们添加一个新窗口作为操作窗口,添加List Control控件作为显示的控件,并添加相关按钮。
我们在List Control的属性中将view设置为report。然后我们右键该控件,添加一个变量column,用以之后添加删除等操作。
在这里插入图片描述
我们在新建的窗口右键菜单中点击添加类,然后添加类oposDlg。
我们在类向导里,为类oposDlg添加一个WM_CLOSE消息响应函数OnClose()。

void osopDlg::OnClose()
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CDialog* pdlg = (CDialog*)AfxGetMainWnd();		//获得主窗口(登录窗口)的指针
	pdlg->DestroyWindow();							//关闭主窗口,这样,在关闭操作窗口的时候就同时关闭隐藏的登录窗口。
	CDialogEx::OnClose();
}

然后添加一个初始化的虚函数OnInitDialog();

BOOL osopDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// TODO:  在此添加额外的初始化

	column.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_CHECKBOXES);//对于每行记录设置成整行选中,并设置选中框

	column.InsertColumn(0, _T("ID"),0,100);						//添加属性,名为ID,左对齐,宽度100
	column.InsertColumn(1, _T("Name"), 0, 100);
	column.InsertColumn(2, _T("Type"), 0, 100);
	column.InsertColumn(3, _T("Price"), 0, 100);
	column.InsertColumn(4, _T("Exchange Hour"), 0, 100);
	column.InsertColumn(5, _T("Client"), 0, 100);
	column.InsertColumn(6, _T("Transaction Status"), 0, 200);


	return TRUE;  // return TRUE unless you set the focus to a control
				  // 异常: OCX 属性页应返回 FALSE
}

效果如下图,数据是为演示服务的:
在这里插入图片描述
全选按钮

void osopDlg::OnBnClickedall()
{
	// TODO: 在此添加控件通知处理程序代码
	int cnt = column.GetItemCount();
	for (int i = 0; i < cnt; ++i) {
		column.SetCheck(i, TRUE);				//选中框设置为选中
	}
}

反选按钮

void osopDlg::OnBnClickedreverse()
{
	// TODO: 在此添加控件通知处理程序代码
	int cnt = column.GetItemCount();
	for (int i = 0; i < cnt; ++i) {
		column.SetCheck(i, !column.GetCheck(i));		//设置成原来状态相反的状态
	}
}

接下来我们要考虑如何添加记录了
我们需要添加一个用于添加记录的窗口,这个窗口有个一个变量用于接收添加的记录。我们在下文增加记录窗口再讲解这个新建的窗口如何实现,现在大家当做已经设置好了一个窗口,它有一个类newroadDlg,有个数组newadd用于存新加的记录。
增加按钮

void osopDlg::OnBnClickedadd()
{
	// TODO: 在此添加控件通知处理程序代码
	newroadDlg dlg;								
	dlg.DoModal();								//打开窗口,然后还在那个窗口上接收新纪录,这里不用关注细节。
	setnewdate(column.GetItemCount(),dlg);		//我们将dlg接收的新纪录传给column用以添加显示
}

void osopDlg::setnewdate(int id, newroadDlg &tmp) {
	id = column.GetItemCount();									//获得新加的行数
	column.InsertItem(id, tmp.newadd[0]);						//先用InsertItem()增加记录
	for (int i = 1; i <= 6; ++i) {
		column.SetItemText(id, i, tmp.newadd[i]);				//然后再用SetItemText设置记录
	}
}

删除按钮

void osopDlg::OnBnClickeddelete()
{
	// TODO: 在此添加控件通知处理程序代码
	int cnt = column.GetItemCount();
	for (int i = 0; i < cnt; ++i) {					//遍历记录
		if (column.GetCheck(i)) {					//如果选中了
			column.DeleteItem(i);					//就删除
			i--;									//游标减一,因为,第i个删除后,原来的第i+1个变为第i个,但是i在for循环里会加一,所以i就变成了i+1,也就是指向了原来的第i+2个
			cnt--;									//总数加一
		}
	}
}

修改按钮

void osopDlg::OnBnClickedchange()
{
	// TODO: 在此添加控件通知处理程序代码
	int cnt = column.GetItemCount();
	for (int i = 0; i < cnt; ++i) {								//遍历
		if (column.GetCheck(i)) {								//如果选中
			newroadDlg dlg;										//弹窗接收
			dlg.DoModal();										
			column.SetItemText(i, 0, dlg.newadd[0]);			//更新
			for (int j = 1; j <= 6; ++j) {
				column.SetItemText(i, j, dlg.newadd[j]);
			}
		}
	}
}

查看按钮

void osopDlg::OnBnClickedopen()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog fDlg(TRUE, _T(".dat"), _T("saveData"), OFN_OVERWRITEPROMPT, _T("数据文件(*.dat)|*.dat|所有文件(*.*)|*.*|"), NULL);
	//true表示打开文件框
	if (fDlg.DoModal() == IDOK) {
		CStdioFile file(fDlg.GetPathName(), CFile::modeRead);			//读文件
		CString cs;	
		CString read[10];
		int index=0;
		int div[10] = {0};
		int cnt = column.GetItemCount();
		for (int i = 0; i < cnt; ++i) {									//因为是打开新文件所以删除之前的记录
			column.DeleteItem(i);
			i--;
			cnt--;
		}
		while (file.ReadString(cs)) {									//按行读取文件内容
			div[0] = 1;
			for (int i = 1; i <= 7; ++i) {
				div[i] = cs.Find(_T("|"),div[i-1]+1);					//首先记录分隔符位置
			}
			for (int i = 0; i < 7; ++i) {								//读取两分隔符之间的内容
				read[i] = cs.Mid(div[i]+1, div[i + 1] - div[i] - 1);
				if (i == 0) column.InsertItem(index, read[i]);
				else column.SetItemText(index, i, read[i]);
			}
			++index;
		}
	}
}


void osopDlg::OnBnClickedlook()
{
	// TODO: 在此添加控件通知处理程序代码
	lookDlg dlg;
	dlg.DoModal();																	//打开窗口查看的数据
	for (int i = 0; i < column.GetItemCount(); ++i) {
		bool ok = 0;
		for (int j = 0; j <= 7; ++j) {												//每条记录,每个属性逐一对比
			if (dlg.ndate[j] != _T("") && dlg.ndate[j]==column.GetItemText(i,j)) {
				ok = 1;
			}
		}	
		if (ok) {																	//如果符合就打钩
			column.SetCheck(i,1);
		}
		else {
			column.SetCheck(i, 0);													//不然就不打
		}
	}
}

保存文件按钮

void osopDlg::OnBnClickedsave()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog fDlg(TRUE, _T(".dat"), _T("saveData"), OFN_OVERWRITEPROMPT, _T("数据文件(*.dat)|*.dat|所有文件(*.*)|*.*|"), NULL);
	//我们选用文件对话框类建立一个对象
	//true表示保存文件对话框,默认文件格式为dat,名字为saveData,覆盖文件提示,格式过滤器,父窗口指针为空
	if (fDlg.DoModal() == IDOK) {
		CStdioFile file(fDlg.GetPathName(), CFile::modeWrite | CFile::modeCreate);		//创建文件

		CString cs;
		for (int i = 0; i < column.GetItemCount(); ++i) {		//将记录的门而过每个属性用“|”隔开,
			for (int j = 0; j < 7; ++j) {
				cs += _T("|")+column.GetItemText(i, j);
			}
			cs +=_T("|\n");
			file.WriteString(cs);								//写入文件
		}
		file.Close();											//文件关闭
	}
}

打开文件按钮

void osopDlg::OnBnClickedopen()
{
	// TODO: 在此添加控件通知处理程序代码
	CFileDialog fDlg(TRUE, _T(".dat"), _T("saveData"), OFN_OVERWRITEPROMPT, _T("数据文件(*.dat)|*.dat|所有文件(*.*)|*.*|"), NULL);
	//true表示打开文件框
	if (fDlg.DoModal() == IDOK) {
		CStdioFile file(fDlg.GetPathName(), CFile::modeRead);			//读文件
		CString cs;	
		CString read[10];
		int index=0;
		int div[10] = {0};
		int cnt = column.GetItemCount();
		for (int i = 0; i < cnt; ++i) {									//因为是打开新文件所以删除之前的记录
			column.DeleteItem(i);
			i--;
			cnt--;
		}
		while (file.ReadString(cs)) {									//按行读取文件内容
			div[0] = 1;
			for (int i = 1; i <= 7; ++i) {
				div[i] = cs.Find(_T("|"),div[i-1]+1);					//首先记录分隔符位置
			}
			for (int i = 0; i < 7; ++i) {								//读取两分隔符之间的内容
				read[i] = cs.Mid(div[i]+1, div[i + 1] - div[i] - 1);
				if (i == 0) column.InsertItem(index, read[i]);
				else column.SetItemText(index, i, read[i]);
			}
			++index;
		}
	}
}

三、记录操作窗口

这个窗口可用于记录的增加,修改,查看操作
我们新建一个窗口控件布置如下图
在这里插入图片描述
我们添加一个类newroadDlg。在里面设一个数组接收新添加的记录。

ok按钮


public:
	CString newadd[10];

void newroadDlg::OnBnClickedaddok()
{
	// TODO: 在此添加控件通知处理程序代码
	getnewdate();													
	EndDialog(0);													//关闭窗口
}


void newroadDlg::getnewdate() {										//接收新纪录
	GetDlgItemText(edit_id, newadd[0]);
	GetDlgItemText(edit_name, newadd[1]);
	GetDlgItemText(edit_type, newadd[2]);
	GetDlgItemText(edit_price, newadd[3]);
	GetDlgItemText(edit_exhour, newadd[4]);
	GetDlgItemText(edit_client, newadd[5]);
	GetDlgItemText(edit_trsta, newadd[6]);
}

四、演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、总结

这一次通过学习淘宝卖家管理系统让我学会了运用MFC的List Control控件,也学会了窗口间的信息交换。本管理系统对于数据格式还不能判断,并且演示的时候都是用乱打的数据。

六、参考资料

【1】 B站视频 MFC程序设计——捐款管理系统(上)
https://www.bilibili.com/video/BV1q4411e7PQ/?spm_id_from=333.788.videocard.0
【2】 B站视频 MFC程序设计——捐款管理系统(下)
https://www.bilibili.com/video/BV1H4411Y7tD/?spm_id_from=333.788.videocard.0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值