版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章对话框与常用控件掌握Button、EditBox和StaticText控件的创建和使用方法掌握基于对话框的应用程序的编程技术掌握模式对话框、非模式对话框和通用对话框的设计与调用教学目标《VisualC++程序设计》电子教案----王明福编教学内容MyCalculator程序演示开发MyCalculator程序口令对话框通用对话框
常用控件介绍
§4.1
MyCalculator程序
返回目录
程序运行结果
程序运行演示§4.2开发MyCalculator程序4.2.1创建工程4.2.2可视化设计4.2.3为编辑框IDC_DISPLAY引入变量4.2.4为CMyCalculatorDlg类添加数据成员4.2.5为BUTTON按钮的BN_CLICKED事件添加响应函数4.2.6编写程序代码4.2.7技术要点4.2.8程序优化返回目录
4.2.1创建工程
返回创建MyCalculator工程的步骤:(1)启动VisualC++6.0。从“File”菜单中选择“New”;
(2)在New对话框中选择“Project”标签
,然后指定工程类型MFCAppWizard[exe]、工程名MyCalculator和工程位置D:\MyVC;
(3)点击“OK”按钮,弹出MFCAppWizard-Step1对话框。选择“Dialogbased”单选按钮,创建一个基于对话框的应用程序;
(4)单击“Finish”
按钮。此时Visualc++6.0将显示NewProjectInformation窗口;(5)单击“OK”
按钮。于是,VisualC++6.0就会创建MyCalculator工程以及相关的所有文件。
4.2.2可视化设计
可视化设计,就用VC++自带的工具软件Winzards,制作计算器程序界面。即添加计算器中的数字、运算符等按钮和数字显示编辑框。控件的两个要素:ID标识符和Caption文本返回
4.2.3为编辑框IDC_DISPLAY引入变量
为了能够在程序运行过程中,将输入的数据和计算的结果在编辑框上显示,必须为它引入一个变量,从而能够使编辑框以变量的形式出现在程序中。利用函数UpdateData(true)或UpdateData(false)就可达到目的。在MFCClassWizard对话框中,选择“MemberVariable”标签为IDC_DISPLAY编辑框引入变量:CStringm_display;返回
4.2.4为CMyCalculatorDlg类添加数据成员为了实现计算器功能,我们需要向CMyCalculatorDlg类(即MyCalculatorDlg.h文件中)添加变量。变量属性和用途如下表。数据类型数据变量名称数据的作用doublem_first存储一次运算的第一个数以及一次运算的结果doublem_second存储一次运算的第二个数doublem_coff存储小数点的系数权值CStringm_operator存储运算操作符返回
4.2.5为Button按钮的BN_CLICKED事件添加响应函数
用MFCClassWizard为对话框IDD_MYCALCULATOR_DIALOG中的所有Button按钮的BN_CLICKED事件添加处理函数,如表4-3所示。
ObjectIDsMessagesMemberFunctionsIDC_BUTTON1BN_CLICKEDOnOnButton1()………………IDC_BUTTON9BN_CLICKEDOnOnButton9()IDC_BUTTON_POINTBN_CLICKEDOnButtonPoint()IDC_BUTTON_SIGNBN_CLICKEDOnButtonSign()IDC_BUTTON_ADD
BN_CLICKEDOnButtonAdd()
IDC_BUTTON_MINUS
BN_CLICKEDOnButtonMinus()
IDC_BUTTON_MUTIPLY
BN_CLICKEDOnButtonMutiply()
………………返回
4.2.6编写程序代码1.为数字“N”按钮的消息响应函数添加代码。算法设计如下:(1)作为整数输入数字N时(N=0,—9):m_second=m_second*10+N;(2)作为小数输入数字N时(N=0,—9):m_second=m_second+N*m_coff;m_coff*=0.1;voidCMyCalculatorDlg::OnButton8(){ if(m_coff==1.0)//作为整数输入
m_second=m_second*10+8; else//作为小数输入 {m_second=m_second+8*m_coff; m_coff*=0.1; }
UpdateDisplay(m_second);//更新编辑框的数据显示}完全类似,请读者为其它数字按钮的消息响应函数添加代码。
返回
2.为运算符(+、-、*、/)按钮的消息响应函数添加代码
算法描述:(1)m_first与m_second作m_operator运算后m_first;(2)0m_second;(3)m_firstm_display(显示)(4)用当前点击的运算符
m_operator;(5)将小数的权值变量m_coff置1.0复位。
以点击“+”运算符为例,在消息响应函数中编写如下代码。voidCMyCalculatorDlg::OnButtonAdd(){Calculate();m_operator="+";}voidCMyCalculatorDlg::Calculate(void){switch(m_operator.GetAt(0)){ case'+':m_first+=m_second;break; case'-':m_first-=m_second;break; case'*':m_first*=m_second;break; case'/':if(fabs(m_second)<=0.000001) {m_display="除数不能为零";
UpdateData(false);return; } m_first/=m_second;break;} m_second=0.0; m_coff=1.0;
UpdateDisplay(m_first);//更新编辑框的显示内容}voidCMyCalculatorDlg::UpdateDisplay(doublelVal){ m_display.Format(_T("%f"),lVal);
inti=m_display.GetLength(); //格式化输出,将输出结果后的零全部截去
while(m_display.GetAt(i-1)=='0') {m_display.Delete(i-1,1);i--;}
UpdateData(false);//更新显示编辑框变量m_display}其它运算类似,留给读者自已完成。
3.为等号“=”按钮消息响应函数添加代码
算法设计:(1)m_first与m_second作m_operator运算后m_first;(2)m_firstm_display(显示)(3)0m_second;(4)0=>m_first(5)将小数的权值变量m_coff置1.0。(6)输入的运算符
m_operator;
voidCMyCalculatorDlg::OnButtonEqual(){Calculate(); m_first=0.0;m_operator="+";}
4.在OnButtonSqrt()函数中,编写代码
voidCMyCalculatorDlg::OnButtonSqrt(){m_second=sqrt(m_second);
UpdateDisplay(m_second);}
5.为“C”和“1/X”按钮的消息响应函数编写代码
voidCMyCalculatorDlg::OnButtonClear(){m_first=0.0; m_second=0.0; m_operator="+";m_coff=1.0;
UpdateDisplay(0.0);}voidCMyCalculatorDlg::OnButtonReciprocal(){ if(fabs(m_second)<0.000001) {m_display="除数不能为零";
UpdateData(false);return; }
m_second=1.0/m_second;
UpdateDisplay(m_second); }
6.为“+/-”“.”按钮的消息响应函数编写代码
//“.”按钮的消息响应函数voidCMyCalculatorDlg::OnButtonPoint(){m_coff =0.1;
}//“+/-”按钮的消息响应函数voidCMyCalculatorDlg::OnButtonSign(){m_second=-m_second;
UpdateDisplay(m_second);}
返回
4.2.7技术要点——UpdateData函数①UpdateData函数是CDialog的基类CWnd的成员函数;②函数原型如下:BOOLUpdateData(BOOLbSaveAndValidate=TRUE);③一般在对话框的派生类中,利用UpdateData函数进行控件和相应变量之间的数据传递,形式如下:UpdateData(TRUE);//将控件中的数据传递给相应的变量UpdateData(FALSE)//将变量中的数据传递给相应的控件,即显示返回
4.2.7技术要点——关于消息响应函数用MFCClassWizard为对话框中某按钮的BN_CLICKED事件添加消息处理函数时,MFCClassWizard为我们做了三件事:(1)在类的定义MyCalculatorDlg.h文件中,添加了消息响应函数的函数原型;(2)在类的实现文件MyCalculatorDlg.cpp中,添加了函数体;(3)在类的实现文件MyCalculatorDlg.cpp中,添加了消息映射。所以,如果想删除通过ClassWizard创建的消息响应函数,在MFCClassWizard对话框中,选中要删除的函数,单击“Deletefunction”按钮将函数删除。但是源文件中相应的函数体并没有删除,需要手工方法将函数体删除。
4.2.7技术要点——字符串CString类
CString类的对象由一个长度可变的字符序列组成,包含很多成员函数用来操作字符串,可以很方便地实现对字符串的各种操作。CString类中的字符是TCHAR类型的。(1)构造函数CString();//产生一个空的CString对象CString(constCString&stringSrc);//用另一个CString对象的值初始化对象CString(TCHARch,intnRepeat=1);//用一个字符重复若干次初始化对象CString(LPCTSTRlpch,intnLength);//用一个字符数组的指定长度初始化对象CString(constunsignedchar*psz);//从一个无符号字符指针初始化对象CString(LPCWSTRlpsz);//从一个Unicode字符串初始化对象CString(LPCSTRlpsz);//从一个ANSI字符串初始化对象返回
4.2.8优化MyCalculator程序
ON_COMMAND_RANGE使用一个消息处理函数来处理对某个ID范围内所有控件的命令响应,该宏的原型为:
ON_COMMAND_RANGE(ID1,ID2,memberFxn);
其中ID1是控件ID的起始值;ID2是控件ID的结束值;memberFxn为消息响应函数。用OnOperandInput处理数字按钮“0”〜“9”的消息响应函数的方法是:(1)手工添加函数声明,也就是在MyCalculatorDlg.h中“{{AFX_MSG(CMyCalculatorDlg)”与“}}AFX_MSG”之间,添加下面的语句:
afx_msgvoidOnOperandInput(UINTnID);(2)在MyCalculatorDlg.cpp文件中“{{AFX_MSG_MAP(CMyCalculatorDlg)”与“}}AFX_MSG_MAP”之间,加入下面语句:ON_COMMAND_RANGE(IDC_BUTTON0,IDC_BUTTON9,OnOperandInput);返回§4.3口令对话框4.3.1预备知识4.3.2编辑口令对话框资源4.3.3创建口令对话框类4.3.4为口令编辑框引入变量4.3.5调用口令对话框4.3.6显示非模式对话框返回目录
模式对话框与非模式对话框
返回*所谓模式对话框,是指打开后直至关闭均不可在应用程序其它位置工作的对话框。比较典型的模式对话框有“打开”、“保存”等对话框。*所谓非模式对话框,是指打开仍可切换到应用程序其它位置工作的对话框。比较典型的非模式对话框的一个例子DeveloperStudio的查找和替换对话框。
设计和使用对话框的方法如下:(1)创建对话框资源,并添加各种所需的控件。(2)创建对话框类(CDialog)的派生类,并将其与已创建的对话框资源相连接。(3)在创建的派生类中添加所需的数据成员变量、数据交换函数(DDX)和数据验证函数(DDV)。(4)为对话框中各控件添加所需的消息响应函数,并编写程序代码。(5)为对话框的调用者添加对话框的调用。对话框的设计方法返回假设被调用对话框资源的ID为:IDD_PASSWORD_DIALOG,创建的对话框类名为:CPasswordDialog
,则(1)调用模态对话框CPasswordDialogm_Dlg;//声明CPasswordDialog类的一个对象m_Dlgm_Dlg.DoModal();//显示模态对话框(2)调用非模态对话框1)在视图类的头文件中添加CPasswordDialog的指针变量:CPasswordDialog*m_Dlg;2)在视图类的构造函数中将其初始化:m_Dlg=NULL;3)在调用函数中添加如下代码调用if(m_Dlg==NULL){m_Dlg=newCPasswordDialog;m_Dlg->Create(IDD_PASSWORD_DIALOG,this);} m_Dlg->ShowWindow(SW_SHOW);//显示非模态对话框对话框的调用返回
4.3.2编辑口令对话框资源
1.创建对话框资源 参照第2章中2.3.2节的方法,在MyHello工程中,新建一个ID(标识符)为“IDD_PASSWORD_DIALOG”、Caption为“口令”的对话框资源
2.编辑对话框资源
返回
4.3.3创建口令对话框类
返回为IDD_PASSWORD_DIALOG对话框创建一个新类。操作步骤如下:(1)在IDD_PASSWORD_DIALOG对话框资源上单击鼠标右键,在弹出的快捷菜单中选择ClassWizard(或双击对话框,或通过菜单View/ClassWizard),弹出MFCClassWizard对话框。在MFCClassWizard对话框弹出后紧接着弹出AddingClass对话框。(2)在AddingClass对话框中确认墨认选择Createanewclass,单击“OK”按钮,弹出NewClass对话框。(3)在Name编辑框中输入新建类名CPasswordDialog,其它取墨认值。
4.3.4为口令编辑框引入变量返回为IDC_PASSWORD_EDIT编辑框引入变量的步骤如下:(1)在View菜单中选择ClassWizard菜单项。(2)在MFCClassWizard对话框中,选择”MemberVariable”标签,作如下选择:Classname:CPasswordDialog
ControlIDs:IDC_PASSWORD_EDIT(3)单击“AddVariable”按钮,此时,VisualC++6.0将显示一个AddMemberVariable对话框,设置如下:Variablename:m_passwordCategory:ValueVariabletype:Cstring(4)单击AddMemberVariable对话框的“OK”按钮,返回到MFCClassWizard对话框,再单击MFCClassWizard对话框的“OK”按钮。于是,VisualC++6.0就为编辑框IDC_PASSWORD_EDIT引入变量m_password。
4.3.5调用口令对话框返回在应用程序类的InitInstance()函数中编写调用口令对话框代码。1.修改InitInstance()函数BOOLCMyHelloApp::InitInstance(){…… m_pMainWnd->UpdateWindow();
CPasswordDialogDlg;//声明CpasswordDialog类的对象
if(Dlg.DoModal()!=IDOK)returnfalse;
if(Dlg.m_password!="123456")//口令设为字符串"123456" {AfxMessageBox(“口令错误,…");returnfalse;} returnTRUE;}2.在MyHello.cpp的头部,加入下面的包含语句:#include"PasswordDialog.h"
4.3.6显示非模式对话框返回请读者按以下要求编辑一菜单:ID:ID_NOMODALLESS;Caption:非模式对话框。
显示非模式对话框操作步骤如下:1.在视图类中添加对话框成员指针classCMyHelloView:publicCview{……public:
CPasswordDialog*m_pModallessDlg;……};在MyHelloView.h中加入:#include"PasswordDialog.h"返回2.修改视类的构造函数和析构函数
分别在视类的构造函数和析构函数中添加如下代码:CMyHelloView::CMyHelloView(){……
m_pModallessDlg=NULL;//初始化指针}
CMyHelloView::~CMyHelloView(){if(m_pModallessDlg!=NULL) deletem_pModallessDlg;//释放空间}返回3.编写调用非模式对话框代码(1)利用MFCClassWizard,为菜单ID_NOMODALLESS添加了消息响应函数OnNomodalless()。(2)定位在OnNomodalless()函数,编写如下显示非模式对话框代码:voidCMyHelloView::OnNomodalless(){if(m_pModallessDlg==NULL
{m_pModallessDlg=newCPasswordDialog; m_pModallessDlg->Create(IDD_PASSWORD_DIALOG,this);}m_pModallessDlg->ShowWindow(SW_SHOW);}
4.4通用对话框
在应用程序设计中,除使用自定义的对话框之外,经常用到系统定义的通用对话框类。通用对话框类用于
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四川电影电视学院《表演基础训练》2021-2022学年第一学期期末试卷
- 石河子大学《园林树木学》2022-2023学年第一学期期末试卷
- 石河子大学《水利工程施工与组织》2022-2023学年第一学期期末试卷
- 石河子大学《临床药物动力学》2022-2023学年第一学期期末试卷
- 石河子大学《管理文秘》2023-2024学年第一学期期末试卷
- 石河子大学《教学简笔画》2022-2023学年第一学期期末试卷
- 沈阳理工大学《伺服电机及控制》2022-2023学年期末试卷
- 沈阳理工大学《面向对象程序设计(Java)》2021-2022学年期末试卷
- 沈阳理工大学《机械工程材料及其加工工艺》2021-2022学年第一学期期末试卷
- 沈阳理工大学《翻译批评与赏析》2022-2023学年第一学期期末试卷
- 建设工程监理费计算器(免费)
- 利用家长资源建构班级竹文化 论文
- 生活垃圾分类课件-垃圾分类
- 预防校园欺凌、预防校园性侵告家长书
- 软件系统项目监理报告
- 建筑工程施工检测试验计划
- 喝牛奶问题课件
- 社会学概论课件十四讲社会问题
- AAA级安全文明标准化工地创建方案
- 2023年多媒体应用设计师真题题库总结
- 测电阻的多种方法(修改)
评论
0/150
提交评论