前言
- 各位师傅大家好,我是qmx_07,今天来尝试模拟windows 下的clac计算器
绘制计算器
- 拖动工具箱的Edit Control输入框、Button按钮 制作计算器界面
- 需要将Edit Control输入框 拉长,将多行、只读 设置为True
- 整体计算机的控件ID:IDD_DIALOG_CALC_CALC
- 按照数字分别是:
IDC_BUTTON_1
IDC_BUTTON_2
IDC_BUTTON_3
IDC_BUTTON_4
IDC_BUTTON_5
IDC_BUTTON_6
IDC_BUTTON_7
IDC_BUTTON_8
IDC_BUTTON_9
IDC_BUTTON_0
IDC_BUTTON_DEL //清空
IDC_BUTTON_ADD //加运算
IDC_BUTTON_SUB //减运算
IDC_BUTTON_MUL //乘运算
IDC_BUTTON_DIV //除运算
创建非模态对话框
计算器的消息处理:
INT_PTR CALLBACK Calc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
case WM_CLOSE:
{
EndDialog(hDlg, 0);
PostQuitMessage(0);
return TRUE;
}
}
return (INT_PTR)FALSE;
}
创建绑定 非模态对话框:
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // 将实例句柄存储在全局变量中
HWND hWnd = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG_CALC), NULL, Calc);
if (!hWnd)
{
return FALSE;
}
}
调整计算器位置
- 想要调整登录框位置, 需要引用<atltypes.h>这个头文件库,里面包含一些用于处理和管理图形设备的接口函数
#include <atltypes.h>
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // 将实例句柄存储在全局变量中
HWND hWnd = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG_CALC), NULL, Calc);
if (!hWnd)
{
return FALSE;
}
CRect rect;//表示矩形地址的结构体
GetWindowRect(hWnd, &rect);//获得窗口的屏幕坐标矩形,用于存储左上角和右下角的坐标值
int nX = GetSystemMetrics(SM_CXFULLSCREEN);//获得全屏的宽度
int nY = GetSystemMetrics(SM_CYFULLSCREEN);//获得全屏的高度
int nW = rect.Width();//获得窗口的宽度
int nH = rect.Height();//获得窗口的高度
MoveWindow(hWnd, (nX - nW) / 2, (nY - nH) / 2, nW, nH, TRUE);//让窗口来到正中心
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
画面演示:
实现计算器功能
//显示缓冲区
WCHAR TextBuffer[256] = { 0 };
//参与运算的两个数字
int Value1 = 0;
int Value2 = 0;
//临时存放每一位数组
int TempValue1[8] = { 0 };
int TempValue2[8] = { 0 };
//数组索引和数组长度的标记
int nFlag1 = 0;
int nFlag2 = 0;
//切换数字的标记
int nSwitch = 0;
//运算符标记(+ 1 - 2 * 3 / 4)
int nOperation = 0;
//结果
int nRet = 0;
//宏定义
#define OPERATION_ADD 1
#define OPERATION_SUB 2
#define OPERATION_MUL 3
#define OPERATION_DIV 4
INT_PTR CALLBACK Calc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
{
HWND hEditText = GetDlgItem(hDlg, IDC_EDIT_TEXT);
switch (HIWORD(wParam))
{
case BN_CLICKED:
{
switch (LOWORD(wParam))
{
case IDC_BUTTON_RET:
{
//数组输入的数字决定要*10的几倍,得到最终的数
int nCoefficient = 1;
for (size_t i = nFlag1 - 1; i >= 0; i--)
{
Value1 += (TempValue1[i] * nCoefficient);
nCoefficient *= 10;
if (i == 0)
{
break;
}
}
nCoefficient = 1;
for (size_t i = nFlag2 - 1; i >= 0; i--)
{
Value2 += (TempValue2[i] * nCoefficient);
nCoefficient *= 10;
if (i == 0)
{
break;
}
}
switch (nOperation)
{
case OPERATION_ADD:
{
nRet = Value1 + Value2;
break;
}
case OPERATION_SUB:
{
nRet = Value1 - Value2;
break;
}
case OPERATION_MUL:
{
nRet = Value1 * Value2;
break;
}
case OPERATION_DIV:
{
nRet = Value1 / Value2;
break;
}
}
WCHAR RetBuffer[50] = { 0 };
wsprintf(RetBuffer, L"=%d", nRet);
wcscat(TextBuffer, RetBuffer);
SetWindowText(hEditText, TextBuffer);
break;
}
case IDC_BUTTON_1:
{
//第一个数字
if (nSwitch == 0)
{
//在数组存入数字
TempValue1[nFlag1] = 1;
//后移索引
nFlag1++;
//显示内容拼接
wcscat(TextBuffer, L"1");
//发送消息显示
SetWindowText(hEditText,TextBuffer);
}
else
{
TempValue2[nFlag2] = 1;
nFlag2++;
wcscat(TextBuffer, L"1");
SetWindowText(hEditText, TextBuffer);
}
break;
}
case IDC_BUTTON_2:
{
//第一个数字
if (nSwitch == 0)
{
//在数组存入数字
TempValue1[nFlag1] = 2;
//后移索引
nFlag1++;
//显示内容拼接
wcscat(TextBuffer, L"2");
//发送消息显示
SetWindowText(hEditText, TextBuffer);
}
else
{
TempValue2[nFlag2] = 2;
nFlag2++;
wcscat(TextBuffer, L"2");
SetWindowText(hEditText, TextBuffer);
}
break;
}
case IDC_BUTTON_3:
{
//第一个数字
if (nSwitch == 0)
{
//在数组存入数字
TempValue1[nFlag1] = 3;
//后移索引
nFlag1++;
//显示内容拼接
wcscat(TextBuffer, L"3");
//发送消息显示
SetWindowText(hEditText, TextBuffer);
}
else
{
TempValue2[nFlag2] = 3;
nFlag2++;
wcscat(TextBuffer, L"3");
SetWindowText(hEditText, TextBuffer);
}
break;
}
case IDC_BUTTON_4:
{
//第一个数字
if (nSwitch == 0)
{
//在数组存入数字
TempValue1[nFlag1] = 4;
//后移索引
nFlag1++;
//显示内容拼接
wcscat(TextBuffer, L"4");
//发送消息显示
SetWindowText(hEditText, TextBuffer);
}
else
{
TempValue2[nFlag2] = 4;
nFlag2++;
wcscat(TextBuffer, L"4");
SetWindowText(hEditText, TextBuffer);
}
break;
}
case IDC_BUTTON_5:
{
//第一个数字
if (nSwitch == 0)
{
//在数组存入数字
TempValue1[nFlag1] = 5;
//后移索引
nFlag1++;
//显示内容拼接
wcscat(TextBuffer, L"5");
//发送消息显示
SetWindowText(hEditText, TextBuffer);
}
else
{
TempValue2[nFlag2] = 5;
nFlag2++;
wcscat(TextBuffer, L"5");
SetWindowText(hEditText, TextBuffer);
}
break;
}
case IDC_BUTTON_6:
{
//第一个数字
if (nSwitch == 0)
{
//在数组存入数字
TempValue1[nFlag1] = 6;
//后移索引
nFlag1++;
//显示内容拼接
wcscat(TextBuffer, L"6");
//发送消息显示
SetWindowText(hEditText, TextBuffer);
}
else
{
TempValue2[nFlag2] = 6;
nFlag2++;
wcscat(TextBuffer, L"6");
SetWindowText(hEditText, TextBuffer);
}
break;
}
case IDC_BUTTON_7:
{
//第一个数字
if (nSwitch == 0)
{
//在数组存入数字
TempValue1[nFlag1] = 7;
//后移索引
nFlag1++;
//显示内容拼接
wcscat(TextBuffer, L"7");
//发送消息显示
SetWindowText(hEditText, TextBuffer);
}
else
{
TempValue2[nFlag2] = 7;
nFlag2++;
wcscat(TextBuffer, L"7");
SetWindowText(hEditText, TextBuffer);
}
break;
}
case IDC_BUTTON_8:
{
//第一个数字
if (nSwitch == 0)
{
//在数组存入数字
TempValue1[nFlag1] = 8;
//后移索引
nFlag1++;
//显示内容拼接
wcscat(TextBuffer, L"8");
//发送消息显示
SetWindowText(hEditText, TextBuffer);
}
else
{
TempValue2[nFlag2] = 8;
nFlag2++;
wcscat(TextBuffer, L"8");
SetWindowText(hEditText, TextBuffer);
}
break;
}
case IDC_BUTTON_9:
{
//第一个数字
if (nSwitch == 0)
{
//在数组存入数字
TempValue1[nFlag1] = 9;
//后移索引
nFlag1++;
//显示内容拼接
wcscat(TextBuffer, L"9");
//发送消息显示
SetWindowText(hEditText, TextBuffer);
}
else
{
TempValue2[nFlag2] = 9;
nFlag2++;
wcscat(TextBuffer, L"9");
SetWindowText(hEditText, TextBuffer);
}
break;
}
case IDC_BUTTON_0:
{
//第一个数字
if (nSwitch == 0)
{
//在数组存入数字
TempValue1[nFlag1] = 0;
//后移索引
nFlag1++;
//显示内容拼接
wcscat(TextBuffer, L"0");
//发送消息显示
SetWindowText(hEditText, TextBuffer);
}
else
{
TempValue2[nFlag2] = 0;
nFlag2++;
wcscat(TextBuffer, L"0");
SetWindowText(hEditText, TextBuffer);
}
break;
}
case IDC_BUTTON_DEL:
{
Value1 = 0;
Value2 = 0;
//临时存放每一位数组
TempValue1[8] = { 0 };
TempValue2[8] = { 0 };
//数组索引和数组长度的标记
nFlag1 = 0;
nFlag2 = 0;
//切换数字的标记
nSwitch = 0;
//运算符标记(+ 1 - 2 * 3 / 4)
nOperation = 0;
//结果
nRet = 0;
memset(TextBuffer, 0, 256);
SetWindowText(hEditText, TextBuffer);
break;
}
case IDC_BUTTON_ADD:
{
//标记运算符
nOperation = OPERATION_ADD;
//切换输入的数字
nSwitch = 1;
wcscat(TextBuffer, L"+");
//发送消息
SetWindowText(hEditText, TextBuffer);
break;
}
case IDC_BUTTON_SUB:
{
//标记运算符
nOperation = OPERATION_SUB;
//切换输入的数字
nSwitch = 1;
wcscat(TextBuffer, L"-");
//发送消息
SetWindowText(hEditText, TextBuffer);
break;
}
case IDC_BUTTON_MUL:
{
//标记运算符
nOperation = OPERATION_MUL;
//切换输入的数字
nSwitch = 1;
wcscat(TextBuffer, L"*");
//发送消息
SetWindowText(hEditText, TextBuffer);
break;
}
case IDC_BUTTON_DIV:
{
//标记运算符
nOperation = OPERATION_DIV;
//切换输入的数字
nSwitch = 1;
wcscat(TextBuffer, L"/");
//发送消息
SetWindowText(hEditText, TextBuffer);
break;
}
}
}
}
}
break;
case WM_CLOSE:
{
EndDialog(hDlg, 0);
PostQuitMessage(0);
return TRUE;
}
}
return (INT_PTR)FALSE;
}
- 获取每一个点击按钮的控件ID值,在每一次点击按钮,会执行如下操作:
- 判断操作数,存入临时数字,拼接字符到显示区域
- 运算结果:将每一位数值取出,存储到Value变量,再通过操作数加减乘除
画面演示:
总结
- 介绍了绘制计算器图形,调整windows窗口位置,通过点击按钮 存放文本,存放值,进行相关处理