[项目] - Calc计算器

前言

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1534811.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Ansys HFSS的边界条件与激励端口

本文将介绍HFSS边界条件、激励端口,然后重点介绍连接器信号完整性仿真应用最多的波端口(wave port)及其尺寸设置要点。 HFSS (电磁仿真)边界条件 HFSS中所谓的边界并非真正意义上的边界,边界条件是指定问题区域和对象边缘的场行为接口。在HFSS的背景下,边界的存在主要有两个…

缺陷(Bug)的一生

Bug 像是一个被过分宠爱的小孩子&#xff0c;得到了特别多的关注。它们在开发者的 IDE 里悄然无声的诞生&#xff0c;但在现身之刻却引来一片喧闹。 对于测试工程师发现的 Bug&#xff0c;它们的生命是这样的&#xff1a;测试工程师发现Bug&#xff0c;花些时间细细品味。 这…

GB28181应急救援行业视音频解决方案探究和技术实现

技术背景 应急救援是一项针对突发、具有破坏力的紧急事件采取预防、预备、响应和恢复的活动与计划。这些紧急事件可能包括自然灾害&#xff08;如地震、洪水、台风&#xff09;、事故灾难&#xff08;如火灾、爆炸、交通事故&#xff09;、公共卫生事件&#xff08;如疫情、食…

pycharm安装-教程

在研究和学习的过程中&#xff0c;Jupyter Notebook确实是一个不错的选择&#xff0c;但在处理大型项目程序时&#xff0c;可能需要一个更强大的集成开发环境(IDE)。在此背景下&#xff0c;我们推荐使用PyCharm。PyCharm不仅具备多种功能&#xff0c;如项目管理、环境管理、代码…

叉车智能ai防撞系统解决方案

现代物流运输和制造业领域&#xff0c;叉车作为重要作业工具&#xff0c;使用范围遍及工厂车间、仓库、码头、物流中心等场所&#xff0c;发挥着不可或缺的主力作用。然而&#xff0c;由于叉车车身庞大、视野盲区多&#xff0c;如操作不当极易导致撞击事故&#xff0c;对作业人…

第一届长城杯信息安全铁人三项赛决赛 取证溯源 (复现)

前言&#xff1a; 2024铁人三项决赛应急响应 您的同事李白在运维一台部署了移动应用服务端的linux服务器时发现了异常&#xff0c;好像被黑客攻 击了。小李通过简单分析&#xff0c;发现可能是由于公司的移动应用和其服务端程序都存在安全问题导致 的。小李将当天可能与攻击相关…

在国行iOS设备上启用Apple Intelligence

昨天凌晨&#xff0c;科技春晚隆重举行&#xff0c;厨子大叔如期发布最新iPhone 16系列&#xff0c;开启iPhone的AI时代。可惜&#xff0c;中国大陆用户此刻并不能享受上述服务。但不用担心&#xff0c;下面猫叔就教你如何在国行iOS设备上启用Apple Intelligence。 预备工作 1…

c++基础入门一

文章目录 C基础入门&#xff08;一&#xff09;一、C简介二、C入门一、命名空间食用方法 二、输入/输出三、缺省参数 C基础入门&#xff08;一&#xff09; 一、C简介 ​ C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大…

python版本dikstra堆优化

题目&#xff1a; 代码&#xff1a; from heapq import * #堆优化版本的最短路算法&#xff08;dijkstra&#xff09; N150010 h[-1 for _ in range(N)] e[-1 for _ in range(N)] ne[-1 for _ in range(N)] w[-1 for _ in range(N)] idx0 st[False for _ in range(N)] dist[fl…

Shopee虾皮:广告类型选择与效果优化要点

Shopee虾皮作为东南亚增势迅猛的电商平台&#xff0c;是很多跨境卖家出海东南亚的首要选择。这势必带来强烈的竞争&#xff0c;因此&#xff0c;如果卖家想要突出重围&#xff0c;广告投放和优化则格外重要。 一、虾皮的广告类型 1.关键词广告 当买家搜索的关键字与卖家投放的…

Qt 弹出菜单右键菜单 QMenu 设置不同颜色的子项

概述 在Qt中&#xff0c;可以使用样式表&#xff08;StyleSheet&#xff09;来自定义 QMenu 的外观&#xff0c;包括其子项&#xff08;如菜单项QAction&#xff09;的颜色。但是&#xff0c;这通常可以设置 QMenu 的整体样式&#xff0c;而不能单独设置某个子项的颜色。不过&…

什么是 SMB 服务器以及它如何工作?

在本文中&#xff0c;您将了解 SMB 服务器以及它们如何促进网络文件共享。 我们将介绍它们的基本功能、主要特性以及如何安全地设置它们。无论您是新手还是需要复习&#xff0c;本指南都将帮助您更好地了解 SMB 服务器。 什么是 SMB 服务器&#xff1f; SMB&#xff08;服务器…

C语言浮点型数据在内存中的存储(23)

文章目录 前言一、浮点数在内存中的存储练习引入浮点数的存储浮点数存的过程 二、浮点数取的过程E不全为0或不全为1E全为0E全为1 三、再回顾练习总结 前言 哎&#xff0c;之前写了一篇&#xff0c;可是中途退出没保存&#xff0c;只能再写一遍了~   浮点数在内存中的存储跟整…

计算左边(比自己小的元素)的最长距离

前言&#xff1a;一般做的题目都是使用单调栈来求出距离这个点最近的那个比这个数大或小的元素&#xff0c;但是如果是需要找到最远的那个元素呢&#xff1f;我们可以用到类似逆序对的思路&#xff0c;我们先进行排序从小到大&#xff0c;接着我们先处理左边&#xff0c;每次维…

vue3使用vscode开发遇到热更新问题(文件保存页面不实时更新)

1.第一种情况是所有页面都不热更新 检查Live Server插件&#xff0c;确保安装&#xff0c;安装也无效可以试一下重新安装 2.只有个别页面没有热更新(本人是这种情况) 遇到这种情况就要检查路由文件中导入的文件名称与项目中文件名字是否一致(大小写也要一样) 若路由文件中 导…

利用shuji还原webpack打包源码

0 前言 前段时间做一个银行的项目&#xff0c;是在别人已经打过好多次的基础上继续打&#xff0c;而且时间很短&#xff0c;也是没办法要有产出&#xff0c;这个银行很多站点都是webpack打包&#xff0c;就新学了一个点&#xff1a;利用shuji获取webpack打包站源码&#xff08…

设置使用阿里云服务器DNS

由于云服务器是从腾讯云迁移到阿里云&#xff0c;然后使用ssl验证时一直无法使用dns验证&#xff0c;也无法创建三级域名&#xff0c;原来需要把阿里云服务器改成阿里云的dns使用 如果使用其他服务器DNS会下面会显示当前DNS服务器&#xff0c;

怎么将flv转换成mp4格式?这几种转换方法超多人在用!

怎么将flv转换成mp4格式&#xff1f;FLV&#xff0c;这一视频格式在大众视野中相对边缘化&#xff0c;其鲜为人知并非偶然&#xff0c;背后隐藏着多重挑战&#xff0c;首要挑战在于其兼容性的局限&#xff0c;由于FLV的小众属性&#xff0c;许多现代软件与操作系统并未给予充分…

day-55 不同路径

思路 动态规划&#xff1a;因为只能向右或向下移动&#xff0c;可以得出状态转换方程&#xff1a;dp[i][j]dp[i-1][j]dp[i][j-1] 解题过程 直接令第一行和第一列全为1&#xff0c;然后通过状态转换方程进行计算&#xff0c;返回dp[m-1][n-1]即可 Code class Solution {publi…

53.【C语言】 字符函数和字符串函数(strcmp函数)

7.strcmp函数 *简单使用 cplusplus的介绍 点我跳转 strcmp:string compare 字符串比较 具体讲解见此文 点我跳转 *例题 求下列代码的执行结果 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main() {char arr1[20] { &quo…