Cómo implementar una calculadora usando VC++6.0 MFC
DlgCalc.h
//DLG calc h: el archivo de encabezado principal de la aplicación DLG calc
//
# Si ! Definido(AFX_DLG calc_H__f 42970 C4_9047_11 D2_8e 53_006008 a 82731__INCLUDED_)
#Definición
AFX_DLG calc _ H _ _ f 42970 C4 _ 9047 _ 11 D2 _ 8e 53 _ 006008 a 82731 _ _ INCLUIDO _
# if _ MSC _ VER> 1000
#Nota varias una vez
# endif//_ MSC _ VER & gt; >
#ifndef __AFXWIN_H__
#Error: Contiene "antes de este archivo que contiene PCH stdafx.h"
#endif
#include "resource.h " //Símbolo principal
//////////// /////////////////////////// //////////////////////////// /////////////
// CDlgCalcApp:
//Para la implementación de esta categoría, consulte DlgCalc.cpp
//
Clase CDlgCalcApp: CWinApp pública
{
Público:
CDlgCalcApp();
//Override
// Anula la función virtual generada por ClassWizard
//{{AFX_VIRTUAL(CDlgCalcApp)
Público:
Virtual BOOL InitInstance();
//}}AFX_VIRTUAL p>
//Implementación
//{{AFX_MSG(CDlgCalcApp)
//}}AFX_MSG
Declarar asignación de mensajes()
};
/////////////// /////////////////////// //////////////////////////////// //////////
/ /{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ insertará la declaración adicional inmediatamente
// antes de la línea anterior.
#endif
// ! Definido (AFX _ DLG calc _ H _ _ f 42970 C4 _ 9047 _ 11 D2 _ 8e 53 _ 006008 a 82731 _ _ INCLUIDO _)
DlgCalc.cpp
// DlgCalc.cpp: Define el comportamiento de clase de la aplicación.
//
#Incluir " stdafx.h "
#Incluir " DlgCalc.h "
#Incluir " DlgCalcDlg.h "
#ifdef _DEBUG
#Definir nuevo DEBUG_NEW
#undef ESTE_FILE
carácter estático ESTE _ ARCHIVO[]= _ _ ARCHIVO _ _;
#endif
/////////////////////////////// / /////////////////////////////////////////////////
// CDlgCalcApp
BEGIN_MESSAGE_MAP(CDlgCalcApp,CWinApp)
//{{AFX_MSG_MAP(CDlgCalcApp)
//}}AFX_MSG
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
////////////////// //// //////////////////////////////////////////////// //////// ///
// Estructura de CDlgCalcApp
CDlgCalcApp::CDlgCalcApp()
{
}
/////////////////////////////////////////// //////////// //////////////////////////
//La única CDlgCalcApp objeto
CDlgCalcApp theApp
////////////////////////////////// //////////////// ///////////////////////////////
// Inicialización de CDlgCalcApp
BOOL CDlgCalcApp: :InitInstance()
{
CDlgCalcDlg dlg
m _ pMainWnd = & ampdlg
dlg.
DoModal();
Devolver FALSO
}
DlgCalcDlg.h
// DlgCalcDlg.h: archivo de encabezado
//
#¡Si! Definido(AFX_DLGCALCDLG_H__f 42970c6_9047_11D2_8e53_006008a 82731__INCLUDED_)
# define AFX_DLGCALCDLG_H__f 42970c 6 _ 9047 _ 11 D2 _ 8e 53 _ 006008 a 1 _ _INCLUIDO _
#if_MSC_VER>1000
#Nota varias una vez
# endif//_ MSC _ VER & gt; //////////////// /////////////////////////////////// ///////////////
// Cuadro de diálogo CDlgCalcDlg
Clase CDlgCalcDlg: CDialog público
{
//Construcción
Público:
visualización de actualización nula (visualización LPCTSTR PSZ);
CDlgCalcDlg(CWnd * p parent = NULL); /Constructor estándar
//Datos de conversación
//{{AFX_DATA(CDlgCalcDlg)
Enumeración { IDD = IDD _ DLG calc _ DIALOG }; p>
//Nota: ClassWizard agregará miembros de datos aquí
//}}AFX_DATA
// Reescritura de función virtual generada por ClassWizard
/ /{{AFX_VIRTUAL(CDlgCalcDlg
Público:
Virtual BOOL PreTranslateMessage(MSG * pMsg);
Protegido:
Virtual void DoDataExchange (intercambio CDATA * pDX); // soporte DDX/DDV
Virtual BOOL OnCommand(WPARAM wParam, LPARAM LPARAM);
//}}AFX_VIRTUAL
//Implementación
Protegido:
void drop stack();
void lift stack();
void display xregister() ;
pila doble m_dbl [4];
doble m_dblMemory
CString m_strDisplay
CString m_strFormat
CRect m_rect
p>int m _ cxChar
int m _ cyChar
BOOL m _ bFixPending
BOOL m _ bErrorFlag
BOOL m _ bDecimalInString
BOOL m _ bStackLiftEnabled
BOOL m _ bNewX
HICON m _ hIcon
HACCEL m _ hAccel
//Función de mapeo de mensajes generado
//{{AFX_MSG(CDlgCalcDlg)
Virtual BOOL OnInitDialog();< / p>
afx _ msg void OnPaint();
afx _ msg void en agregar();
afx _ msg void en restar(); p>afx _ msg void en multiplicar();
afx _ msg void en dividir();
afx _ msg void OnEnter(); _ msg void OnChangeSign();
afx _ msg void OnExponent();
afx _ msg void en la tienda();
afx _ msg void en recordar();
afx _ msg void en fix();
afx _ msg void en clear();
afx _ msg void en decimal ( );
afx _ msg void en eliminar();
//}}AFX_MSG
afx _ msg void en git(UINT nID);< / p>
Declarar mapa de mensajes()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ insertará el archivo adjunto inmediatamente Declaración
//antes de la línea anterior.
#endif
// !Defined(
//AFX _ DLGCALCDLG _ H _ _ f 42970 c 6 _ 9047 _ 11 D2 _ 8e 53 _ 006008 a 82731 _ _ INCLUIDO _)
DlgCalcDlg.cpp
// DlgCalcDlg.cpp: archivo de implementación
//
# Incluir " stdafx.h "
#Include " DlgCalc.h "
#Include " DlgCalcDlg.h "
#ifdef _DEBUG
#Definir nuevo DEBUG_NEW
#undef THIS_FILE
carácter estático THIS _ FILE[]= _ _ FILE _ _;
#endif
///////////////////////////////////////////////// / //////////////////////////////
// Cuadro de diálogo CDlgCalcDlg
CDlgCalcDlg: :CDlgCalcDlg(CWnd * p parent/* = NULL */)
:CDialog(CDlgCalcDlg::IDD, pParent)
{
// {{ Inicialización de datos AFX (CDlgCalcDlg)
//Nota: ClassWizard agregará la inicialización de miembros aquí
//}}AFX_DATA_INIT
m _ hIcon = AfxGetApp( ) -& gt; icono de carga(IDR _ MAINFRAME);
m _ HAC cel =::cargar aceleradores(AfxGetInstanceHandle(),
MAKEINTRESOURCE(ACCEL);
m _ bFixPending = FALSE
m _ bErrorFlag = FALSE
m _ bDecimalInString = FALSE
m _ bStackLiftEnabled = FALSE
m _ bNewX = TRUE
for(int I = 0;i<4;i++)
m _ dbl pila[I]= 0.0;
m _ dblMemory = 0.0
m _ str format = _ T(" % 0.2f ");
}
void CDlgCalcDlg::DoDataExchange(intercambio CDATA * pDX )
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgCalcDlg)
//Nota: ClassWizard agregará llamadas DDX y DDV aquí
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgCalcDlg, CDialog)
// {{AFX_MSG_MAP(CDlgCalcDlg)
ON_WM_PAINT()
ON_BN_CLICKED(IDC_ADD,OnAdd)
ON_BN_CLICKED(ID
C_SUBTRACT, OnSubtract)
ON_BN_CLICKED (IDC_MULTIPLY, OnMultiply)
ON_BN_CLICKED (IDC_DIVIDE, OnDivide)
ON_BN_CLICKED (IDC_ENTER, OnEnter)
ON_BN_CLICKED(IDC_CHGSIGN, OnChangeSign)
ON_BN_CLICKED(IDC_EXP, OnExponent)
ON_BN_CLICKED(IDC_STO, OnStore)
ON_BN_CLICKED(IDC_RCL, OnRecall)
ON_BN_CLICKED(IDC_FIX,OnFix)
ON_BN_CLICKED(IDC_CLX,OnClear)
ON_BN_CLICKED(IDC_DECIMAL,OnDecimal)
ON_BN_CLICKED(IDC_DEL,OnDelete)
//}}AFX_MSG_MAP
ON_CONTROL_RANGE (BN_CLICKED, IDC_0, IDC_9, OnDigit)
END_MESSAGE_MAP()
/////// /////////////////////////////////////////////////// //// //////////////////
// Controlador de mensajes CDlgCalcDlg
BOOL CDlgCalcDlg::OnInitDialog() p>
{
CDialog::OnInitDialog();
//
//Establece el icono de la aplicación.
//
SetIcon(m_hIcon, VERDADERO)
SetIcon(m_hIcon, FALSO);
//Elimine los comandos "Tamaño" y "Maximizar" del menú del sistema.
//
CMenu * pMenu = getsystem menu(FALSE);
pMenu->; DeleteMenu (SC_SIZE, MF _ por comando); >
pMenu->;DeleteMenu (SC_MAXIMIZE, MF_by comando);
//
//Inicializa m_rect con las coordenadas del control representado
//Ventana de salida de la calculadora. Luego control de daños.
//
CWnd * pWnd = GetDlgItem(IDC _ display rect);
pWnd-& gt;
pWnd->destroy window();
screento client(&m_rect);
//
//Inicializar m_cxChar y m_cyChar con ancho de carácter promedio
//y alto.
//
TEXTMETRIC tm
CClientDC dc(this);
Washington.
GetTextMetrics(&TM);
m _ cxChar = tm.tmAveCharWidth
m _ cy char = TM altura-TM descenso
. //
//Inicializa la ventana de salida de la calculadora y regresa.
//
displayx Register();
Devuelve TRUE
}
void CDlgCalcDlg::OnPaint ()
{
CPaintDC dc(este);
Washington. DrawEdge (m_rect, EDGE _ SUNKEN, BF _ RECT);
actualizar visualización (m _ strDisplay
}
BOOL CDlgCalcDlg::PreTranslateMessage(MSG); * pMsg)
{
if (m_hAccel!=null)
if(::translate accelerator(m_hWnd, m_hAccel, pMsg)) p>
Devolver VERDADERO
Devolver CDialog::PreTranslateMessage(pMsg);
}
BOOL CDlgCalcDlg::on comando(WPARAM WPARAM, LPARAM lParam )
{
int nID =(int)LOWORD(wParam);
if(m _ bErrorFlag & amp; & amp(nID!= IDC _ CLX) {
mensaje bip(MB _ icono asterisco);
Devuelve VERDADERO
}
if(m _ bfix pendiente & amp; & amp
((nID & ltIDC _ 0)| |(nID & gt;IDC _ 9))& amp;& amp
(nID!= IDC _ CLX ){
mensaje bip(MB _ icono asterisco);
Devolver TRUE
}
Devolver CDialog::OnCommand (wParam, lParam) ;
}
void CDlgCalcDlg::on dígito(UINT nID)
{
TCHAR cDigit =(char)nID ;
if (m_bFixPending) {
m_strFormat.
SetAt (3, cDigit-IDC _ 0x 30);
displayx Register();
m _ bFixPending = FALSE
m _ bStackLiftEnabled = TRUE
m_bNewX = VERDADERO
Retorno
}
if (m_bNewX) {
m _ bNewX = FALSE
if(m _ bstacklifenabled){
m _ bStackLiftEnabled = FALSE
levantar pila();
}
m_bDecimalInString = FALSE
m_strDisplay. vacío();
}
int nLength = m_strDisplay. GetLength();
if ((nLength == MAXCHARS) ||
((nLength = =(MAXCHARS-10))&&!m_bDecimalInString)) p>
mensaje bip(MB _ icono asterisco);
De lo contrario {
m _ strDisplay+=(cDigit-IDC _ 0x 30
); actualizar pantalla(m_strDisplay);
m_dbl stack[0]=_TCS tod(m_strDisplay.
GetBuffer (0), NULL);
}
}
void CDlgCalcDlg::OnAdd()
{
m _ pila dbl[0]+= m _ pila dbl[1];
displayx Register()
soltar pila(); >m _ bStackLiftEnabled = TRUE
m _ bNewX = TRUE
}
void CDlgCalcDlg::OnSubtract()
{ p>
m _ pila dbl[0]= m _ pila dbl[1]-m _ pila dbl[0]
displayx Register()
soltar pila; ();
m _ bStackLiftEnabled = TRUE
m _ bNewX = TRUE
}
void CDlgCalcDlg::OnMultiply()
{
m _ pila dbl[0]* = m _ pila dbl[1]
displayx registro(); soltar pila();
m _ bStackLiftEnabled = TRUE
m _ bNewX = TRUE
}
void CDlgCalcDlg::OnDivide( )
{
if (m_dblStack[0] == 0.0) {
m _ bErrorFlag = TRUE
mensaje pitido(MB _ icono asterisco);
UpdateDisplay (CString (_T("divide por cero"));
}
En caso contrario{
m _ pila dbl[0]= m _ pila dbl[1]/m _ pila dbl[0];
displayx registro();
soltar pila(); p>
p>
m _ bStackLiftEnabled = TRUE
m _ bNewX = TRUE
}
}
void CDlgCalcDlg::OnEnter ()
{
levantar pila();
displayx registro();
m _ bStackLiftEnabled = FALSO
m _ bNewX = TRUE
}
void CDlgCalcDlg::OnChangeSign()
{
si (m_dblStack[0]! = 0.0) {
m _ pila dbl[0]=-m _ pila dbl[0];
if(m _ strDisplay[0]= = _ T(`- '){
int nLength = m_strDisplay.
m_strDisplay = m_strDisplay.