![]() |
![]() |
|
|
|
|
|
Por Ivan Cachicatari
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 Visual C++ Ejecutándose
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)
#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.
La calculadora utiliza un algoritmo muy simple usa un espacio de memoria para poder realizar las operaciones.
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);
}
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 mencionarles, si hay algo que he olvidado explicar por favor expongan su problema/consulta en el foro activado para este artículo.
![]() |
![]() |
|||
Comentarios y Consultas
+ Agregar Comentario/Consulta -> Ver todos los comentarios |
||||
![]() |
![]() |