好文档 - 专业文书写作范文服务资料分享网站

手把手教你MFC编程计算器

天下 分享 时间: 加入收藏 我要投稿 点赞

这里进行一个说明

m_num2=m_num2*10+1; 很多人会问这步是说明意思,这步乍看貌似有点一头雾水(当初我也是这样)但是仔细看看还是能看明白的。

比方说 用户想打出自然数“234”

用户第一次点的数字是2 那么此时对应代码执行是这段

m_num2=m_num2*10+2; 那么m_num2 = 0*10 +2 (初始化时m_num2 = 0)

之后如果在点击3的时候执行的代码是

m_num2=m_num2*10+3; (此时经过第一步m_num2已经为2了,再点了3 结果为m_num2= 2*10+3 = 23)

最后点击4 执行的代码是

m_num2=m_num2*10+4;(23*10 +4=234)

通过以上小例子 大家明白了吧~ 为什么要 “先乘以10 再加 数字”

////////////////////////////////////////////////////////////////////

总结,其实这次非主流计算器编写,(说是非主流,说白了就是有2个编辑框输入数字,人家XP只有1个编辑框

)。最大的障碍就是唯独是那个EN_SETFOCUS这个函数的

空白了。我只单存的百度到GetFocus()能获得焦点,但是其实问题远远并没有那么简单,涉及到很多问题。

我当初设置判断的时候还不知道用一个EN_SETFOCUS,并且初始化标记这个方法,过后才知道。我把之前的错误帖一下顺便是当作是一个警告

void CMyDlg::OnButton14Num0() {

// TODO: Add your control notification handler code here UpdateData(TRUE);

if( GetDlgItem(IDC_EDIT1)->GetFocus()) {

m_num1=m_num1*10+0; }

else if( GetDlgItem(IDC_EDIT2)->GetFocus()) {

m_num2=m_num2*10+0; }

UpdateData(FALSE); }

////////////////////////////// 分析

GetDlgItem()如果大家不熟悉的话 我可以先解释一下是获得编辑框

首先GetDlgItem(IDC_EDIT1)获取了ID为IDC_EDIT1也就是编辑框CEdit类的对象的指针,继承了CWnd类

函数GetFocus是CWnd中的静态函数,来看一下函数原型:static CWnd* PASCAL GetFocus( ); 返回值是CWnd* 类型的,也就是说如果当前对话框或是控件被focus,那么就返回这个对话框或控件的指针.我错误的在if语句中将这个指针返回值当作了判断条件,所以呢,如果指针为NULL则if不执行,否则if就会执行。因为CEdit是一个控件类,其父窗口是有的,就是计算器的主窗口。所以当程序运行的时候,无论是第一个编辑框被focus或是第二个编辑框被focus,只要主对话框被focus了,那么调用GetDlgItem(IDC_EDIT1)->GetFocus())还是调用GetDlgItem(IDC_EDIT2)->GetFocus())还是直接调用this->GetFocus()它们的返回值都是一样的,就是父对话框的指针。当然不为NULL,所以第一个if就会执行。所以就显示在第一个编辑框了。

手把手教你MFC编程计算器

这里进行一个说明m_num2=m_num2*10+1;很多人会问这步是说明意思,这步乍看貌似有点一头雾水(当初我也是这样)但是仔细看看还是能看明白的。比方说用户想打出自然数“234”用户第一次点的数字是2那么此时对应代码执行是这段m_num2=m_num2*10+2;那么m_num2=0*1
推荐度:
点击下载文档文档为doc格式
5ulmb0ep0y1wxgu8jpr7
领取福利

微信扫码领取福利

微信扫码分享