第11章 VC++2005应用程序开发实例
主讲内容
11.1.1 创建应用程序
• 按照之前讲述的方法,启动Visual Studio2005C++,选择菜单“文件”→“新建”→“项目”。
11.1.1 创建应用程序
• 选择项目类型为MFC,选择模板为MFC应用程序,在名称里输入MyDialog,点击确定。然后会出现应用程序向导界面, 第一个界面没有可以修改内容,直接点击下一步,弹出界面
11.1.2 应用程序的运行
• 选择菜单下面的“调试”→“启动调试”,会弹出启动编译对话框如图
11.1.2 应用程序的运行
• 系统提示是否重新生成项目,为了今后调试程序方便,可以勾选“不再显示此对话框”, 由于是新创建的项目,还没有生成可执行文件,我们点击“是”。
• 此时可以看到有一个对话框程序运行起来,对话框的标题就是“MyDialog”,上面拥有两个按钮,以及一段文字,如图
11.1.3 应用程序类和源文件
• 使用MFC应用程序向导生成对话框应用程序的基本框架时将派生三个类CMyDialogApp,CMyDialogDlg和CaboutDlg,如图
11.1.4 应用程序的控制流程
• Windows应用程序的初始化、运行和结束工作都是由应用程序类完成的。应用程序类构成了应用程序的主执行线程。
• 每个基于MFC类库而建立的应用程序都必须有一个且只有一个从CWinApp类派生的类对象,该对象在窗口创建之前构造。
11.1.4 应用程序的控制流程
• 与所有的Windows应用程序一样,基于MFC类库而建立的应用程序也有一个WinMain函数。但是,在应用程序中不用编写WinMain代码,它是由MFC类库提供的,在应用程序启动时调用这个函数。WinMain函数执行注册窗口类等标准服务,然后再调用对象中的成员函数来初始化和运行应用程序。
11.1.4 应用程序的控制流程
• 成员函数InitInstance、Run、ExitInstance和OnIdle都是可以覆盖的,其中InitInstance是唯一一个必须覆盖的CWinApp成员函数,也就是说大多说情况下用户可以不用编写其他函数,直接调用基类的同名函数即可。
11.2.1 使用对话框编辑器
• 按照上面创建的工程,选择菜单“视图”→“资源视图”,打开资源对话框如图
11.2.1 使用对话框编辑器
• 在资源窗口双击对话框文件夹下面的IDD_MYDIALOG_DIALOG。打开对话框编辑器后,显示程序的主窗体界面如图
11.2.1 使用对话框编辑器
• 选择窗体上面的标签控件,并删除掉,选择“视图”→“工具箱”,打开工具箱,用鼠标选择“Button”控件拖入对话框上面,并对按钮进行属性设置。
• 修改属性“caption”为“文件对话框”,修改属性“ID”为“IDC_BUTTON_FILE”,如图
11.2.1 使用对话框编辑器
• 再拖入两个按钮,修改属性“caption”为“颜色对话框”和“字体对话框”,修改属性“ID”为“IDC_BUTTON_COLOR”和“IDC_BUTTON_FONT”。
• 此时主对话框界面如图
11.2.2 编写代码
• 在对话框编辑器中双击文件对话框按钮,系统会自动添加消息函数的声明和实现到相应的头文件和实现文件中去,并添加消息映射。以下是空的消息函数代码。
• void CMyDialogDlg::OnBnClickedButtonFile()
• {
• // TODO: 在此添加控件通知处理程序代码
• }
11.2.2 编写代码
• void CMyDialogDlg::OnBnClickedButtonFile()
• { // TODO: 在此添加控件通知处理程序代码
• CString strtmp;//声明一个字符串对象
• CFileDialog cf(true);//声明一个对话框对象
• if(cf.DoModal()==IDOK)//打开对话框,判断返回值
• { strtmp=cf.GetPathName();//点击打开文件,给字符串赋值为文件名字 }
• else{strtmp="没有选择文件!";//点击取消或是直接关闭文件对话框 }
• AfxMessageBox(strtmp);//利用消息框弹出信息字符串}
• 运行程序,点击文件对话框按钮,选择磁盘上任意一个文件,点击打开按钮,有如下界面
11.2.2 编写代码
• 点击文件对话框按钮后,直接关闭或取消,会出现如下画面,如图
11.3.1 建立工程DAOAccess
• 建立名为“DAOAccess” 的新工程
• 注意选择还是“基于对话框的程序”,并且为了方便学习使用,暂时先不考虑字符集的问题,把“使用Unicode”勾选取消掉。
11.3.2 建立Access 文件
• 打开Office 里面的Access软件建立一个数据库文件DAOAccess.mdb保存在上述工程文件夹中,内有数据表student如下图所示
11.3.3 修改主窗体界面
• 打开对话框编辑器,删除主窗体上面所有控件,并按下表添加控件
11.3.3 修改主窗体界面
• 利用鼠标调整控件大小,以及位置,形成如图所示
11.3.4 添加代码
• (1) 首先,应确保包含进了afxdao.h头文件,可以在StdAfx.h文件中包含它,如下:
• #include afxdao.h //加入DAO数据库支持
• (2) 声明DAO库及其记录集变量,可在实现文件DAOAccessDlg.cpp的开始位置加入下面代码:
• CDaoDatabase db; //数据库
• CDaoRecordset RecSet(db); //记录集
11.3.4 添加代码
• (3) 添加InsertData函数
• 在DAOAccessDlg.h中添加如下代码,声明函数InsertData
• void InsertData(CString strName,CString strAge);
• 在DAOAccessDlg.cpp中添加如下代码,实现函数InsertData
• void CDAOAccessDlg::InsertData(CString strName,CString strAge){
• CListCtrl * pl;//列表控件指针变量
• pl=((CListCtrl *)(GetDlgItem(IDC_LIST_STUDENT))); //获取列表控件指针
• int i=pl->GetItemCount(); //获得列表当前保存的条目数量
• pl->InsertItem(i,strName); //在最后插入一个新条目
• pl->SetItemText(i,1,strAge); }
• //设置该新条目的下标为列内容,即年龄
11.3.4 添加代码
• (4)改造OnInitDialog()函数
• 在DAOAccessDlg.cpp中的OnInitDialog()中添加如下代码,以完成列表控件初始化设置,打开数据库和记录集,自动读取所有记录,插入记录到列表中。
• BOOL CDAOAccessDlg::OnInitDialog()
• {
• CDialog::OnInitDialog();
• …………//系统生成代码
• // TODO: 在此添加额外的初始化代码
11.3.4 添加代码
• CListCtrl * pl;//列表控件指针变量
• pl=((CListCtrl *)(GetDlgItem(IDC_LIST_STUDENT)));//获取列表控件指针
• pl->InsertColumn(0,"学生姓名",0,100);//添加列表控件的列头,位置下标为,内容是"学生姓名",对齐方式是左对齐,宽度为个像素
• pl->InsertColumn(1,"学生年龄",0,100);//添加列表控件的列头,位置下标为,内容是"学生年龄",对齐方式是左对齐,宽度为个像素
11.3.4 添加代码
• COleVariant var; // 字段类型
• CString strName,strAge,strFile;
• CString strSql;
• strSql="SELECT * FROM student";//读取数据库表中所有记录的sql语句
• strFile = "DAOAccess.mdb";//数据库文件的名字
• db.Open(strFile); // 打开已创建的DAOAccess数据库
• RecSet.Open(AFX_DAO_USE_DEFAULT_TYPE,strSql,NULL);//打开student表
11.3.4 添加代码
• while(!RecSet.IsEOF()) { // 当记录集指针到达结尾的时候,该函数返回真,否则为假
• RecSet.GetFieldValue("name",var);//读取当前记录的name字段
• strName =(LPCTSTR)var.bstrVal;
• RecSet.GetFieldValue("age",var);//读取当前记录的age字段
• strAge.Format("%d",var.intVal);
• InsertData(strName,strAge);//在列表控件上插入刚刚读取的记录
• RecSet.MoveNext();//记录指针向后移动一个
• }
• return TRUE; // 除非将焦点设置到控件,否则返回TRUE}
11.3.4 添加代码
• (5)添加“增加”、“删除”、“关闭”按钮事件函数代码
• 在对话框编辑器中,双击指定的按钮,添加如下代码
• void CDAOAccessDlg::OnBnClickedButtonAdd()
• {
• // TODO: 在此添加控件通知处理程序代码
• CString strName,strAge;
11.3.4 添加代码
• GetDlgItem(IDC_EDIT_NAME)->GetWindowText(strName);
• //获取Name编辑框控件上的内容,前面是获得控件指针,GetWindowText函数可以获得指定控件上面的文本内容,所有控件均可以调用这个函数
• GetDlgItem(IDC_EDIT_AGE)->GetWindowText(strAge);
• //获取Age编辑框控件上的内容
• RecSet.AddNew();//记录集开始添加新记录
•
11.3.4 添加代码
• RecSet.SetFieldValue("Name",(LPCTSTR)strName);//设置新记录的Name字段
• RecSet.SetFieldValue("Age",(LPCTSTR)strAge);//设置新记录的Age字段
• RecSet.Update();//保存记录集
• InsertData(strName,strAge);//在控件上插入新输入的记录
• }
11.3.4 添加代码
• void CDAOAccessDlg::OnBnClickedButtonDelete()
• {
• // TODO: 在此添加控件通知处理程序代码
• CListCtrl * pl;//列表控件指针变量
• pl=((CListCtrl *)(GetDlgItem(IDC_LIST_STUDENT)));//获取列表控件指针
• int nIndex = pl->GetNextItem( -1, LVNI_SELECTED ); //利用列表控件成员函数获得选中的条目索引号
11.3.4 添加代码
• RecSet.MoveFirst();//移动记录集指针到第一个位置
• RecSet.Move(nIndex);//向后移动nIndex
• RecSet.Delete();//删除当前记录集
• pl->DeleteItem(nIndex);//删除当前选中条目
• }
11.3.4 添加代码
• void CDAOAccessDlg::OnBnClickedButtonClose()
• {
• // TODO: 在此添加控件通知处理程序代码
• RecSet.Close();//关闭记录集
• db.Close();//关闭数据库
• OnOK();//关闭对话框
• }
11.3.4 添加代码
• 程序最终运行效果如图
本文来源:https://www.2haoxitong.net/k/doc/628cc8f3941ea76e58fa0485.html
文档为doc格式