[项目] - 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 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窗口位置,通过点击按钮 存放文本,存放值,进行相关处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值