这是一个简易的MFC通讯录,全部功能大部分利用指针实现,对大家的指针使用熟练是一个很好的项目,欢迎大家多多讨论,共同进步。

实验报告步骤及总结

①.整体框架的设计

1)首先,这个就是运行的可视化效果图

2)然后可以看到,我的功能还是比较简单的,首先左边是一个列表框,用于显示添加的人员的名字,然后对于每个人只有三种信息,想要其他功能也是可以添加的,处理人员信息使用了两个编辑框和一个组合框,然后就是实现主要功能的六个按钮了,接下来将一一介绍。

②.编写代码前的准备工作
1)为了方便接下来代码的编写,我们要给编辑框,列表框和组合框分别设置一个成员变量,首先先打开类向导,按下图所示设置就好了呢

2)这里有个小细节需要注意,组合框我们只设置了一个成员变量,因为我们要把他们绑定成一个组,这样在操作其中一个的时候,另一个将自动关闭,绑定的方法如下图,在控件属性的Group那里选上True就好了

③.代码的编写(主要的解释会在每个代码段里呈现)
首先,先新建一个头文件,将要处理的信息以一个结构people表示出来

然后在Dlg.cpp里包含该头文件就可以使用了

额外包含一个fstream为接下来的 保存和读取 提前做好准备

(1)第一个按钮“添加”的执行代码
void CMFCApplication6Dlg::OnBnClickedButton1()
{
UpdateData(TRUE);
people *keda=new people;
strcpy_s(keda->pname, name);
strcpy_s(keda->phone, number);
keda->xingbie = xing;
int nCur = tongxun.AddString(name); //把该名字显示到列表框上去,并返回该项的序号
tongxun.SetItemData(nCur, (DWORD_PTR)keda); //将各项的序号和整个人员信息结构指针相关联

}

(2)列表框的执行代码
这行代码的主要操作是当添加了部分成员后,当我们点击列表框上的任意的成员名字,我们可以在右边看到该成员的具体信息,进而进行其他操作。

使用了GetCuSel() 函数
返回列表框中当前选中的项的下标,如果没有选中项,则返回CB_ERR

void CMFCApplication6Dlg::OnLbnSelchangeList1()
{
int nCur = tongxun.GetCurSel();
CWnd* pButton = GetDlgItem(IDC_BUTTON2); //获取操作删除键的指针
if (nCur != CB_ERR)
{
pButton-> EnableWindow(TRUE);
people * mouren = (people*)tongxun.GetItemData(nCur);
name = mouren->pname;
xing = mouren->xingbie;
number = mouren->phone;
UpdateData(FALSE);
}
else
pButton->EnableWindow(FALSE); //当没有选定删除的内容,将关闭删除键

}

(3)第二个按钮“删除”的执行代码

void CMFCApplication6Dlg::OnBnClickedButton2()
{
int nCur = tongxun.GetCurSel();
if (nCur != CB_ERR)
{
people * pInfo = (people*)tongxun.GetItemData(nCur);
tongxun.DeleteString(nCur);
delete pInfo; //因为我们的创建都是new的指针,因而我们要进行delete防止内存泄露
}
}

(4)第三个按钮“全部清除”的执行代码
void CMFCApplication6Dlg::RemoveLst() //用来将一条条new的删除掉,防止内存泄露
{
int n = tongxun.GetCount(); //返回列表框的列表数目
for (int i = 0; i < n; i++)
{
people * pInfo = (people*)tongxun.GetItemData(i);
delete pInfo;
}
tongxun.ResetContent(); //将列表框的内容全部清除
}

void CMFCApplication6Dlg::OnBnClickedButton5()
{
INT_PTR nRes =MessageBox(L"确定清除?" ,L"警告!!",MB_OKCANCEL | MB_ICONQUESTION);
if(nRes== MB_OKCANCEL)RemoveLst();
}

(5)`在这里第四个按钮“保存”的执行代码
void CMFCApplication6Dlg::OnBnClickedButton3()
{
CFileDialog dlg(FALSE); //文件对话框 :TRUE是打开 FALSE是另存为
//dlg.DoModal(); //模态对话框
if (dlg.DoModal() == IDOK)
{
CString strFile = dlg.GetPathName(); //获得文件保存路径
ofstream out(strFile,ios::binary);
if (out.is_open())
{
int n = tongxun.GetCount(); //把行数写进去,方便后面的读取
out.write((char*)&n, sizeof(int));
for (int i = 0; i < n; i++)
{
people * pInfo = (people*)tongxun.GetItemData(i);
out.write((char*)pInfo, sizeof(people));
}
}
}
}
}

(6)第五个按钮“读取”的执行代码
void CMFCApplication6Dlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog dlg(TRUE); //文件对话框
//dlg.DoModal(); //模态对话框
if (dlg.DoModal() == IDOK)
{
CString strFile = dlg.GetPathName(); //获得文件读取路径

ifstream in(strFile, ios::binary);
if (in.is_open())
{
RemoveLst(); //将界面原有的删除掉

int n;
in.read((char*)&n, sizeof(n));
for (int i = 0; i < n; i++)
{
people * pInfo = new people ;
in.read((char*)pInfo, sizeof(people));

int nIndex = tongxun.AddString(name);

tongxun.SetItemData(nIndex, (DWORD_PTR)pInfo);
}
}
else
{
AfxMessageBox(L"打开文件失败!!");
}
}
}

先进行提前全部清除,然后开始读取文件

读取开始:

读取结果:

(7)第六个按钮“最小化”的执行代码
void CMFCApplication6Dlg::OnBnClickedButton6() //特意加的一个小功能
{
AfxGetMainWnd()->CloseWindow();
}

将其缩小到电脑桌面底部

(8)右上角的✖的处理代码

当它关掉通讯录时会把所有new所占用的空间给清除,防止内存泄露!!

对实验结果进行分析
虽然我设计的MFC通讯录,并没有很多花哨的功能,但把所有基本的功能都实现了,从实验的结果来看,实验结果与预期达到一致,实现了输入,删除,读取,保存这些功能,并且都是使用了极为简洁的代码,运用了指针以及内存的动态分布,并且还注重了程序的完美,在每个结构删除的时候,把new所占用的 内存给释放出来,虽然不会影响可视化效果的使用,但这对于程序来说,内存泄露是一件极为可怕的事情。

对本次实验进行总结
1.在做实验的时候,也会遇到一些版本不同的问题,比如字符串如今的代码是使用Unicode编码,所以所有的字符串前加个_T(“”)这样修饰,还有一些函数的使用也是有一定的变化的。还有
2.解决了以上问题后,结合课上老师传授的内容和书本的知识做了这样一个简易的通讯录,通过这样一个比较完整的应用程序的设计,将学过的知识连贯起来,掌握开发了应该实际的应用程序的步骤,同时学会使用开发工具实现界面友好的应用程序。
3.通过这次实验以及实验报告的流程阐述,我对MFC有了更深刻的认识,并且更加熟悉了对话框的功能以及作用。

MFC通讯录入门必看相关推荐

  1. 95后数据科学家教你从零自学机器学习,这有3本入门必看书籍

    晓查 发自 凹非寺  量子位 编译 | 公众号 QbitAI 厌倦了现在的工作,想转行做数据科学,但是却没有计算机专业的相关学历,应该怎样才能入门? 这类的教程已经有很多.最近一位22岁的数据科学家D ...

  2. python基础教程书籍推荐-初学者python入门必看书籍推荐(上)

    随着最近Python的热度上涨,学习的人数也在增多,也因为Python这门语言的简短.易学.语言优美的优点,吸引了很多人来学习它.初学者想要入门,就必须先通过阅读,学习大量的理论知识对Python有一 ...

  3. arduino开发ESP8266配置方法,入门必看,esp8266开发板库离线安装包package2.7.1

    公众号关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 群里经常有朋友问arduino开发ESP8266的配置方法,今天在之前的文章基础上, ...

  4. 200528更新arduino开发ESP8266配置方法,入门必看,esp8266开发板库离线安装包package2.7.1...

    公众号关注 "DLGG创客DIY" 设为"星标",重磅干货,第一时间送达. 群里经常有朋友问arduino开发ESP8266的配置方法,今天(200528)在之 ...

  5. 怎么安装python_零基础入门必看篇:浅析python,PyCharm,Anaconda三者之间关系

    今天为大家带来的内容是:零基础入门必看篇:浅析python ,PyCharm,Anaconda三者之间关系 众所周知,Python是一种跨平台的计算机程序设计语言,简单来说,python就是类似于C, ...

  6. powershell 开发入门_详谈Ubuntu PowerShell(小白入门必看教程)

    早在去年八月份PowerShell就开始开源跨平台了,但是一直没有去尝试,叫做PowerShell Core. 这里打算简单介绍一下如何安装和简单使用,为还不知道PowerShell Core on ...

  7. IntelliJ IDEA 最常用配置详细图解,新手入门必看

    转载自   IntelliJ IDEA 最常用配置详细图解,新手入门必看 刚刚使用IntelliJ IDEA 编辑器的时候,会有很多设置,会方便以后的开发,磨刀不误砍柴工. 比如:设置文件字体大小,代 ...

  8. 五分钟教你使用vue-cli3创建项目(三种创建方式,小白入门必看)

    五分钟教你使用vue-cli3创建项目(三种创建方式,小白入门必看) 一.搭建vue环境 安装Nodejs 官网下载Nodejs,如果希望稳定的开发环境则下LTS(Long Time Support) ...

  9. 语音识别从菜鸟到入门必看的参考书目

    原标题:语音识别从菜鸟到入门必看的参考书目 此前研究这一方面的容,搜罗了些资料,在这里整理如下,做毕业设计,写毕业论文的朋友购书时可以参考一下: 一.<MATLAB数字信号处理> 编者:王 ...

最新文章

  1. django文件上传
  2. 深度学习难,这本书让你轻松学深度学习
  3. .NET 设计规范--.NET约定、惯用法与模式--6.为扩展性而设计
  4. Matlab中varargin函数
  5. vue引入外部文件_vue文件中引入外部js
  6. maven里如何根据不同的environment打包
  7. 大数据互联网架构阶段 Linux下安装mysql启动的常见问题
  8. [bzoj2242][SDOI2011]计算器
  9. ​热议 | 90%的程序员输在这点上!CTO:这份路线教你成为高手
  10. 动画|经典的归并排序究竟怎么玩儿?
  11. python条形码,Python中的远距离条形码
  12. windows 平台 atom编辑器常用快捷键
  13. matlab的otdr仿真,otdr测试曲线生成软件-OTDR测试曲线图仿真软件TrcView 4.0 官方免费版 - 河东下载站...
  14. Android好用的音乐,安卓手机音乐播放器哪个好用?十大最好音乐播放器介绍
  15. java生成api文档工具_api文档自动生成工具
  16. python是最适合初学者的语言
  17. 冬瓜哥祝大家新年快乐!
  18. GRE Over IPSec技术
  19. 9大代理服务器软件的比较与分析之CCProxy、Squid
  20. 一看就懂的保姆级教程:open vn设置 (亲测通过)

热门文章

  1. Android中的热修复
  2. php array assoc,PHP array_uintersect_assoc() 函数
  3. Unity颜色转换(HtmlString和Color)
  4. Web2.0的系统架构与六大关键问题
  5. K-means(K均值原型聚类)
  6. 成功恢复adobe后缀勒索病毒 sql文件中了后缀adobe勒索病毒恢复
  7. HTML5期末大作业:动漫人物介绍网站设计——柯南(5页) 含报告 HTML+CSS+JavaScript dw网页设计 web网页设计与开发
  8. 如花搞笑图片集锦(转贴)
  9. c语言的%的转义吗,%20转义(C语言转义字符问题)
  10. C/C++输入未知组数据的方法,多行输入介绍