第8章(4) 进制转换计算器-y_第1页
第8章(4) 进制转换计算器-y_第2页
第8章(4) 进制转换计算器-y_第3页
第8章(4) 进制转换计算器-y_第4页
第8章(4) 进制转换计算器-y_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章对话框和控件(4)

本讲主要内容1.单选按钮控件2.复选框控件整数计算器采用十进制整数进行运算,除此之外整数还有十六进制、八进制和二进制表示方式,Windows系统的计算器就具有该功能。本节将参照其功能,实现十进制与八进制之间的相互转换,并从中学习单选按钮和复选框控件的使用方法8.5.1单选按钮控件单选按钮由一个圆圈和文本标签组合而成,当它被选中时,圆圈中就标上一个黑点。单选按钮通常是分组使用,同一组的单选按钮具有互斥性,即某一单选按钮被选中会清除同组内其他单选按钮的选中状态。通过勾选某一单选按钮RadioButtonProperties对话框中General选项卡的Group选项,标识某一组单选按钮的开始。【例8-8】进制转换计算器。能够完成10进制和8进制整数之间的转换。在实现功能之前,首先需要考虑整数的不同进制如何转换?对于一个整数,无论是十进制还是八进制都只是在显示方式上有所区分,其本质仍然是同一个数值。操作步骤:(1)打开IntegerCalculator工程,添加2个单选按钮,如下图所示,其ID值分别为IDC_RADIODEC和IDC_RADIOOCT。(2)选中IDC_RADIODEC控件Properties中General选项卡中Group选项。(3)打开ClassWizard的MemberVariables选项卡,为IDC_RADIODEC添加关联变量m_nChoice,并在CIntegerCalculatorDlg类的构造函数中将其初始值改为0,表示10进制为默认选项。(4)打开ClassWizard的MessageMaps选项卡,为IDC_RADIODEC和IDC_RADIOOCT添加BN_CLICKED消息,生成OnRadiodec()和OnRadiooct()函数,并添加如下代码:voidCIntegerCalculatorDlg::OnRadiodec(){ //通过ID得到按钮控件对象的指针 CButton*p8=((CButton*)GetDlgItem(IDC_B8));

p8->EnableWindow(TRUE); //使按钮可用

CButton*p9=((CButton*)GetDlgItem(IDC_B9)); p9->EnableWindow(TRUE); transform(); //进制转换}其中GetDlgItem()函数的功能是根据控件ID获取对话框中控件的句柄,其函数声明为:CWnd*GetDlgItem(intnID)const;其中nID为控件的ID值。而EnableWindow()函数是CWnd类的成员函数,功能是使窗口允许或禁止,其函数声明为:BOOLEnableWindow(BOOLbEnable=TRUE);其中bEnable为TRUE,则窗口被允许,为FALSE,则窗口将被禁止。(5)编写transform()函数,在IntegerCalculatorDlg.h文件中添加函数声明voidtransform();,在IntegerCalculatorDlg.cpp文件中添加如下代码。voidCIntegerCalculatorDlg::transform(){ UpdateData(TRUE); //获得数据

if(m_nChoice==0) //10进制单选按钮被选中

m_nValue=octToDec(m_nValue); //将8进制转换为10进制

else //8进制单选按钮被选中

{ chars8[30]; itoa(m_nValue,s8,8); //将10进制转换为8进制

m_nValue=atoi(s8); } UpdateData(FALSE); //更新界面,显示转换后结果}octToDec()函数为自定义函数,功能是将8进制数值转换为10进制数值同样10进制转换为8进制,读者也可以参照这个思路编写一个转换函数,但为了让读者能够更多地学习知识点,采用系统中存在函数进行转换。itoa()函数的功能是将整数转换为字符串,其原型为:char

*itoa(int

value,char

*string,int

radix);其中参数含义为:value:待转换整数。string:转换后字符串指针radix:转换基数,可以是2进制、8进制、10进制和16进制。(5)编写transform()函数,在IntegerCalculatorDlg.h文件中添加函数声明voidtransform();,在IntegerCalculatorDlg.cpp文件中添加如下代码。voidCIntegerCalculatorDlg::transform(){ UpdateData(TRUE); //获得数据

if(m_nChoice==0) //10进制单选按钮被选中

m_nValue=octToDec(m_nValue); //将8进制转换为10进制

else //8进制单选按钮被选中

{ chars8[30]; itoa(m_nValue,s8,8); //将10进制转换为8进制

m_nValue=atoi(s8); } UpdateData(FALSE); //更新界面,显示转换后结果}atoi()函数的功能是将字符串转换为整数,转换过程为跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。其函数原型为:intatoi(constchar*nptr);其中参数含义为:nptr:待转换字符串。其中octToDec()函数为自定义函数,功能是将八进制数值转换为十进制数值,函数代码如下:intCIntegerCalculatorDlg::octToDec(intvalue){

intresult=0; //结果变量

intnum=0; //次幂变量

while(value!=0) { intlow=value%10; //取个位数

intmul=1;

for(inti=0;i<num;i++) //该位数为8的num次幂

mul*=8; result=result+low*mul; //累加结果

num++; value=value/10; //去掉个位数

} returnresult; //返回计算结果}(6)修改计算过程,在OnBequal()函数做如下修改:voidCIntegerCalculatorDlg::OnBequal(){ …… m_nOperand2=m_nValue;

if(m_nChoice==1) //如果是8进制

{ m_nOperand1=octToDec(m_nOperand1);//将运算数转换为10进制

m_nOperand2=octToDec(m_nOperand2); } switch(m_nOperator){ …… }

if(m_nChoice==1) //如果是8进制

{ chars8[30]; itoa(m_nValue,s8,8); //将计算结果以8进制显示

m_nValue=atoi(s8); } ……}(7)编译、链接、运行。8.5.2复选框按钮 为了实现进制功能的开启与关闭,采用复选框控件作为切换控件。标准的复选框在文本标签旁边有一个方框,当该选项被选中时,方框内出现一个“√”号,当该项未被选中时,方框内空白。【例8-9】在例8-8基础上,完成带进制功能控制的整数计算器。(1)打开IntegerCalculator工程,添加复选框控件IDC_CHECKCHOICE。(2)打开ClassWizard的MessageMaps选项卡,为IDC_CHECKCHOICE添加BN_CLICKED消息,生成OnCheckchoice()函数。(3)在OnCheckchoice()函数中添加如下代码:

voidCIntegerCalculatorDlg::OnCheckchoice(){

CButton*pHex=((CButton*)GetDlgItem(IDC_CHECKHEX)); //如果复选框选中

if(BST_CHECKED==pHex->GetCheck()) { CButton*pDec=((CButton*)GetDlgItem(IDC_RADIODEC)); pDec->EnableWindow(TRUE); CButton*pOct=((CButton*)GetDlgItem(IDC_RADIOOCT)); pOct->EnableWindow(TRUE); }GetCheck()函数的功能是获得复选框的选中状态,其函数声明为:intGetCheck()const;其返回值为0:按钮处于未选中状态。1:按钮处于选中状态。2:按钮状态不定(仅当按钮风格为BS_3STATE或BS_AUTO3STATE时)如果按钮是其它风格,则返回0。为了代码清晰,系统为其做了宏定义:#defineBST_UNCHECKED0x0000#defineBST_CHECKED0x0001#defineBST_INDETERMINATE0x0002

else { CButton*pDec=((CButton*)GetDlgItem(IDC_RADIODEC)); pDec->EnableWindow(FALSE); CButton*pOct=((CButton*)GetDlgItem(IDC_RADIOOCT)); pOct->EnableWindow(FALSE); }}(4)为了使对话框在初始运行时保持正常状态,需在OnInitDialog()函数中添加如下代码:BOOLCIntegerCalculatorDlg::OnInitDialog(){ …… SetIcon(m_hIcon,FALSE); //Setsmallicon

CButton*pDec=((CButton*)GetDlgItem(IDC_RADIODEC)); pDec->EnableWindow(FALSE); CButton*pOct=((CButton*)GetDlgItem(IDC_RADIOOCT)); pOct->EnableWindow(FALSE); ……}(5)编译、链接、运行。8.5.3补充案例【例8-10】

世界杯知识小测验 该测验包括3道题目,两道单选题,一道多选题,单选题选项采用单选按钮控件实现,多选题选项采用复选框控件实现。编程步骤:(1)创建基于对话框的Survey工程。(2)删除对话框中原有的“确定”、“取消”按钮和静态文本控件,然后添加4个单选按钮控件、3个复选框控件、4个静态文本控件和1个按钮,并修改Caption。(3)修改控件ID,单选按钮控件ID依次为IDC_EURO、IDC_AFRI、IDC_SPAIN、IDC_HOLLAND,复选框控件ID依次为IDC_ITALY、IDC_FRANCE、IDC_BRAZIL,按钮控件ID为IDC_SUBMIT。(4)修改控件的TabOrder,单击菜单Layout|TabOrder命令,通过鼠标点击修改为下图所示顺序。(5)将控件IDC_EURO和IDC_SPAIN的General选项卡中Group选项选中。(6)修改对话框Caption为“世界杯知识小测验”。(7)为控件添加关联变量,如下图所示。(8)为按钮控件IDC_SUBMIT添加消息响应函数,单击菜单V

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论