Calculadora en Visual C++

Por:ivancp, enviado 03 may 2008

Introducción

Hace algunos años implementé esta calculadora en Visual C++ 6.0, el código fuente del proyecto se perdió en alguna parte. Hace unos meses lo volví a ver y decidí compartirlo.

El proyecto actual está compilado en Visual C++ 2005 pero aun conservo e archivo .dsw para compilarlo con Visual C++ 6.0. Voy explicar algunos puntos clave sobre la implementación de esta Calculadora.

El proyecto es Basado en Dialogo (Dialog Based).

calculadora.jpg
Calculadora Visual C++ Ejecutándose


Eventos utilizados

Como podrán notar, una calculadora debe tener botones de números y cada uno de ellos debe agregar un digito al panel. Una opción es utilizar el evento BN_CLICKED para cada botón pero es mejor utilizar la macro ON_COMMAND_RANGE.

Para utilizar la macro es necesario asegurarse de tener los valores de los ID’s de cada grupo de botones en forma correlativa (ver archivo resource.h)

Code: Seleccionar todo
  1. #define IDC_0                           1000

  2. #define IDC_1                           1001

  3. #define IDC_2                           1002

  4. #define IDC_3                           1003

  5. #define IDC_4                           1004

  6. #define IDC_5                           1005

  7. #define IDC_6                           1006

  8. #define IDC_7                           1007

  9. #define IDC_8                           1008

  10. #define IDC_9                           1009



Los ID’s anteriores corresponden a los botones numéricos, entonces la forma de utilizar la macro en el segmento de código BEGIN_MESSAGE_MAP.

Code: Seleccionar todo
  1. BEGIN_MESSAGE_MAP(CCalculadoraDlg, CDialog)

  2. //...

  3.     ON_COMMAND_RANGE(IDC_0, IDC_9,OnClickNumeros)

  4. END_MESSAGE_MAP()



Para esta declaración necesitamos también la función que procesará el evento:

afx_msg void OnClickNumeros(UINT nID);

El parámetro nID asume el valor del ID del botón presionado, el cual podemos utilizar a nuestro antojo.

De la misma forma se hizo con los otros grupos de botones, como operaciones unarias, operaciones binarias, etc.

Funcionamiento de la calculadora

La calculadora utiliza un algoritmo muy simple usa un espacio de memoria para poder realizar las operaciones.
  1. Esperar a que se escriba el número para procesarlo.
  2. Si se ha presionado sobre un botón de operaciones unarias:
    1. Realizar la operación sobre el mismo número escrito.
    2. Mostrar el nuevo valor en el panel.
  3. Si se ha presionado sobre un botón de operaciones binarias:
    1. Si hay un número almacenado en memoria:
      • Realizar la operación con el número escrito y el número almacenado en memoria.
      • Mostrar el resultado en el panel.
    2. Si no hay un número almacenado en memoria.
      • Limpiar el panel y guardar el número obtenido en memoria.

Panel numérico

Para visualizar el número se utiliza un control Edit, el control por defecto esta deshabilitado y la propiedad de solo lectura (Read Only) esta activada, esto hace que en tiempo de ejecución se vea con el fondo y el color de texto opacos. Para modificar esta apariencia nos “colgamos” del mensaje WM_CTLCOLOR, que nos permite modificar los colores antes que los controles se “pinten” en el dialogo.

Code: Seleccionar todo
  1. HBRUSH CCalculadoraDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

  2. {

  3.   pDC->SetTextColor(RGB(50, 50, 255));

  4.   pDC->SetBkColor(RGB(255, 255, 255));

  5.   return (HBRUSH)(m_pEditBkBrush);

  6. }



Uso del teclado

También he considerado la posibilidad de que el usuario presione el teclado para ingresar los números, para ello interceptamos el mensaje WM_KEYDOWN y averiguamos si las teclas presionadas nos sirven.

Esta interceptación se puede implementar en la función PreTranslateMessage.

Code: Seleccionar todo
  1. BOOL CCalculadoraDlg::PreTranslateMessage(MSG* pMsg)

  2. {

  3.   if (pMsg->message == WM_KEYDOWN)

  4.   {

  5.     if (pMsg->wParam >= VK_NUMPAD0  && pMsg->wParam <= VK_NUMPAD9  )

  6.     {

  7.        //Teclado numerico

  8.       return TRUE;

  9.     }

  10.     // ... procesar el resto de opciones de teclado

  11.   }

  12. }



Pueden descargar el proyecto completo en el enlace mas abajo.

Es todo lo que puedo mencionarles, si hay algo que he olvidado explicar por favor expongan su problema/consulta en el foro activado para este artículo.

Archivos Adjuntos

Otros Artículos en esta sección

¿Alguna duda? Sientete libre de hacer tus pruntas en nuestro:
foro de Visual C++ »