Calculadora en Visual C++


Ir a Github  Download

El programa es una aplicación Basada en Dialogo (Dialog Based) y no tiene mayores complicaciones, la implementación es sencilla usando el teclado mediante PreTranslateMessage.

El código fuente de éste proyecto se perdió en alguna parte y luego tuve que volver a escribirlo para compartirlo con ustedes.

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.

Eventos utilizados

Como podrán notar, una calculadora debe tener botones de números y cada uno de ellos debe agregar un dígito 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 evitar escribir una función para cada uno.

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)

#define IDC_0 1000
#define IDC_1 1001
#define IDC_2 1002
#define IDC_3 1003
#define IDC_4 1004
#define IDC_5 1005
#define IDC_6 1006
#define IDC_7 1007
#define IDC_8 1008
#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.

BEGIN_MESSAGE_MAP(CCalculadoraDlg, CDialog)

   /* ... */

   ON_COMMAND_RANGE(IDC_0, IDC_9,OnClickNumeros)
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 y 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.

HBRUSH CCalculadoraDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
  pDC->SetTextColor(RGB(50, 50, 255));
  pDC->SetBkColor(RGB(255, 255, 255));
  return (HBRUSH)(m_pEditBkBrush);
}

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.

BOOL CCalculadoraDlg::PreTranslateMessage(MSG* pMsg)
{
  if (pMsg->message == WM_KEYDOWN)
  {
    if (pMsg->wParam >= VK_NUMPAD0  && pMsg->wParam <= VK_NUMPAD9  )
    {
       //Teclado numerico
      return TRUE;
    }
    // ... procesar el resto de opciones de teclado
  }
}

Pueden descargar el proyecto completo en el enlace mas abajo.

Es todo lo que puedo comentarles aquí, si hay algo que he olvidado explicar por favor dejen su comentario.

Dejar una Respuesta