2 C++MFC对话框程序设计示例详解
VCMFC中的CComboBox控件使用详解

VCMFC中的CComboBox控件使用详解VC/MFC中的CComboBox控件使用详解CComboBox控件详解CComboBox控件又称作组合框控件,其有三种形态可供选择,1.简单组合框(Simple)2.下拉组合框(Drop-down)3.下拉列表式组合框(Drop-down list).CComboBox控件的常用设置属性说明:type属性:里面一共有三个选项.就是其三种形式, 我们常用的是后两种形态,其区别就是Dropdown的编辑区为可编辑控件,而droplist 为静态控件.Data属性:当程序初始化的时候,下拉列表将显示其属性里面的内容,内容用分号分隔.其属性只支持后2中形式,Sort 属性:对添加到下拉列表框中的数据自动进行排序,如果你不想他改变你的显示序列,把他设置成False.控件是一个窗口.其基类是为CWnd.所以CComboBox也可以使用CWnd的一些函数,它自己的函数有30几种.我写了一个示范程序,演示了一些常用的函数,你可以参考其代码看到其功能.注:m_cbox 为CComboBox控件的关联变量,m_end为EDIT控件的关联变量1.GetCount() 函数:用以获得列表框中的选项数目. int GetCount() const;(此乃函数原型,我会列在每条的后面) 下面的例子是程序中各个按钮里面的代码int i;CString str;i=m_cbox.GetCount();str.Format ("%d",i);m_end="一共有"+str+"个数据";UpdateData(FALSE);2.GetCurSel() 函数:用以得到用户选中下拉列表框中数据的索引值.返回的值是重0开始的,如果没有选择任何选项将会返回-1 Int GetCurSel() constint i;CString str;i=m_cbox.GetCurSel ();str.Format ("%d",i+1);if (i==-1) m_end="你什么都没有选";else m_end="你选的是第"+str+"项";UpdateData(FALSE);3.SetCurSel函数:选取列表框中的一个选项,索引从0开始,-1为什么都不选.当你需要把列表框中已经选取的内容清空时就可以使用这个函数;if(m_i<3) m_cbox.SetCurSel (m_i++);//m_i为int型变量用以计数else {m_cbox.SetCurSel (-1);m_i=0;}4.SetEditSel函数:设置编辑区中蓝色选中字段的长度, BOOL SetEditSel( intnStartChar,int nEndChar ); nStartChar是起始的位置,当设置为-1时为不选择任何字段,nEndChar是结束位置.还有一个对应的函数GetEditSel是取得其位置,在此不详解.m_cbox.SetEditSel (3,5);//在编辑框中打入一串数字在按此按钮就能看到效果//其作用就是选中第3到第5个字符作为热点5.Clear() Cut() Paste() Copy() 这四个函数我放在一起说,因为他们都是针对编辑框中选定的文字进行编辑的函数,很多初学者很不明白这4个函数,使用这些函数没有作用,其实不然,这些函数对于在编辑框中的内容不进行处理,他真正处理的是你用鼠标选中的内容,对于Clear()函数很多书中解释都是有误的,很多书中对他的解释是清除当前选中的文本,我认为这样的解释是有歧异的,真正的解释是把你刚选中的文本释放掉,也就是不选,而不是把选中的删除,真正的删除选中的文本的函数是Cut(),Copy()是复制选中的文本,Paste()是粘贴到光标处.其演示就不写在程序中,有兴趣的朋友可以自己试试.6.LimitText()函数.其作用是限制在编辑框中键入的文本长度,BOOL LimitText(int nMaxChars); 当nMaxChars为0时,不是不能输入,而是长度最大化为65535字节7.GetLBText()函数.其原型为void GetLBText( int nIndex, CString&rString ).nIndex为列表框中数据的索引值,rString 为字符串,其作用就是把索引号为nIndex的数据放到rString变量中.与其对应的GetLBTextLen(intnIndex)函数就是得到索引号为nIndex中数据的长度m_cbox.GetLBT ext (2,m_end); // GetLBText按钮UpdateData(0);CString str; //GetLBTextLen按钮int i=m_cbox.GetLBTextLen (2);str.Format ("%d",i);m_end=str;UpdateData(FALSE);8.AddString() DeleteString() InsertString() ResetContent() 四个函数放在一起,他们都是针对下拉列表框的处理函数, AddString(LPCTSTR lpszString) 是在列表框的尾巴添加一条数据,参数为字符串. DeleteString(UINT nIndex)为删除指定索引为nIndex的数据. InsertString(int nIndex, LPCTSTR lpszString)在索引nIndex处插入IpszString的内容. ResetContent()是清除列表框中所有的内容.9.SetDroppedWidth(UINT nWidth) 函数.用于设定下拉列表框的最小宽度,当下拉列表框中的数据很长不能完全显示时,我们可以使用这个函数把列表框的宽度设置的大些.同样GetDroppedWidth()是返回列表框的宽度.以下为总结了各大论坛中对CCombBox控件使用的问题.并给出了正解.1.关于CComboBox在对话框中没有下拉项目的问题答: 资源编辑器中对话框中CComboBox组件的垂直范围拉大了下,就看见字体了,看到那个向下的黑箭头了吗,点他下拉,嘿嘿就这么简单.2.请问怎样能让CCombobox记住用户的输入.下次使用时还有答: 要记住用户的输入必须用到文件读写,或者把内容添加到注册表中,我会在以后给出解决办法.3. CCOMBOBOX如何使它只读,不能编辑答: 看了本文的介绍也许你现在知道了, CCOMBOBOX有三种类型的,选择你需要的吧!4. 我要让界面一显示,就能在Combo框中显示默认的数据答: 你要在OnInitDialog里面加上我上面所提到的SetCurSel()函数就行了.5. 如何把选好的内容赋给变量答: 先给CCOMBOBOX设置一个CString关联变量,再添加事件处理函数CBN_ Selchange.使用UpdateData(FALSE)就行了.6. 在CComboBox组合框中,条目的对齐方式是左对齐,能设置为对中或者右对齐吗?答: 没有直接的方法,你必须自己对齐, 比如最大长度是10int i;String.Format("%10d", i);CComboBox->AddStringVC combobox 使用大全 ---------------------------------------------------一、如何添加/删除Combo Box内容1. 在Combo Box控件属性的Data标签里面添加,一行表示Combo Box下拉列表中的一行。
第15课 - MFC简介

以传统的windows消息处理方式相同,以 WM_开头的消息,需要重载虚函数 PreTranslateMessage(MSG* pMsg); 使用消息映射,将相应的消息映射成函数,我们 只关心映射的结果函数即可。
Windows程序设计-基础教程
MFC对话框框架简介
15
对话框框架分析
Windows程序设计-基础教程
创建典型的对话框程序(示例)后,会出现如下 几个类: CTest18App:应用程序管理类 CTest18Dlg:对话框管理类 其中,后两个类是根据项目名称而定的,规则是 :C+项目名称+App(或Dlg)
CAboutDlg
Windows程序设计-基础教程
在MFC编程中,大部分对话框都需要一个类来对它 进行控制。并使用DoModal()的方法显示它,操 作步骤如下: CAboutDlg aboutDlg; aboutDlg.DoModal();
1)创建兼容DC 2)选入位图 3)执行BitBlt函数,将兼容DC中的图形拷贝 到当前设备环境中。 4)选出位图 5)删除位图
举例
Windows程序设计-基础教程
HBITMAP hOldbmp,hbmp = NULL; HDC hmdc =CreateCompatibleDC(hdc); hbmp = LoadBitmap(hInstance, MAKEINTRESOURCE(ID_BMP)); hOldbmp = (HBITMAP)::SelectObject(hmdc ,hbmp); ::BitBlt(hdc,0,0,200,200,hmdc, 0,0,SRCCOPY); ::SelectObject(hmdc,hOldbmp); DeleteDC(hmdc);
mfc对话框基础要点

第五章对话框对话框是一种用户界面,它的主要功能是输出信息和接收用户的输入。
对话框与控件是密不可分的,在每个对话框内一般都有一些控件,对话框依靠这些控件与用户进行交互。
一个典型的对话框例子是选择了File-Open命令后弹出的文件对话框。
5.1对话框和控件的基本概念5.1.1对话框的基本概念对话框(Dialog)实际上是一个窗口。
在MFC中,对话框的功能被封装在了CDialog类中,CDialog类是CWnd类的派生类。
对话框分为模态对话框和非模态对话框两种。
大部分读者都会有这样的经历,当你通过File-Open命令打开一个文件对话框后,再用鼠标去选择菜单将只会发出嘟嘟声,这是因为文件对话框是一个模态对话框。
模态对话框垄断了用户的输入,当一个模态对话框打开时,用户只能与该对话框进行交互,而其它用户界面对象收不到输入信息。
我们平时所遇到的大部分对话框都是模态对话框。
非模态对话框的典型例子是Windows95提供的写字板程序中的搜索对话框,搜索对话框不垄断用户的输入,打开搜索对话框后,仍可与其它用户界面对象进行交互,用户可以一边搜索,一边修改文章,这样就大大方便了使用。
本节主要介绍模态对话框,在第四节将介绍非模态对话框。
从MFC编程的角度来看,一个对话框由两部分组成:1.对话框模板资源。
对话框模板用于指定对话框的控件及其分布,Windows根据对话框模板来创建并显示对话框。
2.对话框类。
对话框类用来实现对话框的功能,由于对话框行使的功能各不相同,因此一般需要从CDialog类派生一个新类,以完成特定的功能。
5.1.2控件的基本概念图5.1对话框中的控件控件(Control)是独立的小部件,在对话框与用户的交互过程中,控件担任着主要角色。
控件的种类较多,图5.1显示了对话框中的一些基本的控件。
MFC的控件类封装了控件的功能,表5.1介绍了一些常用的控件及其对应的控件类。
表5.1控件实际上都是窗口,所有的控件类都是CWnd类的派生类。
MFC C++登录对话框编写步骤

3.1 创建“登录”对话框 3.1.1 生成默认对话框工程 1.进入VC++ 安装Microsoft Visual Studio 6.0 后,在开始菜单中单击Microsoft Visual Studio 6.0子菜单下的Microsoft Visual C++ 6.0,即可打开VC++ 6.0 编程平台,如图3.2所示。
(c)“用户名”静态文本标签
(d)“确认”按钮属性
如图3.16(e)所示,在“密码”编辑框属性的Styles 选项卡中勾选 Password。这样,程序运行后,用户输入密码到编辑框时将会显示“***”符号。
(e)“密码”编辑框属性
图3.16 设置控件属性
添加的控件可能大小不一,此时可以选定某个控件,移动鼠标到控件边缘 处出现双箭头来调整大小。要设置多个控件之间的位置大小关系时,先按住 Shift键不放,然后用鼠标选取控件,直到所需要的多个控件选取之后再释放 Shift键。若在选取时,对已选取的控件再单击一下,则取消该控件选取。一旦 单个控件被选取后,其四周由选择框包围着,选择框上还有几个蓝色实心小方 块,拖动它可改变控件的大小;多个控件被选取后,其中只有一个控件的选择 框有几个蓝色实心小方块,这个控件称为“主要控件”,而其他控件的选择框 的小方块是空心的。如图3.17所示。
图3.20 “New Class”对话框
Байду номын сангаас
2.为“登录”对话框设置控件关联变量 使用MFC ClassWizard可以很容易地为一个控件定义关联变量并可设置其数 据范围。例如,下面的步骤是为CDlgLogin类的控件IDC_EDIT1和IDC_EDIT2即 “用户名”和“密码”编辑框添加关联变量m_user和m_pass。 (1)按快捷键Ctrl + W,打开MFC ClassWizard,并切换到Member Variables页面,如图3.21所示。
MFC简单的登录对话框

登录对话框我们利用MFC编写一个简单的登录对话框。
主窗体是单文档界面。
程序运行的时候,先弹出一个简单的登录对话框,输入用户名和密码后主窗体显示出来。
1、开打VC++6.0。
点击文件,新建,点击工程中的MFC AppWizard(exe),在右边选择工程保存的位置,并且为工程取好名字。
2、点击确定后,选择单个文档,你可以一直点击下一步,直到完成,或者在这里直接点击完成即可,完成后界面如下。
3、点击工具栏中的“!”号试着编译运行一次,看是否有问题。
如果没有问题,我们继续。
点击左边的ResourceView,在Dialog上面鼠标右键单击弹出一弹出框,单击Insert Dialog。
4、在右边新增的对话框中,适当改变窗口大小,加入静态文本框和文本编辑框。
输入用户名:。
然后回车同样在下面的第二个静态文本框的属性标题改为:输入密码:。
然后回车。
6、在第一个文本编辑框上右键单击,点击属性,把ID框中的IDC_EDIT1改为容易理解的名字,如:IDC_EDIT_NAME,注意前面的IDC_EDIT最好不要去掉,这样容易见名而知义。
同样,对第二个文本编辑框的属性中的IDC_EDIT2改为:IDC_EDIT_PWD7、在对话框上的任何空白的地方右键单击,点击建立类向导。
然后弹出选择建立Create a new class,点击OK。
这是为这个对话框创建一个新的类。
在Name中,为该对话框类取个名字:CDlg_login。
下面的Base class以及Dialog ID不要随便改动。
然后点击OK。
这样新的类CDlg_login就与本对话框建立起了联系。
8、点击OK后,我们并没有退出建立类向导。
点击member variables。
9、左键双击IDC_EDIT_NAME(或者单击后,点击右边的add variables),为IDC_EDIT_NAME增加一个对应在类中的名字:m_login_name。
其他地方不要改动。
对话框设计(1)

5.6 (dimx_tile key) 返回控件的宽。 5.7 (dimy_tile key) 返回控件的高。 5.8 (start_image key)打开图像,准备建立图像。 5.9 (vector_image x1 y1 x2 y2 color)按给定坐标和颜色 画线。 5.10 (fill_image x1 y1 x2 y2 color)按给定坐标和颜色画 填充的矩形。 x1,y1 x1,y1 X2,y2
装入DCL文件 启动对话框
设置控件的初值
设置控件的动作 显示对话框控制权交给用户
(start_dialog)
(done_dialog[status])”) (unload_dialog dcl_id)
OK按钮动作,读 数据,对话框消失
Cancel 按钮 对话框消失
卸载对话框文件
hello对话框的驱动程序 (defun c:hello ( / dcl_id ) (setq dcl_id (load_dialog “test.dcl”));装入DCL文件
预视对话框
VLISP 下拉菜单
Tools Interface Tools Preview DCL in Editor
四. 编写对话框驱动程序
(load_dialog “test.dcl”) (new_dialog “hello” dcl_id) ) (set_tile key value) (action_tile key “动作”)
第九讲
对话框设计
(一)
一. 概述
对话框的特点:形象、直观、随意输入、 随时修改,鼠标、键盘并用,操作方便。 对 话 框 用 DCL ( Dialog Control Language)定义,得到 “.DCL” 类型的文 件,用 AutoLISP 或 C 程序驱动。 也可以用 VB、VC++ 通过 MFC 定制。 AutoCAD 系 统 定 义 的 对 话 框 存 放 于 ACAD.DCL文件。 文件 BASE.DCL 为用户提供了一些常用的 标准控件和组件。
实验1 创建对话框应用程序及控件使用

实验1 创建对话框应用程序及控件使用一.实验目的1.掌握使用“MFC应用程序向导”创建对话框应用程序框架的方法2.掌握给对话框添加控件的方法,以及使用“MFC类向导”为控件通知消息映射消息处理函数的方法3.掌握使用“MFC类向导”为控件添加控件变量的方法4.掌握控件变量与控件的数据交换机制以及使用控件变量访问和控制控件的方法5.掌握对话框中添加自定义消息的方法二.实验内容1.创建一个Windows对话框应用程序,其界面要求实现以下功能:在下部的文本编辑框(Edit Control )中输入内容后,单击“添加”按钮,文本编辑框的内容被作为一个条目添加到上部的列表框(List Box)中2.为上一步创建的程序添加一条自定义消息,消息名为WM_MYMESSAGE,也可自己命名。
单击“添加”按钮时,将发送盖消息,该消息的处理函数将删除编辑框中已输入的所有内容。
三.实验步骤1.使用“MFC应用程序向导”创建一个对话框应用程序,项目名称编程者自己确定。
2.将主动生成的对话框中的静态文本控件和“取消”命令按钮删除,在窗口上部添加一个列表框(List Box)控件,在列表框中的静态文本控件和“取消命令按钮删除,在窗口上部添加一按钮左侧添加一个命令按钮(Button)控件.3.将“确定”按钮的caption属性修改为“退出”,新添加的命令按钮的caption属性修改为“添加”,修改对话框窗口的caption属性为“实验1”,调整各控件的大小和布局如上图所示。
4.为列表框控件添加一个控制变量,类别为control,变量名编程者自己确定,这里取名为m_list,为编辑框控件添加一个控制变量,类别为value,类型Cstring,变量名为m_Edit,也可由编程者自己确定。
5.为“添加”按钮添加并编写BN_CLICKED消息的消息处理函数,该函数代码如下:Void CShiyanDlg : : OnBnclickedButton1( ){//TODO:在此添加控件通知处理程序代码UpdateData(true); //将控件中的数据交换至控件变量If(!m_Edit . ISEmpty()) //如果编辑框内容不空,则将内容添加至列表框M_List . Addstring(m_Edit);}6.编译运行程序,在文本编辑框中输入内容并单击“按钮”,观察执行结果。
第8章 MFC对话框

谢谢 Thanks for listening.
- 16 -
void CRegDlg::OnBnClickedOk() {
/*1、访问对话框控件*/ char chPhone[30]; memset(chPhone,0,sizeof(chPhone)); GetDlgItem(IDC_ED_PHONE)->GetWindowTextW((LPTSTR)chPhone,20); GetDlgItem(IDC_ED_PHONE2)->SetWindowTextW((LPTSTR)chPhone); }
- 19 -
标准控件与对话框—对话框数据交换与验证
数据交换:
在对话框类中,MFC自动添加了DoDataExchange()函数,在其中实现对 话框控件数据的交换和验证机制。
void CRegDlg::DoDataExchange(CDataExchange* pDX) {
CDialog::DoDataExchange(pDX); DDX_Text(pDX, IDC_ED_USERNAME, m_edUserName); DDX_Text(pDX, IDC_ED_PHONE, m_edPhone); DDX_Text(pDX, IDC_ED_EMAIL, m_edEmail); }
SetDlgItemText(IDC_ED_PHONE2,(LPTSTR)chPhone);
}
- 17 -
class CRegDlg : public CDialog {
…… char phone[30];//此处是向导添加的变量 }; …… GetDlgItemText(IDC_ED_PHONE,(LPTSTR)phone,20); SetDlgItemText(IDC_ED_PHONE2,(LPTSTR)phone); ……
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MFC对话框程序设计详解(中南大学朱从旭老师)1. 利用MFCAppWizard(exe)建立程序框架注意:请各位同学新建的“工程名称”用自己的全学号命名(这里假定学号是“123”),此过程的操作详见图1.1~图1.7所示。
图1.1 “新建”对话框之新建“工程”图1.2 选择“程序类型”图1.3 选择“程序类型”续1 图1.4 选择“程序类型”续2图1.5 “程序类”总结图1.6 程序最后总结到此为止,程序的图像见面的框架已经建立,如图1.7所示。
接下来第2节将介绍如何在界面上添加控件(文本框、命令按钮、等),以便得到具体程序的个性化界面。
图1.7 在开发环境下看程序的界面2. 设计程序的界面本节所述的操作步骤和方法详见图2.1~图2.7所示。
图2.1 在开发环境下调出“控件”工具箱图2.2 在程序的“界面”中删除不要的控件图2.3 用鼠标在“控件”工具箱里单击“静态文本”控件,然后在界面上画出一个“静态文本”控件(Static),然后右击该控件并单击“属性”菜单图2.4 在弹出的“属性”对话框中指定该控件的ID(名称)、标题(可见内容)图2.5 按照图2.1~2.4的方法画出一个编辑框(EDIT),并在它的“属性”对话框中暂时只要指定该控件的ID(名称)图2.6 按照图2.1~2.4的方法画出一个命令按钮(BUTTON),并在它的“属性”对话框中指定该命令按钮控件的ID(名称)、标题(可见内容)图2.7 按上述方法画出本程序的所有控件;同时将原有“确定”控件的标题改为“添加学生”,将原有“取消”控件的标题改为“退出程序”完成图2.1~2.7的操作后,你的个性化程序界面已经设计好,此时,最好“编译”->“链接”->“运行”一下看看,如果上述操作无误,你将看到一个像模像样的图形界面程序运行起来了。
不过,当用户用鼠标单击界面上的命令按钮时程序不会有任何反应,要想实现命令按钮的相应功能,需要在相应“消息映射函数”中自己写一些程序代码,请阅读第3节。
3. 设置“成员变量Member Variables”和“消息映射Message Maps”3.1从“查看”菜单/“建立类向导”引出“MFC ClassWizard”对话框(图3.1);图3.1 “MFC ClassWizard”对话框3.2 为每个编辑框(Edit)设置成员变量(Member Variables)以“学号”框设置成员变量为例:在图3.1中,选“Member Variables”标签;然后在控件列表框中选定“Number_EDIT”,并单击“Add Variable…"按钮,在弹出的“Add Member Variable"对话框中,指定它的关联变量的名字为m_1(也可以是其它名字),关联变量的数据类型为"int",如图3.2所示。
图3.2 设置编辑框的关联变量(变量名、数据类型)按上述方法为每个编辑框指定一个关联变量(含名字、数据类型);本示例中,给每个编辑框指定的关联变量(含名字、数据类型)如下面的表1所示。
表1. 本示例中每个编辑框的名字、对应关联变量名编辑框描述的内容编辑框的名称编辑框的关联变量名关联变量的数据类型学号Number_EDIT m_1 int姓名Name_EDIT m_2 Cstring语文Chinese_EDIT m_3 int数学Math_EDIT m_4 int英语English_EDIT m_5 int 输出姓名OutName_EDIT m_6 Cstring输出总分OutTotal_EDIT m_7 int输出平均分OutAverage_EDIT m_8 Int指定学号值Specify_EDIT m_9 int备注:Cstring类型是字符串类型(而char类型是字符类型,属于基本数据类型),Cstring 类型不是基本数据类型,实际上是C++的<string>文件中预定义的一种类,所以Cstring类型的变量实际上是对象变量。
用Cstring类型的变量处理字符串,比用char类型的数组处理字符串更加简单、方便。
3.3 为每个命令按钮(Button)设置消息映射(Message Maps)以“添加学生”按钮设置鼠标单击的消息映射为例:在图3.1中,选“Message Maps”标签;然后在控件列表框中选定“Add_BUTTON”,在“Message”列表框中选定“BN_CLICKED”;并单击“Add Function…"按钮; 如图3.3所示。
图3.3 为Add_BUTTON按钮设置消息映射在弹出的“Add Member Function "对话框中(图3.4),指定函数名字(如OnAddButton);单击“OK”按钮。
按此法为其余的每个命令按钮分别指定一个成员函数;本例中给每个按钮鼠标单击消息指定的关联成员函数名分别如下面的表2所示。
图3.4 为Add_BUTTON按钮设置的成员函数名(OnAddButton)表2. 每个命令按钮的名称、鼠标单击消息关联的成员函数名按钮的功能描述按钮的名称按钮鼠标单击消息关联的成员函数名添加学生Add_BUTTON OnAddButton退出程序Exit_BUTTON OnExitButton查找指定学号学生并输出Search_BUTTON1 OnSchearButton1查找总分最高学生输出Search_BUTTON2 OnSchearButton2查找总分最低学生输出Search_BUTTON3 OnSchearButton3删除指定学号学生全部信息Delete_BUTTON OnDeleteButton至此,程序界面基本上已经设置好。
用户可以运行程序,即可看到图3.5所示的程序界面;但是用户单击界面上的任何按钮时,程序不能执行任何功能,那是因为我们还没有写一句程序代码。
接下来的事情将是为程序写代码(即程序语句)。
图3.5 程序运行时的界面为了下一步写程序的方便,我们需要记住界面上控件的一些关键信息。
为清楚起见,在此已将这些关键信息列于了前面的表1~表2中:表1是每个编辑框的名字、对应关联变量名、关联变量的数据类型;表2是每个命令按钮的名字、鼠标单击消息所关联的成员函数名。
4. 编写程序代码现在,单击开发环境界面左半窗下面的“FileView”标签,再双击“Source Files”下面的文件名“123Dlg.cpp”(对话框的源文件,dlg是“对话框”的英文单词缩写),即可看到系统自动生成了每个消息的关联成员函数的框架代码(如图4.4)。
编程人员要做的事就是在相应函数体内填写所需要的程序代码;当然,用户还得事先为整个程序的“123.cpp”源文件以及“123.h”头文件写一些代码。
下面给出一些主要代码,供参考,尤其要通过关键代码的注释内容理解关键语句的功能。
图4.1对话框源文件123Dlg.cpp的初始内容4.1 头文件123.h (其内容是定义一个描述学生信息的“类”:c123)以下只给出该文件自己写的那些代码,而系统生成的代码在此省略。
#include <string> // 添加包含字符处理库函数的头文件---此句加在文件最前面………//这里略去的是系统自动生成的代码// 以下类定义添加在文件原有内容的末尾class c123//要求类名的命名规则为"C+你的学号"){protected: // 数据成员变量的访问权限设置为保护型,类外不能直接访问int Number; //学生学号int Chinese, Math, English; //语文、数学、英语三科成绩float Total, Average; //三科的总分、平均分char Name[20]; //学生姓名public: //成员函数的访问权限设置为公开型,类外可以调用它们c123(int Num, char *pc, int Eng, int Chi, int Mat); // 构造函数的声明c123( ); // 默认构造函数的声明(没有形式参数的构造函数)// 本程序将构造函数的实现代码写到了类外(参见另一个源文件123.cpp)// 本程序将类的其余成员函数实现代码都直接写在类里面(参见本文件下面)// 以下为设置成员变量值的函数,均以setXXX形式命名void setNum(int x) // 设置“学号”变量的值{ Number=x; }void setName(char *pc) // 设置“姓名”变量的值{ strcpy(Name, pc); }void setChi(int x) // 设置“语文”变量的值{ Chinese=x; }void setMat(int x) // 设置“数学”变量的值{ Math=x; }void setEng(int x) // 设置“英语”变量的值{ English=x; }// 以下为读取成员变量值的函数,均以getXXX形式命名int getNum( ) // 读取“学号”变量的值{ return Number; }char *getName( ) // 读取“姓名”变量的值{ return Name; }int getChi( ) // 读取“语文”变量的值{ return Chinese; }int getMat( ) // 读取“数学”变量的值{ return Math; }int getEng( ) // 读取“英语”变量的值{return English; }int getTotal( ) // 读取“总分”变量的值{ return (English+Chinese+Math); } // “总分”靠计算得出int getAverage( ) // 读取“平均分”变量的值{ return (English+Chinese+Math)/3; } // “平均分”靠计算得出}; // 类定义结束,注意魔末尾有分号4.2 源文件123.cpp (对类c123的构造函数进行实现)#include "stdafx.h"//VC++程序要包含这个文件,而且要先包含#include "123.h" //"123.h"头文件放在(#include "stdafx.h")的后面#include "string" // 添加包含字符处理库函数的头文件//类c123的构造函数c123( )实现c123::c123(int Num, char *pc, int Eng, int Chi, int Mat){ Number=Num; //给c123类成员变量Number赋值(即设置"学号"数据)strcpy(Name, pc); //字符串不能直接赋值,要调用C++库函数strcpy()进行复制English=Eng; //给类c123的English成员变量赋值(即设置"英语"课成绩)Chinese=Chi; //给类c123的Chinese成员变量赋值(即设置"语文"课成绩)Math=Mat; //给类c123的Math成员变量赋值(即设置"数学"课成绩)Total=Eng+Chi+Mat; //总分Total的值是算出来的Average=(Eng+Chi+Mat)/3; //平均分average的值也是算出来的}//类c123的默认构造函数c123( )实现c123::c123( ) //(没有形式参数,也没有函数体语句){ }4.3 源文件123Dlg.cpp中按钮单击消息对应的成员函数功能实现#include "stdafx.h"#include "123.h"#include "123Dlg.h"//以下为自己添加的预处理语句--------#include <fstream> //文件输入、输出流类对象的使用#include <string> //字符处理库函数的使用using namespace std;//以下为自己添加的全局变量(普通变量1个、对象变量2个,对象数组1个)定义语句int i = -1; //用i用于存储对象数组中实际元素的个数ifstream fin("a.txt"); //用ifstream定义一个输入文件对象fin (类似于标准输入对象cin) ofstream fout("b.txt"); //用ofstream定义一个输出文件对象fout(类似于标准输出对象cout) c123 MyObj[100]; //定义类c123的100个对象, 即对象数组MyObj[]// …………此处省略的是系统自动生成的其它代码(不要改动)//-------------------------------------以下为消息映射函数自己添加的代码-------------------------- void CMy123Dlg::OnAddButton( )//添加学生信息{// TODO: Add your control notification handler code herechar c[50];i ++;UpdateData(TRUE); // 最关键语句,记住其功能:将控件中的数据传递给相应的关联变量:m_1,m_2等MyObj[i].setNum(m_1);strcpy(c, m_2);MyObj[i].setName(c);MyObj[i].setChi(m_3);MyObj[i].setMat(m_4);MyObj[i].setEng(m_5);}void CMy123Dlg::OnDeleteButton( ) //删除学生信息{// TODO: Add your control notification handler code hereUpdateData(TRUE); //将控件中的数据传递给相应的关联变量,主要是为了使m_9得到第9个Edit框里面的内容);要删除的学号是m_9int n, k; //n做循环变量,k记录学号等于待查学号m_9的对象数组元素的下标k=-1; //给k初始化一个负数for (n=0;n<=i;n++)if (MyObj[n].getNum( )==m_9) k=n;if (k==-1)m_6="无此学号可删除";elsefor (n=k;n<=i-1;n++){MyObj[n].setName(MyObj[n+1].getName());MyObj[n].setNum(MyObj[n+1].getNum( ));MyObj[n].setChi(MyObj[n+1].getChi( ));MyObj[n].setMat(MyObj[n+1].getMat( ));MyObj[n].setEng(MyObj[n+1].getEng( ));}i--; //对象数组实际元素个数减1}void CMy123Dlg::OnExitButton( ) //退出程序{// TODO: Add your control notification handler code hereCDialog::OnOK( );}void CMy123Dlg::OnSchearButton1( ) //查找指定学号的学生{// TODO: Add your control notification handler code hereUpdateData(TRUE); //将Edit框中的数据传递给相应的关联变量,主要是为了使m_9得到第9个Edit框里面的内容;使m_9得到要删除的学号int n, k; //n做循环变量,k记录找到的对象数组元素的下标(找到的对象元素其学号等于待查学号m_8)k=-1; //给k初始化一个负数for (n=0;n<=i;n++)if (MyObj[n].getNum( )==m_9) k=n;if (k==-1)m_6="查无此学号";else{ m_6=MyObj[k].getName();m_7=MyObj[k].getTotal( );m_8=MyObj[k].getAverage( );}UpdateData(FALSE); //将关联变量值传递给相应的Edit框}void CMy123Dlg::OnSchearButton2( ) //查找最高分{// TODO: Add your control notification handler code hereint n, k; // n做循环变量, k记录最高分对应的数组元素的下标double max; // max记录最高分max=-1.0; // max应该初始化一个尽量小的数(小于最低分)for (n=0;n<=i;n++)if (MyObj[n].getTotal()>max){max=MyObj[n].getTotal( ); k=n;}m_6=MyObj[k].getName();m_7=MyObj[k].getTotal( );m_8=MyObj[k].getAverage( );UpdateData(FALSE); //将关联变量值传递给相应的Edit框}void CMy123Dlg::OnSchearButton3( )//查找最低分{// TODO: Add your control notification handler code hereint n, k; //n做循环变量, k记录最低分对应的数组元素的下标double min; //min记录最低分min=301; //min应该初始化一个尽量大的数(比全部满分的和还要大的数)for (n=0;n<=i;n++)if (MyObj[n].getTotal( )<min){min=MyObj[n].getTotal( ); k=n;}m_6=MyObj[k].getName();m_7=MyObj[k].getTotal( );m_8=MyObj[k].getAverage( );UpdateData(FALSE); //将关联变量值传递给相应的Edit框}void CMy123Dlg::OnButton1( ) //从文件读取数据{// TODO: Add your control notification handler code herechar c[40];int n=0;while(1){fin>>m_1;fin>>c; //fin不能直接对字符串型对象变量m_2输入m_2=c; //可以将字符串直接赋给字符串型对象变量m_2fin>>m_3;fin>>m_4;fin>>m_5;if (strlen(c)>0){ MyObj[n].setNum(m_1);MyObj[n].setName(c);MyObj[n].setChi(m_3);MyObj[n].setMat(m_4);MyObj[n].setEng(m_5);UpdateData(FALSE); //将关联变量值传递给相应的Edit框n++;}elsebreak;};i=n-1; //最后一个对象元素的下标记录到i变量中}void CMy123Dlg::OnButton2( ) //将对象数组全部元素的数据输出到文件{// TODO: Add your control notification handler code hereint n;char *p;for (n=0;n<=i;n++) //全局变量i值记录了对象数组最后一个元素的下标{ m_1=MyObj[n].getNum();p=MyObj[n].getName();m_3=MyObj[n].getChi();m_4=MyObj[n].getMat();m_5=MyObj[n].getEng();fout<<m_1<<'\t'<<p<<'\t'<<m_3<<'\t'<<m_4<<'\t'<<m_5<<endl;//向文件中输出一组数据}}。