《进制转换计算器.ppt》由会员分享,可在线阅读,更多相关《进制转换计算器.ppt(31页珍藏版)》请在三一办公上搜索。
1、1,第11讲 进制转换计算器,2,3,本讲主要内容,1.单选按钮控件2.复选框控件,4,1.单选按钮控件,单选按钮时一个圆圈和文本标签组合,当它被选中时,圆圈中就标上一个黑点。单选按钮通常是分组使用,同一组的单选按钮具有互斥性,即某一单选按钮被选中会清除同组内其他单选按钮的选中状态。通过将某一单选按钮Properties中General选项卡中勾选Group标识某一组开始,直到下一个Group标识出现,其顺序是Tab键顺序(单击菜单Layout|Tab Order命令)。,5,1.单选按钮控件,操作步骤:(1)打开Integer Calculator工程,添加2个单选按钮,如下图所示,其ID值
2、分别为IDC_RADIODEC和IDC_RADIOOCT。,6,2.单选按钮控件,(2)选中IDC_RADIODEC控件Properties中General选项卡中Group选项。(3)打开ClassWizard的Member Variables选项卡,为IDC_RADIODEC添加关联变量m_nHex,如下图所示,并在CIntegerCalculatorDlg类的构造函数中将其初始值改为0,表示10进制为默认选项。,7,1.单选按钮控件,8,1.单选按钮控件,(4)为打开ClassWizard的Message Maps选项卡,为IDC_RADIODEC和IDC_RADIOOCT添加BN_CL
3、ICKED消息,生成OnRadiodec()和OnRadiooct()函数,并添加如下代码:,9,1.单选按钮控件,void CIntegerCalculatorDlg:OnRadiodec()CButton*p8=(CButton*)GetDlgItem(IDC_B8);/通过ID得到按钮控件对象的指针p8-EnableWindow(TRUE);/使按钮可用CButton*p9=(CButton*)GetDlgItem(IDC_B9);p9-EnableWindow(TRUE);transform();/进制转换,其中GetDlgItem()函数的功能是根据控件ID获取对话框中控件的句柄,其
4、函数声明为:CWnd*GetDlgItem(int nID)const;其中nID为控件的ID值。,而EnableWindow()函数是CWnd类的成员函数,功能是使窗口允许或禁止,其函数声明为:BOOL EnableWindow(BOOL bEnable=TRUE);其中bEnable为TRUE,则窗口被允许,为FALSE,则窗口将被禁止。,10,void CDialog10Dlg:OnRadiooct()/TODO:Add your control notification handler code hereCButton*p8=(CButton*)GetDlgItem(IDC_B8);/
5、通过ID得到按钮控件对象的指针p8-EnableWindow(FALSE);/使按钮不可用CButton*p9=(CButton*)GetDlgItem(IDC_B9);p9-EnableWindow(FALSE);transform();/进制转换,11,1.单选按钮控件,(5)编写transform()函数,在IntegerCalculatorDlg.h文件中添加函数声明void transform();,在IntegerCalculatorDlg.cpp文件中添加如下代码。void CIntegerCalculatorDlg:transform()UpdateData(TRUE);/获得
6、数据if(m_nHex=0)/10进制单选按钮被选中m_nValue=octToDec(m_nValue);/将8进制转换为10进制else/8进制单选按钮被选中char s830;itoa(m_nValue,s8,8);/将10进制转换为8进制m_nValue=atoi(s8);UpdateData(FALSE);/更新界面,显示转换后结果,octToDec()函数为自定义函数,功能是将8进制数值转换为10进制数值,同样10进制转换为8进制,我们也可以参照上面的思路编写一个转换函数,也可以采用现有的库函数进行转换。,itoa()函数的功能是将整数转换为字符串,其原型为:char*itoa(i
7、nt value,char*string,int radix);其中参数含义为:value:待转换整数。string:转换后字符串指针radix:转换基数,可以是2进制、8进制、10进制和16进制。,atoi()函数的功能是将字符串转换为整数,转换过称谓跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时(/0)才结束转换,并将结果返回。其函数原型为:int atoi(const char*nptr);其中参数含义为:nptr:待转换字符串。,12,1.单选按钮控件,其中octToDec()函数为自定义函数,功能是将10进制数值转换为8进制数值,函数代码如下:i
8、nt CIntegerCalculatorDlg:octToDec(int value)int result=0;/结果变量int num=0;/次幂变量while(value!=0)int low=value%10;/取个位数int mul=1;for(int i=0;inum;i+)/该位数为8的num次幂mul*=8;result=result+low*mul;/累加结果num+;value=value/10;/去掉个位数return result;/返回计算结果,13,1.单选按钮控件,(6)修改计算过程,在OnBequal()函数做如下修改:void CIntegerCalculat
9、orDlg:OnBequal()m_nOperand2=m_nValue;if(m_nHex=1)/如果是8进制m_nOperand1=octToDec(m_nOperand1);/将运算数转换为10进制m_nOperand2=octToDec(m_nOperand2);switch(m_nOperator)if(m_nHex=1)/如果是8进制char s830;itoa(m_nValue,s8,8);/将计算结果以8进制显示m_nValue=atoi(s8);,14,2.复选框按钮,为了实现进制功能的开启与关闭,我们采用复选框控件作为切换控件。标准的复选框在文本标签旁边有一个方框,当该选项
10、被选中时,方框内出现一个“”号,当该项未被选中时,方框内空白。,15,2.复选框按钮,添加复选框的操作步骤:(1)打开Integer Calculator工程,添加复选框控件IDC_CHECKHEX。,16,2.复选框按钮,(2)打开ClassWizard的Message Maps选项卡,为IDC_ CHECKHEX添加BN_CLICKED消息,生成OnCheckhex()函数。,17,2.复选框按钮,(3)在OnCheckhex()函数中添加如下代码:void CIntegerCalculatorDlg:OnCheckhex()CButton*pHex=(CButton*)GetDlgIte
11、m(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()函数的功能是获得复选框的选中状态,其函数声明为:int GetCheck()const;其返回值为0:按钮处于未选中状态。1:按钮处于选中状态。2:按钮状态不定(仅当按钮风格为BS_
12、3STATE或BS_AUTO3STATE时)如果按钮是其它风格,则返回0。为了代码清晰,系统为其做了宏定义:#define BST_UNCHECKED 0 x0000#define BST_CHECKED 0 x0001#define BST_INDETERMINATE 0 x0002,18,2.复选框按钮,(3)在OnCheckhex()函数中添加如下代码:elseCButton*pDec=(CButton*)GetDlgItem(IDC_RADIODEC);pDec-EnableWindow(FALSE);CButton*pOct=(CButton*)GetDlgItem(IDC_RADI
13、OOCT);pOct-EnableWindow(FALSE);,19,2.复选框按钮,(4)为了使对话框在初始运行时保持正常状态,需在OnInitDialog()函数中添加如下代码:BOOL CIntegerCalculatorDlg:OnInitDialog()SetIcon(m_hIcon,FALSE);/Set small iconCButton*pDec=(CButton*)GetDlgItem(IDC_RADIODEC);pDec-EnableWindow(FALSE);CButton*pOct=(CButton*)GetDlgItem(IDC_RADIOOCT);pOct-Enab
14、leWindow(FALSE);,20,2.复选框按钮,(5)编译、链接、运行。,21,3.补充案例,【例7-9】世界杯知识小测验该问卷调查包括3道题目,两道单选题,一道多选题,单选题选项采用单选按钮控件实现,多选题选项采用复选框控件实现。,22,3.补充案例,实现步骤:(1)创建基于对话框的Survey工程。(2)删除对话框中原有的“确定”、“取消”按钮和静态文本控件,然后添加4个单选按钮控件、3个复选框控件、4个静态文本控件和1个按钮,并修改Caption。,23,3.补充案例,(3)修改控件ID,单选按钮控件ID依次为IDC_EURO、IDC_AFRI、IDC_SPAIN、IDC_HOL
15、LAND,复选框控件ID依次为IDC_ITALY、IDC_FRANCE、IDC_BRAZIL,按钮控件ID为IDC_SUBMIT。,24,3.补充案例,(4)修改控件的Tab Order,单击菜单Layout|Tab Order命令,通过鼠标点击修改为下图所示顺序。,25,3.补充案例,(5)将控件IDC_EURO和IDC_SPAIN的General选项卡中Group选项选中。(6)修改对话框Caption为“世界杯知识小测验”。(7)为控件添加关联变量,如下图所示。,26,3.补充案例,27,3.补充案例,(8)为按钮控件IDC_SUBMIT添加消息响应函数,单击菜单View|ClassWi
16、zard命令,在Message Maps选项卡中为IDC_SUBMIT按钮添加BN_CLICKED消息响应函数OnSubmit()。,28,3.补充案例,(9)在函数OnSubmit()中添加代码如下:void CSurveyDlg:OnSubmit()UpdateData(TRUE);/获得用户操作if(m_nHost=-1|m_nChampion=-1)/检查题目是否做完AfxMessageBox(题目未完成,请填写完整!);return;int nCount=0;/答对题目数量,29,3.补充案例,if(m_nHost=1)/第一题答案为非洲nCount+;if(m_nChampion=0)/第二题答案为西班牙nCount+;/第三题答案为意大利和法国if(m_bItaly=TRUE,30,3.补充案例,(10)编译、链接、运行。,31,作业,作业:1)习题7-06,7-09;,