基于VC的MFC计算器案例步骤及源代码

严重受不了那些下载需要积分豆豆什么的!!!

本人做了一个一个计算器上交报告,拿出来分享分享!!!

基于VC的MFC计算器案例步骤及源代码

基于VC的MFC计算器案例详细步骤有图有代码,图中右边的各个函数也都能实现:清除,加,减,乘,除,倒数,e的x次方,以e为底x的对数,10的x次方,以10为底x的对数,余弦,反余弦,双曲余弦值,正弦,反正弦,双曲弦值,正切,反正切,双曲正切x的y次方,2的x次方,n(n为整数)的阶乘。如图:

 步骤:

1.创建一个基于对话框的应用程序(这一步应该都会吧!),命名为dckCalculator;

2.打开资源视图->点击“dckCalculator”左边的“+”->点击“dckCalculator.rc”左边的“+”->点击“Dialog”左边的“+”->双击“IDD_DCKCALCULATOR_DIALOG”->去除“确定”“取消”“TODO: 在此放置对话框控件。”几个组件(全选。然后右击选择“删除”即可):

3.按照我们想要的效果给对话框添加组件->编辑各个组件的显示名字->改变其ID属性

4.将编辑框的属性中的Align Text设置为right,如图:

 

5.设置相关属性(每次改变ID都要保存一下)

控件

Caption(名称)

ID

控件

caption

ID

按钮

0

IDC_BUTTON0

按钮

exp

IDC_EXP

按钮

1

IDC_BUTTON1

按钮

10^x

IDC_10X

按钮

2

IDC_BUTTON2

按钮

cos

IDC_COS

按钮

3

IDC_BUTTON3

按钮

sin

IDC_SIN

按钮

4

IDC_BUTTON4

按钮

ln

IDC_LN

按钮

5

IDC_BUTTON5

按钮

log

IDC_LOG

按钮

6

IDC_BUTTON6

按钮

arccos

IDC_ARCCOS

按钮

7

IDC_BUTTON7

按钮

arcsin

IDC_ARCSIN

按钮

8

IDC_BUTTON8

按钮

tan

IDC_TAN

按钮

9

IDC_BUTTON9

按钮

arctan

IDC_ARCTAN

按钮

+/-

IDC_BUTTON_SIGN

按钮

cosh

IDC_COSH

按钮

.

IDC_BUTTON_POINT

按钮

sinh

IDC_SINH

按钮

+

IDC_BUTTON_ADD

按钮

tanh

IDC_TANH

按钮

-

IDC_BUTTON_MINUS

按钮

X^y

IDC_XDEY

按钮

*

IDC_BUTTON_MUTIPLY

按钮

2^x

IDC_2DEX

按钮

/

IDC_BUTTON_DIV

按钮

N!

IDC_NJIECHENG

按钮

C

IDC_BUTTON_CLEAR

单选

弧度

IDC_HUDU

按钮

sqrt

IDC_BUTTON_SQRT

单选

角度

IDC_JIAODU

按钮

1/x

IDC_BUTTON_RECI

编辑框

编辑框

IDC_DISPLAY(只读)

按钮

=

IDC_BUTTON_EQUAL

 

 

 

6.将编辑框中属性的“read only”设置为ture!

7.在类视图中给CdckCalculatorDlg类添加成员变量:

int m_duType;初始值为0,用来作为判定弧度还是角度的变准;

double m_first;//存储一次运算的第一个操作数及一次运算的结果

double m_second;//存储一次运算的第二个操作数

CString m_operator;//存储运算符

double m_coff;//存储小数点的系数权值

8.给编辑框添加关联变量:(右击编辑框->添加变量)

CString m_display;//编辑框IDC_DISPLAY的关联变量,显示计算结果(注意最右边选择“value”)

9.双击“弧度”给其添加事件响应(等价于右击然后添加事件处理器);

同理双击“角度”添加代码:

//弧度处理函数

void CdckCalculatorDlg::OnBnClickedHudu()

{

m_duType=0;//系统默认m_duType为,这里为刚好可以为计算器默认为弧度计算

}

//角度处理函数

void CdckCalculatorDlg::OnBnClickedJiaodu()

{

m_duType=1;//当选择角度处理函数的时候,m_duType为;这哥主要是作为以后函数算法的判断标准

}


10.在对话框类的构造函数中,初始化成员变量

// CdckCalculatorDlg 对话框的构造函数

CdckCalculatorDlg::CdckCalculatorDlg(CWnd* pParent /*=NULL*/)

: CDialog(CdckCalculatorDlg::IDD, pParent)

, m_duType(0)

, m_first(0.0)

, m_second(0.0)

, m_operator(_T("+"))

, m_coff(0)

, m_display(_T("0.0"))

     ······

 

11.类视图里手动为对话框添加2个函数:

void  UpdateDisplay(double dck)——用于编辑框显示数据

Void Calculate(void)——用于计算结果  

代码如下(由于在代码中要用到fabs,要在CdckCalculatorDlg.cpp里添加一个库:#include "math.h"):

//在编辑框中显示数据

void CdckCalculatorDlg::UpdateDisplay(double dck)

{

m_display.Format(_T("%f"),dck);

int i=m_display.GetLength();

while(m_display.GetAt(i-1)=='0'//格式化输出,将输出结果后的零截去

{  m_display.Delete(i-1,1);  i--; }

UpdateData(false);//更新编辑框变量m_display

}

//计算结果

void CdckCalculatorDlg::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;

m_operator=_T("+");

UpdateDisplay(m_first);//更新编辑框显示内容

}

12.如上添加函数void  onButtonN(int n);以便数字按钮调用响应

//用于数字按钮调用

void CdckCalculatorDlg::onButtonN(int n)

{if( m_coff == 1.0)

m_second = m_second*10 + n;//作为整数输入数字时

else  

{ m_second = m_second + n*m_coff; //作为小数输入数字

m_coff *= 0.1;}

UpdateDisplay(m_second);//更新编辑框的数字显示

}

13.双击各个数字按钮,添加响应,调用函数:如:

void CdckCalculatorDlg::OnBnClickedButton0()

{

onButtonN(0);

}

void CdckCalculatorDlg::OnBnClickedButton1()

{

onButtonN(1);

}······

14.为各个运算符号添加事件处理器:

//   "+/-"

void CdckCalculatorDlg::OnBnClickedButtonSign()

{

m_second = -m_second;

UpdateDisplay(m_second);

}

//   "."

void CdckCalculatorDlg::OnBnClickedButtonPoint()

{

m_coff= 0.1 ;

}

//   "+"

void CdckCalculatorDlg::OnBnClickedButtonAdd()

{

Calculate();

m_operator="+"// - *方法类似

}

//   "/"

void CdckCalculatorDlg::OnBnClickedButtonDiv()

{

Calculate();

m_operator.Format(_T("%s"),"/");

}

//   "C"

void CdckCalculatorDlg::OnBnClickedButtonClear()

{

m_first=0.0;

m_second=0.0;

m_operator = "+";

m_coff = 1.0;

UpdateDisplay(0.0);

}

//   "sqrt"

void CdckCalculatorDlg::OnBnClickedButtonSqrt()

{

if( m_second==0)

{    m_first=sqrt(m_first);      

UpdateDisplay(m_first);   }

else

{ m_second=sqrt(m_second);    

UpdateDisplay(m_second);}

}

//   "1/x"

void CdckCalculatorDlg::OnBnClickedButtonReci()

{

if(fabs(m_second)<0.000001 && fabs(m_first)<0.000001)

{m_display = "除数不能为零";

UpdateData(false);

return;}

if( fabs(m_second)<0.000001)

{    m_first=1.0/m_first;

UpdateDisplay(m_first);

}

else

{ m_second=1.0/m_second;

UpdateDisplay(m_second);

}

}

//   "="

void CdckCalculatorDlg::OnBnClickedButtonEqual()

{

Calculate(); 

}

15.同理添加其他特殊函数按钮事件处理器,其中大部分在API里math类里都有定义好了的 可以直接用的函数,当然有几个是自己写的如(n!和x^y而且第二个比较棘手),然后还有一个问题就是,里面的函数括号里面跟的值是弧度,而不是角度,这就需要我们去判断了,也就是说m_duType终于派上用场了,只要switch,m_duType,case得到0即默认的为弧度,case1 则值为角度,然后转换值赋给我们需要的显示出来:还是如上手动添加一个函数:void  sanjiaoHanshu()

但是此时我们还需要PI,但是我们不能直接得到所以在这之前我们需要添加成员变量m_PI,并赋予初值m_PI=3.14159265358979323846;代码如下:/ 用来抉择结果,是弧度还是角度

void CdckCalculatorDlg::sanjiaoHanshu(void)

{

switch(m_duType)

{case 0:

m_second=m_second;

break;

case 1:

m_second=m_second*m_PI/180;

break;

}

}

16.编辑其他函数的代码:

//   "exp"

void CdckCalculatorDlg::OnBnClickedExp()

{

m_second=exp(m_second);

UpdateDisplay(m_second);

}

//   "10^x"

void CdckCalculatorDlg::OnBnClicked10x()

{

m_second=pow(10,m_second);

UpdateDisplay(m_second);

}

//   "cos"

void CdckCalculatorDlg::OnBnClickedCos()

{

sanjiaoHanshu();

m_second=cos(m_second);

UpdateDisplay(m_second);

}

//   "sin"

void CdckCalculatorDlg::OnBnClickedSin()

{

sanjiaoHanshu();

m_second=sin(m_second);

UpdateDisplay(m_second);

}

//   "ln"

void CdckCalculatorDlg::OnBnClickedLn()

{

m_second=log(m_second);

UpdateDisplay(m_second);

}

//   "log"

void CdckCalculatorDlg::OnBnClickedLog()

{

m_second=log10(m_second);

UpdateDisplay(m_second);

}

//   "arccos"

void CdckCalculatorDlg::OnBnClickedArccos()

{

sanjiaoHanshu();

m_second=acos(m_second);

UpdateDisplay(m_second);

 

}

//   "arcsin"

void CdckCalculatorDlg::OnBnClickedArcsin()

{

sanjiaoHanshu();

m_second=asin(m_second);

UpdateDisplay(m_second);

}

//   "tan"

void CdckCalculatorDlg::OnBnClickedTan()

{

sanjiaoHanshu();

m_second=tan(m_second);

UpdateDisplay(m_second);

}

//   "arctan"

void CdckCalculatorDlg::OnBnClickedArctan()

{

sanjiaoHanshu();

m_second=atan(m_second);

UpdateDisplay(m_second);

}

//   "cosh"

void CdckCalculatorDlg::OnBnClickedCosh()

{

sanjiaoHanshu();

m_second=cosh(m_second);

UpdateDisplay(m_second);

}

//   "sinh"

void CdckCalculatorDlg::OnBnClickedSinh()

{m_second=sinh(m_second);

UpdateDisplay(m_second);

}

//   "tanh"

void CdckCalculatorDlg::OnBnClickedTanh()

{

sanjiaoHanshu();

m_second=tanh(m_second);

UpdateDisplay(m_second);

}

//   "2^x"

void CdckCalculatorDlg::OnBnClicked2dex()

{

m_second=pow(2,m_second);

UpdateDisplay(m_second);

}

 

17.现在来看x^y 我们需要先得到  然后点击x^y按钮后再得到y,在点击“=”按钮后得到结果:步骤:如上添加变量 bool型 isXY

默认为false,再添加一个中间变量 double temp;当点击按钮的时候我们将编辑框显示的结果赋值给temp,然后将m_second设置为0.0,编辑框显示为0.0,设置isXYture如下代码:

//   "x^y"

void CdckCalculatorDlg::OnBnClickedXdey()

{

temp=m_second;

m_second=0.0;

UpdateDisplay(0.0);

isXY=true;

}

 

(再输入新数据,然后再按“=”,所以在=之前我们需要对x^y做出判断 如果按了则isXYture,则我们将上面的数字记下然后参与计算,如果为false就不算:)

添加一个函数void  xDEy()

//用来判断是否点击了“x^y”按钮,点击了后又作何运算

void CdckCalculatorDlg::xDEy(void)

{

if(isXY){

m_second=m_second;

m_second=pow(temp,m_second);

}

}

然后在每次等于之前都调用一下这个函数,如果点击了x^y按钮则执行里面的代码,所以“=”的代码需要修改一下:

//   "="

void CdckCalculatorDlg::OnBnClickedButtonEqual()

{

xDEy();

Calculate(); 

}

 

18.n的阶乘:我们需要利用递归,如上添加函数int  jiecheng(int n)

利用递归,返回阶乘值,代码如下:

int CdckCalculatorDlg::jiecheng(int n)

{

if(n==0||n==1){

return 1;

}else if(n>1){

return n*fun(n-1);

}

}

在n!的按钮消息处理里,如果输入的不是整数则不能进行阶乘运算:

//   "n!"

void CdckCalculatorDlg::OnBnClickedNjiecheng()

{

if((m_second-(int)m_second)>0){

m_display =_T("你输入的不是整数,请输入整数!");

UpdateData(false);//如果是非整数,则结束运算,重新开始

return;

}

else {

m_second=(double)jiecheng(m_second);

UpdateDisplay(m_second);

}

}

 

19.所有按钮事件处理已经完成,编译运行:

自我检测,所有功能都能正确运行!完成!!!
 
 

<!--EndFragment-->
  • 8
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
实现鼠标左键长按有鼠标拖尾效果的步骤如下: 1. 首先,在 MFC 应用程序的资源文件中,添加一个透明的鼠标指针图片,用于模拟鼠标拖尾的效果。 2. 在 MFC 应用程序的类视图中,双击要添加鼠标拖尾效果的控件,比如 CDialog 对话框,打开对应的类的头文件。 3. 在头文件中添加一个 BOOL 类型的变量,用于标记鼠标左键是否处于长按状态,例如: ``` BOOL m_bLButtonDown = FALSE; ``` 4. 在头文件中添加一个 CPoint 类型的变量,用于保存鼠标当前的坐标,例如: ``` CPoint m_ptCurrent; ``` 5. 在类的头文件中添加一个计时器 ID,例如: ``` #define TIMER_ID 1 ``` 6. 在类的头文件中添加一个函数 OnTimer,用于处理计时器事件,例如: ``` void OnTimer(UINT nIDEvent); ``` 7. 在类的头文件中添加一个变量,用于保存计时器的时间间隔,例如: ``` int m_nTimerInterval = 50; ``` 8. 在类的头文件中添加一个变量,用于保存鼠标拖尾的长度,例如: ``` int m_nTailLength = 10; ``` 9. 在类的头文件中添加一个变量,用于保存鼠标拖尾的颜色,例如: ``` COLORREF m_crTailColor = RGB(255, 0, 0); ``` 10. 在类的头文件中添加一个函数 DrawTail,用于绘制鼠标拖尾,例如: ``` void DrawTail(CDC* pDC); ``` 11. 在类的头文件中添加一个变量,用于保存透明的鼠标指针图片的句柄,例如: ``` HICON m_hIconTail; ``` 12. 在类的头文件中添加一个函数 LoadIcon,用于加载透明的鼠标指针图片,例如: ``` void LoadIcon(); ``` 13. 在类的头文件中添加一个变量,用于保存透明的鼠标指针图片的大小,例如: ``` CSize m_sizeIcon; ``` 14. 在类的头文件中添加一个函数 OnLButtonDown,用于处理鼠标左键按下事件,例如: ``` void OnLButtonDown(UINT nFlags, CPoint point); ``` 15. 在类的头文件中添加一个函数 OnLButtonUp,用于处理鼠标左键抬起事件,例如: ``` void OnLButtonUp(UINT nFlags, CPoint point); ``` 16. 在类的头文件中添加一个函数 OnMouseMove,用于处理鼠标移动事件,例如: ``` void OnMouseMove(UINT nFlags, CPoint point); ``` 17. 在类的源文件中实现 LoadIcon 函数,用于加载透明的鼠标指针图片,例如: ``` void CMyDialog::LoadIcon() { m_hIconTail = AfxGetApp()->LoadIcon(IDI_TAIL); ICONINFO iconInfo; GetIconInfo(m_hIconTail, &iconInfo); m_sizeIcon.cx = iconInfo.xHotspot * 2; m_sizeIcon.cy = iconInfo.yHotspot * 2; } ``` 18. 在类的源文件中实现 OnLButtonDown 函数,用于处理鼠标左键按下事件,例如: ``` void CMyDialog::OnLButtonDown(UINT nFlags, CPoint point) { m_bLButtonDown = TRUE; m_ptCurrent = point; SetTimer(TIMER_ID, m_nTimerInterval, NULL); CDialog::OnLButtonDown(nFlags, point); } ``` 19. 在类的源文件中实现 OnLButtonUp 函数,用于处理鼠标左键抬起事件,例如: ``` void CMyDialog::OnLButtonUp(UINT nFlags, CPoint point) { m_bLButtonDown = FALSE; KillTimer(TIMER_ID); CDialog::OnLButtonUp(nFlags, point); } ``` 20. 在类的源文件中实现 OnMouseMove 函数,用于处理鼠标移动事件,例如: ``` void CMyDialog::OnMouseMove(UINT nFlags, CPoint point) { if (m_bLButtonDown) { m_ptCurrent = point; } CDialog::OnMouseMove(nFlags, point); } ``` 21. 在类的源文件中实现 OnTimer 函数,用于处理计时器事件,例如: ``` void CMyDialog::OnTimer(UINT nIDEvent) { if (nIDEvent == TIMER_ID) { Invalidate(); } CDialog::OnTimer(nIDEvent); } ``` 22. 在类的源文件中实现 DrawTail 函数,用于绘制鼠标拖尾,例如: ``` void CMyDialog::DrawTail(CDC* pDC) { CDC dcMem; dcMem.CreateCompatibleDC(pDC); CBitmap bmpMem; bmpMem.CreateCompatibleBitmap(pDC, m_sizeIcon.cx, m_sizeIcon.cy); CBitmap* pOldBitmap = dcMem.SelectObject(&bmpMem); dcMem.FillSolidRect(0, 0, m_sizeIcon.cx, m_sizeIcon.cy, RGB(255, 255, 255)); dcMem.DrawIcon(0, 0, m_hIconTail); dcMem.SelectObject(pOldBitmap); dcMem.DeleteDC(); for (int i = 1; i <= m_nTailLength; i++) { CPen pen(PS_SOLID, i * 2, m_crTailColor); CPen* pOldPen = pDC->SelectObject(&pen); pDC->MoveTo(m_ptCurrent.x - i, m_ptCurrent.y - i); pDC->LineTo(m_ptCurrent.x + i, m_ptCurrent.y + i); pDC->MoveTo(m_ptCurrent.x - i, m_ptCurrent.y + i); pDC->LineTo(m_ptCurrent.x + i, m_ptCurrent.y - i); pDC->SelectObject(pOldPen); } } ``` 23. 在类的源文件中实现 OnPaint 函数,用于绘制控件内容,例如: ``` void CMyDialog::OnPaint() { CPaintDC dc(this); if (m_bLButtonDown) { DrawTail(&dc); } } ``` 24. 最后,在类的 OnInitDialog 函数中调用 LoadIcon 函数,以加载透明的鼠标指针图片,例如: ``` BOOL CMyDialog::OnInitDialog() { CDialog::OnInitDialog(); LoadIcon(); return TRUE; } ``` 以上就是实现鼠标左键长按有鼠标拖尾效果的全部步骤和代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值