Red de conocimiento informático - Material del sitio web - Cómo implementar una calculadora usando VC++6.0 MFC

Cómo implementar una calculadora usando VC++6.0 MFC

Figura 8-10. Aplicación DlgCalc.

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

//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 };

//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()

{

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))

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))

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()

{

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>

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.