前言
- 各位师傅大家好,我是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 4INT_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窗口位置,通过点击按钮 存放文本,存放值,进行相关处理