📄 calculatordlg.cpp
字号:
// CalculatorDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Calculator.h"
#include "CalculatorDlg.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCalculatorDlg dialog
CCalculatorDlg::CCalculatorDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCalculatorDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCalculatorDlg)
m_number = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
NumberState=1;m_number="";Radix=10;
}
void CCalculatorDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCalculatorDlg)
DDX_Text(pDX, IDC_EDIT_PUTOUT, m_number);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCalculatorDlg, CDialog)
//{{AFX_MSG_MAP(CCalculatorDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
ON_COMMAND_RANGE(IDC_NUMBER1,IDC_NUMBERF,OnNumberKey)
ON_COMMAND_RANGE(IDC_NUMBER_Sqrt,IDC_NUMBER_Clear,OnOperationKey)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCalculatorDlg message handlers
BOOL CCalculatorDlg::OnInitDialog()
{
CDialog::OnInitDialog();
Zero=TRUE;
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
}
void CCalculatorDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CCalculatorDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CCalculatorDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CCalculatorDlg::OnNumberKey(UINT nID)
{
CString n="";
switch(nID)
{
case IDC_NUMBER1:n="1";break;
case IDC_NUMBER2:n="2";break;
case IDC_NUMBER3:n="3";break;
case IDC_NUMBER4:n="4";break;
case IDC_NUMBER5:n="5";break;
case IDC_NUMBER6:n="6";break;
case IDC_NUMBER7:n="7";break;
case IDC_NUMBER8:n="8";break;
case IDC_NUMBER9:n="9";break;
case IDC_NUMBER0:n="0";break;
case IDC_NUMBERA:n="a";break;
case IDC_NUMBERB:n="b";break;
case IDC_NUMBERC:n="c";break;
case IDC_NUMBERD:n="d";break;
case IDC_NUMBERE:n="e";break;
case IDC_NUMBERF:n="f";break;
case IDC_NUMBER_Point:if(m_number.Find('.')==-1)n=".";
else n="";
break;
}
if(Zero==FALSE)
{
Zero=TRUE;
GetDlgItem(IDC_NUMBER0)->EnableWindow(TRUE);
}
if(NumberState==1)
{
m_number+=n;
number1=atof(m_number);
UpdateData(FALSE);
}
else
{
m_number+=n;
number2=atof(m_number);
UpdateData(FALSE);
}
}
void CCalculatorDlg::OnOperationKey(UINT nID)//响应操作键按下
{
int temp=1,i,j;
char buffer[20];
switch(nID)
{
case IDC_NUMBER_PlusMinus: if(NumberState==1)
{
number1=-number1;
m_number.Format("%g",number1);
}
else
{
number2=-number2;
m_number.Format("%g",number2);
}
UpdateData(FALSE);
break;
case IDC_NUMBER_BackSpace: i=m_number.GetLength();
m_number=m_number.Left(i-1);
UpdateData(FALSE);
break;
case IDC_NUMBER_Divide: cal();//如果是连续计算
if(Zero=TRUE)
{
GetDlgItem(IDC_NUMBER0)->EnableWindow(FALSE);
Zero=FALSE;
}
OperationState=1;
m_number="";
NumberState=2;
break;
case IDC_NUMBER_Multiply: cal();//如果是连续计算
OperationState=2;
m_number="";
NumberState=2;
break;
case IDC_NUMBER_Add: cal();
OperationState=3;
m_number="";
NumberState=2;
break;
case IDC_NUMBER_Subtract: cal();//如果是连续计算
OperationState=4;
m_number="";
NumberState=2;
break;
case IDC_NUMBER_Clear:
number1=number2=0;
m_number="";
UpdateData(FALSE);
NumberState=1;
break;
case IDC_NUMBER_Sqrt:
number1=sqrt(number1);
m_number.Format("%g",number1);
UpdateData(FALSE);
break;
case IDC_NUMBER_Derivative:
number1=(double)1/number1;
m_number.Format("%g",number1);
UpdateData(FALSE);
break;
case IDC_NUMBER_Equal:
cal();//计算derivateive
break;
case IDC_NUMBER_SIN:
number1=sin(number1);
m_number.Format("%g",number1);
UpdateData(FALSE);
break;
case IDC_NUMBER_COS:
number1=cos(number1);
m_number.Format("%g",number1);
UpdateData(FALSE);
break;
case IDC_NUMBER_TAN:
number1=tan(number1);
m_number.Format("%g",number1);
UpdateData(FALSE);
break;
case IDC_NUMBER_Square:
m_number.Format("%g",pow(number1,2));
UpdateData(FALSE);
break;
case IDC_NUMBER_Cube:
m_number.Format("%g",pow(number1,3));
UpdateData(FALSE);
break;
case IDC_NUMBER_Nn: cal();
OperationState=5;
m_number="";
NumberState=2;
break;
case IDC_NUMBER_Factorial:
for(i=1;i<=number1;i++)
temp*=i;
number1=temp;
m_number.Format("%g",number1);
UpdateData(FALSE);
break;
case IDC_NUMBER_LOG:
m_number.Format("%g",log10(number1));
UpdateData(FALSE);
break;
case IDC_NUMBER_Percent:
cal();
OperationState=6;
m_number="";
NumberState=2;
break;
case IDC_Binary:
for(j=1002;j<=1030;j++)
GetDlgItem(j)->EnableWindow(FALSE);
GetDlgItem(1010)->EnableWindow(TRUE);
GetDlgItem(1020)->EnableWindow(TRUE);
number1=TransToDec(atoi(m_number),Radix);
itoa((UINT)number1,buffer,2);
m_number=buffer;
Radix=2;
UpdateData(FALSE);
break;
case IDC_Decimal:
for(j=1002;j<=1030;j++)
GetDlgItem(j)->EnableWindow(TRUE);
number1=TransToDec(atoi(m_number),Radix);
Radix=10;
itoa((UINT)number1,buffer,10);
m_number=buffer;
UpdateData(FALSE);
break;
case IDC_Hexa:
for(j=1012;j<=1017;j++)
GetDlgItem(j)->EnableWindow(TRUE);
for(j=1018;j<=1030;j++)
GetDlgItem(j)->EnableWindow(FALSE);
GetDlgItem(1020)->EnableWindow(TRUE);
number1=TransToDec(atoi(m_number),Radix);
Radix=16;
itoa((UINT)number1,buffer,16);
m_number=buffer;
UpdateData(FALSE);
break;
case IDC_Octal:
for(j=1002;j<=1007;j++)
GetDlgItem(j)->EnableWindow(TRUE);
for(j=1008;j<=1030;j++)
GetDlgItem(j)->EnableWindow(FALSE);
GetDlgItem(1010)->EnableWindow(TRUE);
GetDlgItem(1020)->EnableWindow(TRUE);
number1=TransToDec(atoi(m_number),Radix);
Radix=8;
itoa((UINT)number1,buffer,8);
m_number=buffer;
UpdateData(FALSE);
break;
}
}
void CCalculatorDlg::cal()
{
char buf[20];
switch(OperationState)
{
case 1:if(number1==(int)number1&&number2==(int)number2)
{
number1=TransToDec((int)number1,Radix);
number2=TransToDec((int)number2,Radix);
itoa((int)(number1/number2),buf,Radix);
m_number=buf;
NumberState=1;
UpdateData(FALSE);
break;
}
else
m_number.Format("%g",number1/number2);
NumberState=1;
UpdateData(FALSE);
break;
case 2:if(number1==(int)number1&&number2==(int)number2)
{
number1=TransToDec((int)number1,Radix);
number2=TransToDec((int)number2,Radix);
itoa((int)(number1*number2),buf,Radix);
m_number=buf;
NumberState=1;
UpdateData(FALSE);
break;
}
else
m_number.Format("%g",number1*number2);
NumberState=1;
UpdateData(FALSE);
break;
case 3:
if(number1==(int)number1&&number2==(int)number2)
{
number1=TransToDec((int)number1,Radix);
number2=TransToDec((int)number2,Radix);
itoa((int)(number1+number2),buf,Radix);
m_number=buf;
NumberState=1;
UpdateData(FALSE);
break;
}
else
m_number.Format("%g",number1+number2);
NumberState=1;
UpdateData(FALSE);
break;
case 4:if(number1==(int)number1&&number2==(int)number2)
{
number1=TransToDec((int)number1,Radix);
number2=TransToDec((int)number2,Radix);
itoa((int)(number1-number2),buf,Radix);
m_number=buf;
NumberState=1;
UpdateData(FALSE);
break;
}
else
m_number.Format("%g",number1-number2);
NumberState=1;
UpdateData(FALSE);
break;
case 5:
m_number.Format("%g",pow(number1,number2));
UpdateData(FALSE);
break;
case 6:
m_number.Format("%g",number1*number2/100.0);
NumberState=1;
UpdateData(FALSE);
break;
}
number1=atof(m_number);
OperationState=0;
}
void CCalculatorDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));
CDialog::OnLButtonDown(nFlags, point);
}
void CCalculatorDlg::OnOK()
{}
BOOL CCalculatorDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
return TRUE;
return CDialog::PreTranslateMessage(pMsg);
}
//将二、八、十六进制转换成十进制,但是如果十六进制数中含有字母,则
//在显示中会将字符省略,造成数据不正确
int CCalculatorDlg::TransToDec(UINT nNum,int base)
{
int i=0,bin[20],temp=1;
int x=0;
while(nNum)
{
i++;
bin[i]=nNum%10;
nNum=nNum/10;
}
for(int j=1;j<=i;j++)
{
temp=int(pow(base,j-1));
x=x+temp*bin[j];
}
return x;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -