首页 > 其他分享 >[项目] - Calc计算器

[项目] - Calc计算器

时间:2024-09-14 17:24:29浏览次数:9  
标签:hEditText case TextBuffer 项目 BUTTON SetWindowText 计算器 Calc IDC

前言

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

标签:hEditText,case,TextBuffer,项目,BUTTON,SetWindowText,计算器,Calc,IDC
From: https://blog.csdn.net/weixin_58038441/article/details/142218663

相关文章

  • OpenAI 的 GPT-o1(GPT5)详细评论 OpenAI 的 Strawberry 项目具有博士级智能
    简介OpenAI的GPT-5又名Strawberry项目,又名GPT-o1,又名博士级LLM现已推出。几个月来一直备受关注,从结果来看,它不负众望。OpenAI-o1是一系列模型,旨在增强科学、编码和数学等复杂领域的问题解决能力。推荐文章《AI交通管理系列之使用Python进行现代路线优化最......
  • 项目内部调用的远程接口开发
    编写一个项目内部调用的远程接口通常是为了在分布式系统或者微服务架构中,实现各个服务之间的通信和数据交换。这样的远程接口专门用于服务之间的调用,而不是直接暴露给外部用户或前端。项目内部的远程接口统一放在api工程首先进入api编写接口,注意使用@FeignClient注解进入......
  • SpringBoot+Vue3项目邮箱验证码注册详细教程
    引言该篇文章是以SpringBoot+Vue3技术栈搭建的项目的邮箱注册登录流程,注册用户使用邮箱校验,使用qq邮箱发送验证码,并且把验证码存入Redis以备校验使用的详细介绍干货部分1.在SpringBoot项目的application.yaml文件中配置qq邮箱spring:#mail邮箱mail:#SMTP......
  • Halo 开发者指南——项目运行、构建
    准备工作环境要求OpenJDK17LTSNode.js20LTSpnpm9IntelliJIDEAGitDocker(可选)名词解释工作目录指Halo所依赖的工作目录,在Halo运行的时候会在系统当前用户目录下产生一个halo-next的文件夹,绝对路径为~/halo-next。里面通常包含下列目录或文件:​db​:存放H......
  • C#分布式项目中是否使用MassTransit
    参考https://www.sundstrom.dev/articles/building-distributed-apps-with-masstransithttps://code-maze.com/masstransit-rabbitmq-aspnetcore/https://www.gyata.ai/asp-net/masstransit分布式系统常见的架构是微服务和SOA,在实践层面微服务引入了服务发现和服务注册,SOA架构......
  • 使用脚手架来创建 express 项目
    使用脚手架(scaffold)可以快速搭建Express应用程序的基本结构。Express自身提供了一个官方脚手架工具叫做express-generator,它可以帮助你快速地生成一个包含基本文件结构的Express项目。安装ExpressGenerator首先,你需要全局安装ExpressGenerator。在命令行中执行以下命令:npminstal......
  • vscode下vue3+vite+ts+eslint项目配置
    一、创建项目pnpmcreatevue@latest注意:是否引入ESLint用于代码质量检测?选择否二、安装依赖pnpmi-Deslint@antfu/eslint-config三、在项目根目录创建文件:eslint.config.js//eslint.config.jsimportantfufrom'@antfu/eslint-config'exportdefaultantfu({......
  • AI正在改变项目经理的工作方式
    概要人工智能对项目专业人士的好处效率与生产力人工智能通过自动化常规任务来提高项目经理的工作效率。通过分析大数据集改进决策过程。职业发展在就业市场中使项目经理脱颖而出。通过将人工智能融入日常任务,接触更多优质机会和项目。技能发展项目专业人士需要了解如何有效地与......
  • 如何在 Fork 的 GitHub 项目中保留自己的修改并同步上游更新?github_fork_update
    如何在Fork的GitHub项目中保留自己的修改并同步上游更新?在GitHub上Fork了一个项目后,你可能会对项目进行一些修改,同时原作者也在不断更新。如果想要在保留自己修改的基础上,同步原作者的最新更新,很多人会不知所措。本文将详细讲解如何在不丢失自己改动的情况下,将上游仓库的更......
  • 个人项目
    这个作业属于哪个课程https://edu.cnblogs.com/campus/gdgy/CSGrade22-34这个作业要求在哪里https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/homework/13229这个作业的目标了解PSP,编写代码和测试完成论文查重的个人项目这次作业的github链接:https://github.......