计算机软件技术实习日志项目四(二) 淘宝卖家管理系统项目实现
前言
大家好,我将以界面设计为主线为大家介绍我实现淘宝管理系统的细节。本将将着重介绍具体实现,相关原理请结合《计算机软件技术实习日志项目四(一) 淘宝卖家管理系统项目准备》
一、登录窗口
我们将主窗口编辑如下,点击后我们需要弹出新的窗口,其操作见下文介绍。
双击登录按钮编辑响应函数。
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