Windows SDK(九)登录框和计算器练习

这节课我们分别开始讲解登录框和计算机的实现

登录框实现

我们以上节课所学,自行创建一个对话框,ID为IDD_DIALOG1并将他编辑为一个登录框的样式。其中我们将账户的编辑框ID设置为IDC_ENIT_USERNAME,密码的编辑框ID设置为IDC_ENIT_PASSWORD。创建样式如下

完成以上步骤以后,我们便开始创建对话框并将该对话框设置为界面主页面

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{hInst = hInstance; // 将实例句柄存储在全局变量中HWND hWnd = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG1), NULL, Login);//创建对话框。此时对话框出现时,默认在左上角位置if (!hWnd){return FALSE;}
//此处开始将其移动到屏幕中间CRect rect; //注意包含头文件atltypes.h,该结构体用于表示一个矩形区域GetWindowRect(hWnd, &rect);//将登录框的左上角坐标(相对于系统屏幕讲)以及右下角坐标填充到rect中int nX = GetSystemMetrics(SM_CXFULLSCREEN);//获取系统桌面的x轴长度int nY = GetSystemMetrics(SM_CYFULLSCREEN);//获取系统桌面的y轴长度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;
}

此时我们再为该对话框创建一个窗口过程,并实现相关功能

INT_PTR CALLBACK Login(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{UNREFERENCED_PARAMETER(lParam);switch (message){case WM_INITDIALOG:return (INT_PTR)TRUE;case WM_COMMAND:switch (HIWORD(wParam)){case BN_CLICKED:{if (LOWORD(wParam) == IDC_BUTTON_LOGIN){//句柄(USERNAME PASSWORD)HWND hUserWnd = GetDlgItem(hDlg, IDC_EDIT_USERNAME);HWND hPassWnd = GetDlgItem(hDlg, IDC_EDIT_PASSWORD);//获取控件上文本的长度DWORD dwUserLength = GetWindowTextLength(hUserWnd);DWORD dwPassLength = GetWindowTextLength(hPassWnd);//申请内存WCHAR * szUserBuffer = new WCHAR[dwUserLength + 1];WCHAR * szPassBuffer = new WCHAR[dwPassLength + 1];//获取控件文本GetWindowText(hUserWnd, szUserBuffer, dwUserLength + 1);GetWindowText(hPassWnd, szPassBuffer, dwPassLength + 1);if (wcscmp(szUserBuffer,L"rkvir") == 0 && wcscmp(szPassBuffer, L"123456") == 0){//弹出新的对话框MessageBox(NULL, L"Login Success!", L"Msg", MB_OK);}else{MessageBox(NULL, L"Login Failed!", L"Msg", MB_OK);}}break;}default:break;}break;case WM_CLOSE:{EndDialog(hDlg, 0);PostQuitMessage(0);return TRUE;}}return (INT_PTR)FALSE;
}

如上便是一个登录框的实现。在之前章节中,我们同样也实现了一个登录框,只不过此处的实现因为对话框的原因不需要我们创建各种窗口控件,直接进行应用

接下来我们将实现一个计算器

计算器实现

计算器的实现,我们同样利用对话框进行实现。其中计算器名叫做calc,ID为IDD_DLALOG_CALC。

计算器中相关ID如下:

我们创建的计算器样式如下,其可以实现整数的加减乘除功能

其中将显示面板属性修改为如下形式:

完成以上步骤以后,我们便开始创建对话框并将该对话框设置为界面主页面

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{hInst = hInstance; // 将实例句柄存储在全局变量中HWND hWnd = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG_CALC), NULL, CalcDialog);//创建对话框。此时对话框出现时,默认在左上角位置if (!hWnd){return FALSE;}
//此处开始将其移动到屏幕中间CRect rect; //注意包含头文件atltypes.h,该结构体用于表示一个矩形区域GetWindowRect(hWnd, &rect);//将登录框的左上角坐标(相对于系统屏幕讲)以及右下角坐标填充到rect中int nX = GetSystemMetrics(SM_CXFULLSCREEN);//获取系统桌面的x轴长度int nY = GetSystemMetrics(SM_CYFULLSCREEN);//获取系统桌面的y轴长度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 szTextBuffer[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; //切换第一个数和第二个数的标记
int nOperation = 0; //运算符标记(+:1 -:2 *:3 /:4 )
int nRet = 0; //结果值//宏定义
#define OPERATION_ADD 1
#define OPERATION_SUB 2
#define OPERATION_IMUL 3
#define OPERATION_IDIV 4
INT_PTR CALLBACK CalcDialog(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_0://点击按键0时{if (nSwitch == 0) //点击时,该数字是第一个数{//在数组中存入当前选中的数字TempValue1[nFlag1] = 0;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"0");//使用该函数,编译器会认为函数危险,我们只需要在项目属性代码生成以及预处理器中添加提示设置即可//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}//第二个数else{//在数组中存入当前选中的数字TempValue2[nFlag2] = 0;//后移索引nFlag2++;//显示内容的拼接wcscat(szTextBuffer, L"0");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}break;}case IDC_BUTTON_1:{//第一个数if (nSwitch == 0){//在数组中存入当前选中的数字TempValue1[nFlag1] = 1;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"1");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}//第二个数else{//在数组中存入当前选中的数字TempValue2[nFlag2] = 1;//后移索引nFlag2++;//显示内容的拼接wcscat(szTextBuffer, L"1");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}break;}case IDC_BUTTON_2:{//第一个数if (nSwitch == 0){//在数组中存入当前选中的数字TempValue1[nFlag1] = 2;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"2");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}//第二个数else{//在数组中存入当前选中的数字TempValue2[nFlag2] = 2;//后移索引nFlag2++;//显示内容的拼接wcscat(szTextBuffer, L"2");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}break;}case IDC_BUTTON_3:{//第一个数if (nSwitch == 0){//在数组中存入当前选中的数字TempValue1[nFlag1] = 3;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"3");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}//第二个数else{//在数组中存入当前选中的数字TempValue2[nFlag2] = 3;//后移索引nFlag2++;//显示内容的拼接wcscat(szTextBuffer, L"3");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}break;}case IDC_BUTTON_4:{//第一个数if (nSwitch == 0){//在数组中存入当前选中的数字TempValue1[nFlag1] = 4;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"4");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}//第二个数else{//在数组中存入当前选中的数字TempValue2[nFlag2] = 4;//后移索引nFlag2++;//显示内容的拼接wcscat(szTextBuffer, L"4");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}break;}case IDC_BUTTON_5:{//第一个数if (nSwitch == 0){//在数组中存入当前选中的数字TempValue1[nFlag1] = 5;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"5");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}//第二个数else{//在数组中存入当前选中的数字TempValue2[nFlag2] = 5;//后移索引nFlag2++;//显示内容的拼接wcscat(szTextBuffer, L"5");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}break;}case IDC_BUTTON_6:{//第一个数if (nSwitch == 0){//在数组中存入当前选中的数字TempValue1[nFlag1] = 6;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"6");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}//第二个数else{//在数组中存入当前选中的数字TempValue2[nFlag2] = 6;//后移索引nFlag2++;//显示内容的拼接wcscat(szTextBuffer, L"6");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}break;}case IDC_BUTTON_7:{//第一个数if (nSwitch == 0){//在数组中存入当前选中的数字TempValue1[nFlag1] = 7;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"7");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}//第二个数else{//在数组中存入当前选中的数字TempValue2[nFlag2] = 7;//后移索引nFlag2++;//显示内容的拼接wcscat(szTextBuffer, L"7");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}break;}case IDC_BUTTON_8:{//第一个数if (nSwitch == 0){//在数组中存入当前选中的数字TempValue1[nFlag1] = 8;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"8");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}//第二个数else{//在数组中存入当前选中的数字TempValue2[nFlag2] = 8;//后移索引nFlag2++;//显示内容的拼接wcscat(szTextBuffer, L"8");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}break;}case IDC_BUTTON_9:{//第一个数if (nSwitch == 0){//在数组中存入当前选中的数字TempValue1[nFlag1] = 9;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"9");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}//第二个数else{//在数组中存入当前选中的数字TempValue2[nFlag2] = 9;//后移索引nFlag2++;//显示内容的拼接wcscat(szTextBuffer, L"9");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}break;}case IDC_BUTTON_DEL: //运算完成以后清除所有缓存{Value1 = 0;Value2 = 0;TempValue1[8] = { 0 };TempValue2[8] = { 0 };nFlag1 = 0;nFlag2 = 0;nSwitch = 0;nOperation = 0;nRet = 0;memset(szTextBuffer, 0, 256);SetWindowText(hEditText, szTextBuffer);break;}case IDC_BUTTON_RET:{//数组输入的数字决定要*10几倍,得到最终的数。123 = 3 * 1 + 2 * 10 + 1 * 100int 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--){//123 3 * 1 2 * 10 1 * 100Value2 += (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_IMUL:{nRet = Value1 * Value2;break;}case OPERATION_IDIV:{nRet = Value1 / Value2;break;}}WCHAR szRetBuffer[50] = { 0 }; //设置运算结果缓冲区wsprintf(szRetBuffer, L"=%d", nRet);//将运算结果放入缓冲区中wcscat(szTextBuffer, szRetBuffer);//拼接运算数和运算结果SetWindowText(hEditText, szTextBuffer);break;}case IDC_BUTTON_ADD:{//标记运算符nOperation = OPERATION_ADD;//切换输入的数字nSwitch = 1;//显示内容的拼接wcscat(szTextBuffer, L"+");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);break;}case IDC_BUTTON_SUB:{//标记运算符nOperation = OPERATION_SUB;//切换输入的数字nSwitch = 1;//显示内容的拼接wcscat(szTextBuffer, L"-");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);break;}case IDC_BUTTON_IMUL:{//标记运算符nOperation = OPERATION_IMUL;//切换输入的数字nSwitch = 1;//显示内容的拼接wcscat(szTextBuffer, L"*");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);break;}case IDC_BUTTON_IDIV:{//标记运算符nOperation = OPERATION_IDIV;//切换输入的数字nSwitch = 1;//显示内容的拼接wcscat(szTextBuffer, L"/");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);break;}default:break;}break;}default:break;}break;}case WM_CLOSE:{EndDialog(hDlg, 0);PostQuitMessage(0);return TRUE;}}return (INT_PTR)FALSE;
}

此时便实现了一个支持整数四则运算的计算器了

作业

将课上实现的计算器进行完善,使其能够支持负数浮点数以及连续运算

相关控件ID如下

IDC_EDIT_TEXT

IDC_BUTTON_0

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_DEL

IDC_BUTTON_RET

IDC_BUTTON_ADD

IDC_BUTTON_SUB

IDC_BUTTON_IMUL

IDC_BUTTON_IDIV

IDC_BUTTON_POINT

IDC_BUTTON_ENG

下图便是我们的计算器

该计算器可以支持整数浮点数负数的四则连续运算

// calc.cpp : 定义应用程序的入口点。
//#include "framework.h"
#include "calc.h"
#include <atltypes.h>
#define MAX_LOADSTRING 100
// 全局变量:
HINSTANCE hInst;                                // 当前实例
WCHAR szTitle[MAX_LOADSTRING];                  // 标题栏文本
WCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口类名// 此代码模块中包含的函数的前向声明:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, int);
INT_PTR CALLBACK CalcDialog(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);int APIENTRY wWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPWSTR    lpCmdLine,_In_ int       nCmdShow)
{UNREFERENCED_PARAMETER(hPrevInstance);UNREFERENCED_PARAMETER(lpCmdLine);// TODO: 在此处放置代码。// 初始化全局字符串LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadStringW(hInstance, IDC_CALC, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);// 执行应用程序初始化:if (!InitInstance (hInstance, nCmdShow)){return FALSE;}HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_CALC));MSG msg;// 主消息循环:while (GetMessage(&msg, nullptr, 0, 0)){if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}return (int) msg.wParam;
}//
//  函数: MyRegisterClass()
//
//  目标: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{WNDCLASSEXW wcex;wcex.cbSize = sizeof(WNDCLASSEX);wcex.style          = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc    = WndProc;wcex.cbClsExtra     = 0;wcex.cbWndExtra     = 0;wcex.hInstance      = hInstance;wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_CALC));wcex.hCursor        = LoadCursor(nullptr, IDC_ARROW);wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_CALC);wcex.lpszClassName  = szWindowClass;wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));return RegisterClassExW(&wcex);
}//
//   函数: InitInstance(HINSTANCE, int)
//
//   目标: 保存实例句柄并创建主窗口
//
//   注释:
//
//        在此函数中,我们在全局变量中保存实例句柄并
//        创建和显示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{hInst = hInstance; // 将实例句柄存储在全局变量中/*HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
*/HWND hWnd = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG_CALC), NULL, CalcDialog);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 szTextBuffer[256] = { 0 };
//参与运算的两个数
float Value1 = 0;
float Value2 = 0;
//临时存放每一位的数组
float TempValue[4][8] = { 0 };
//数组索引和数组有多长的标记
int nFlag1 = 0;
int nFlag2 = 0;//第一个数整数和小数部分标记
int nFlag3 = 0;
int nFlag4 = 0;//第二个数整数和小数部分标记
//切换第一个数和第二个数以及负数和浮点数的标记
int nSwitch = 0;
int fSwitch1 = 0;
int fSwitch2 = 0;
int eSwitch = 0;
//运算符标记(+:1 -:2 *:3 /:4 )
int nOperation = 0;
//连续运算的标记
int cFlag = 0;
//结果值
float nRet = 0;//宏定义
#define OPERATION_ADD 1
#define OPERATION_SUB 2
#define OPERATION_IMUL 3
#define OPERATION_IDIV 4
#define OPERATION_FLOAT 5
INT_PTR CALLBACK CalcDialog(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_0:{if (nSwitch == 0)//第一个数{if (fSwitch1 == 0)//判断是不是浮点数{//在数组中存入当前选中的数字TempValue[0][nFlag1] = 0;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"0");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[1][nFlag2] = 0;nFlag2++;wcscat(szTextBuffer, L"0");SetWindowText(hEditText, szTextBuffer);}}//第二个数else{if (fSwitch2 == 0){//在数组中存入当前选中的数字TempValue[2][nFlag3] = 0;//后移索引nFlag3++;//显示内容的拼接wcscat(szTextBuffer, L"0");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[3][nFlag4] = 0;nFlag4++;wcscat(szTextBuffer, L"0");SetWindowText(hEditText, szTextBuffer);}}break;}case IDC_BUTTON_1:{if (nSwitch == 0)//第一个数{if (fSwitch1 == 0)//判断是不是浮点数{//在数组中存入当前选中的数字TempValue[0][nFlag1] = 1;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"1");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[1][nFlag2] = 1;nFlag2++;wcscat(szTextBuffer, L"1");SetWindowText(hEditText, szTextBuffer);}}//第二个数else{if (fSwitch2 == 0){//在数组中存入当前选中的数字TempValue[2][nFlag3] = 1;//后移索引nFlag3++;//显示内容的拼接wcscat(szTextBuffer, L"1");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[3][nFlag4] = 1;nFlag4++;wcscat(szTextBuffer, L"1");SetWindowText(hEditText, szTextBuffer);}}break;}case IDC_BUTTON_2:{if (nSwitch == 0)//第一个数{if (fSwitch1 == 0)//判断是不是浮点数{//在数组中存入当前选中的数字TempValue[0][nFlag1] = 2;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"2");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[1][nFlag2] = 2;nFlag2++;wcscat(szTextBuffer, L"2");SetWindowText(hEditText, szTextBuffer);}}//第二个数else{if (fSwitch2 == 0){//在数组中存入当前选中的数字TempValue[2][nFlag3] = 2;//后移索引nFlag3++;//显示内容的拼接wcscat(szTextBuffer, L"2");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[3][nFlag4] = 2;nFlag4++;wcscat(szTextBuffer, L"2");SetWindowText(hEditText, szTextBuffer);}}break;}case IDC_BUTTON_3:{if (nSwitch == 0)//第一个数{if (fSwitch1 == 0)//判断是不是浮点数{//在数组中存入当前选中的数字TempValue[0][nFlag1] = 3;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"3");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[1][nFlag2] = 3;nFlag2++;wcscat(szTextBuffer, L"3");SetWindowText(hEditText, szTextBuffer);}}//第二个数else{if (fSwitch2 == 0){//在数组中存入当前选中的数字TempValue[2][nFlag3] = 3;//后移索引nFlag3++;//显示内容的拼接wcscat(szTextBuffer, L"3");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[3][nFlag4] = 3;nFlag4++;wcscat(szTextBuffer, L"3");SetWindowText(hEditText, szTextBuffer);}}break;}case IDC_BUTTON_4:{if (nSwitch == 0)//第一个数{if (fSwitch1 == 0)//判断是不是浮点数{//在数组中存入当前选中的数字TempValue[0][nFlag1] = 4;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"4");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[1][nFlag2] = 4;nFlag2++;wcscat(szTextBuffer, L"4");SetWindowText(hEditText, szTextBuffer);}}//第二个数else{if (fSwitch2 == 0){//在数组中存入当前选中的数字TempValue[2][nFlag3] = 4;//后移索引nFlag3++;//显示内容的拼接wcscat(szTextBuffer, L"4");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[3][nFlag4] = 4;nFlag4++;wcscat(szTextBuffer, L"4");SetWindowText(hEditText, szTextBuffer);}}break;}case IDC_BUTTON_5:{if (nSwitch == 0)//第一个数{if (fSwitch1 == 0)//判断是不是浮点数{//在数组中存入当前选中的数字TempValue[0][nFlag1] = 5;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"5");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[1][nFlag2] = 5;nFlag2++;wcscat(szTextBuffer, L"5");SetWindowText(hEditText, szTextBuffer);}}//第二个数else{if (fSwitch2 == 0){//在数组中存入当前选中的数字TempValue[2][nFlag3] = 5;//后移索引nFlag3++;//显示内容的拼接wcscat(szTextBuffer, L"5");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[3][nFlag4] = 5;nFlag4++;wcscat(szTextBuffer, L"5");SetWindowText(hEditText, szTextBuffer);}}break;}case IDC_BUTTON_6:{if (nSwitch == 0)//第一个数{if (fSwitch1 == 0)//判断是不是浮点数{//在数组中存入当前选中的数字TempValue[0][nFlag1] = 6;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"6");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[1][nFlag2] = 6;nFlag2++;wcscat(szTextBuffer, L"6");SetWindowText(hEditText, szTextBuffer);}}//第二个数else{if (fSwitch2 == 0){//在数组中存入当前选中的数字TempValue[2][nFlag3] = 6;//后移索引nFlag3++;//显示内容的拼接wcscat(szTextBuffer, L"6");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[3][nFlag4] = 6;nFlag4++;wcscat(szTextBuffer, L"6");SetWindowText(hEditText, szTextBuffer);}}break;}case IDC_BUTTON_7:{if (nSwitch == 0)//第一个数{if (fSwitch1 == 0)//判断是不是浮点数{//在数组中存入当前选中的数字TempValue[0][nFlag1] = 7;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"7");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[1][nFlag2] = 7;nFlag2++;wcscat(szTextBuffer, L"7");SetWindowText(hEditText, szTextBuffer);}}//第二个数else{if (fSwitch2 == 0){//在数组中存入当前选中的数字TempValue[2][nFlag3] = 7;//后移索引nFlag3++;//显示内容的拼接wcscat(szTextBuffer, L"7");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[3][nFlag4] = 7;nFlag4++;wcscat(szTextBuffer, L"7");SetWindowText(hEditText, szTextBuffer);}}break;}case IDC_BUTTON_8:{if(nSwitch == 0)//第一个数{ if (fSwitch1 == 0)//判断是不是浮点数{//在数组中存入当前选中的数字TempValue[0][nFlag1] = 8;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"8");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[1][nFlag2] = 8;nFlag2++;wcscat(szTextBuffer, L"8");SetWindowText(hEditText, szTextBuffer);}}//第二个数else{if (fSwitch2 == 0){//在数组中存入当前选中的数字TempValue[2][nFlag3] = 8;//后移索引nFlag3++;//显示内容的拼接wcscat(szTextBuffer, L"8");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[3][nFlag4] = 8;nFlag4++;wcscat(szTextBuffer, L"8");SetWindowText(hEditText, szTextBuffer);}}break;}case IDC_BUTTON_9:{//第一个数if (nSwitch == 0){if (fSwitch1 == 0){//在数组中存入当前选中的数字TempValue[0][nFlag1] = 9;//后移索引nFlag1++;//显示内容的拼接wcscat(szTextBuffer, L"9");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[1][nFlag2] = 9;nFlag2++;wcscat(szTextBuffer, L"9");SetWindowText(hEditText, szTextBuffer);}}//第二个数else{if (fSwitch2 == 0){//在数组中存入当前选中的数字TempValue[2][nFlag3] = 9;//后移索引nFlag3++;//显示内容的拼接wcscat(szTextBuffer, L"9");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);}else{TempValue[3][nFlag4] = 9;nFlag4++;wcscat(szTextBuffer, L"9");SetWindowText(hEditText, szTextBuffer);}}break;}case IDC_BUTTON_DEL:{Value1 = 0;Value2 = 0;TempValue[4][0] = { 0 };nFlag1 = 0;nFlag2 = 0;nFlag3 = 0;nFlag4 = 0;nSwitch = 0;eSwitch = 0;fSwitch1 = 0;fSwitch2 = 0;nOperation = 0;nRet = 0;cFlag = 0;memset(szTextBuffer, 0, 256);SetWindowText(hEditText, szTextBuffer);break;}case IDC_BUTTON_RET:{int nCoefficient = 1;if (cFlag == 0){//数组输入的数字决定要*10的几倍,得到最终的数for (int i = nFlag1 - 1; i >= 0; i--){//123 3 * 1 2 * 10 1 * 100Value1 += (TempValue[0][i] * nCoefficient);//系数增长nCoefficient *= 10;}nCoefficient = 10;for (int i = 0; i < nFlag2; i++){float neg = TempValue[1][i] / nCoefficient;Value1 += neg;nCoefficient *= 10;}if (eSwitch == 1){Value1 -= 2 * Value1;}}nCoefficient = 1;for (int i = nFlag3 - 1; i >= 0; i--){//123 3 * 1 2 * 10 1 * 100Value2 += (TempValue[2][i] * nCoefficient);//系数增长nCoefficient *= 10;}nCoefficient = 10;for (int i = 0; i < nFlag4; i++){Value2 += (TempValue[3][i] / nCoefficient);nCoefficient *= 10;}if (eSwitch == 2){Value2 -= 2 * Value2;}switch (nOperation){case OPERATION_ADD:{nRet = Value1 + Value2;break;}case OPERATION_SUB:{nRet = Value1 - Value2;break;}case OPERATION_IMUL:{nRet = Value1 * Value2;break;}case OPERATION_IDIV:{nRet = Value1 / Value2;break;}}WCHAR szRetBuffer[50] = { 0 };swprintf(szRetBuffer, 50, L"=%f", nRet);wcscat(szTextBuffer, szRetBuffer);SetWindowText(hEditText, szTextBuffer);Value1 = nRet;Value2 = 0;nFlag1 = 0;nFlag2 = 0;nFlag3 = 0;nFlag4 = 0;nSwitch = 1;cFlag = 1;break;}case IDC_BUTTON_ADD:{//标记运算符nOperation = OPERATION_ADD;//切换输入的数字nSwitch = 1;//显示内容的拼接wcscat(szTextBuffer, L"+");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);break;}case IDC_BUTTON_SUB:{//标记运算符nOperation = OPERATION_SUB;//切换输入的数字nSwitch = 1;//显示内容的拼接wcscat(szTextBuffer, L"-");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);break;}case IDC_BUTTON_IMUL:{//标记运算符nOperation = OPERATION_IMUL;//切换输入的数字nSwitch = 1;//显示内容的拼接wcscat(szTextBuffer, L"*");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);break;}case IDC_BUTTON_IDIV:{//标记运算符nOperation = OPERATION_IDIV;//切换输入的数字nSwitch = 1;//显示内容的拼接wcscat(szTextBuffer, L"/");//发送消息显示到EDITSetWindowText(hEditText, szTextBuffer);break;}case IDC_BUTTON_POINT://切换第一个数和第二个数浮点数状态{if (nSwitch == 0) //第一个数{fSwitch1 = 1;}else//第二个数{fSwitch2 = 1;}wcscat(szTextBuffer, L".");SetWindowText(hEditText, szTextBuffer);break;}case IDC_BUTTON_ENG:{if (nSwitch == 0) //第一个数{eSwitch = 1;}else//第二个数{eSwitch = 2;}wcscat(szTextBuffer, L"-");SetWindowText(hEditText, szTextBuffer);break;}default:break;}break;}default:break;}break;}case WM_CLOSE:{EndDialog(hDlg, 0);PostQuitMessage(0);return TRUE;}}return (INT_PTR)FALSE;
}//
//  函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  目标: 处理主窗口的消息。
//
//  WM_COMMAND  - 处理应用程序菜单
//  WM_PAINT    - 绘制主窗口
//  WM_DESTROY  - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{switch (message){case WM_COMMAND:{int wmId = LOWORD(wParam);// 分析菜单选择:switch (wmId){case IDM_ABOUT:DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);break;case IDM_EXIT:DestroyWindow(hWnd);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}}break;case WM_PAINT:{PAINTSTRUCT ps;HDC hdc = BeginPaint(hWnd, &ps);// TODO: 在此处添加使用 hdc 的任何绘图代码...EndPaint(hWnd, &ps);}break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;
}// “关于”框的消息处理程序。
INT_PTR CALLBACK About(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;}return (INT_PTR)FALSE;
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch构建网络模型结构都有哪些方式

目录 前言 1.使用nn.Module基类 2.使用nn.Sequential容器 3. 使用nn.ModuleList 4. 使用nn.ModuleDict 5. 混合使用nn.Module和原生Python代码 6.表格总结 前言 nn.Module&#xff1a;最通用、最灵活的方式&#xff0c;适用于几乎所有场景。nn.Sequential&#xff1a;适…

【HTML】为网页添加表单(控件)

1、表单 表单控件&#xff1a;包含了具体的表单功能项&#xff0c;如单行文本输入框、密码输入框、复选框、提交按钮、重置按钮等。 提示信息&#xff1a;一个表单中通常需要包含一些说明性的文字&#xff0c;提示用户进行填写和操作。 表单域&#xff1a;相当于一个容器&…

改造小蚁摄像头支持免费无限容量云储存(Samba挂载篇)

为什么要改造&#xff1f; 插卡摄像头最大的一个问题就是频繁的读写会导致内存卡寿命急速下降&#xff0c;哪怕是市面上支持NAS转存的摄像头也是先录制到SD卡里&#xff0c;然后把SD卡上的视频再转存到NAS。同样对内存卡和NAS硬盘寿命都是损耗巨大。而这类监控视频绝大多数情况…

深入理解Elasticsearch:让搜索性能飞起来!

Elasticsearch 概述 Elasticsearch是一个基于lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。 ELK 技术栈是Elasticsearch、Logstash、Kibana三大开元框架首字母大写简称。 而Elasticsearch 是一个开源的高扩展的分布式全文搜索引擎&#xff0c; 是整个 ELK技术…

ue5远程渲染和本地渲染的区别,及云渲染的联系

UE5这款引擎以其令人惊叹的渲染能力&#xff0c;为游戏开发者们打开了一扇通往视觉盛宴的大门。但是在UE5的世界里&#xff0c;渲染技术其实还有着本地渲染和远程渲染之分&#xff0c;而且它们与时下大热的云渲染技术也有着千丝万缕的联系。本文主要说明UE5中的远程渲染和本地渲…

Flask+LayUI开发手记(四):弹出层实现增删改查功能

在上一节用dataTable实现数据列表时&#xff0c;已经加了表头工具栏和表内工具栏&#xff0c;栏内的按钮功能都是用来完成数据的增删改查了&#xff0c;这又分成两类功能&#xff0c;一类是删除或设置&#xff0c;这类功能简单&#xff0c;只需要选定记录&#xff0c;然后提交到…

golang RSA 解密前端jsencrypt发送的数据时异常 crypto/rsa: decryption error 解决方法

golang中 RSA解密前端&#xff08;jsencrypt&#xff09;发来的密文后出现 "crypto/rsa: decryption error" &#xff0c; 这个问题首先需要确认你的私匙和公匙是否匹配&#xff0c; 如果匹配 那检查入参数据类型&#xff0c; 前端发送来的rsa加密后的数据一般都是…

【算法进阶2-动态规划】斐波那契数列(递归调用、动态规划)、钢条切割问题(自定而下实现、自底向上、切割方案)

1 斐波那契数 2 钢条切割问题 2.1 最优解情况 2.2 钢条切割问题之自定而下实现 2.3 钢条切割问题之自底向上实现 2.4 钢条切割问题-重构解-切割方案 1 斐波那契数 # 1 子问题的重复计算 def fibonacci(n: int) -> int:"""使用递归方式计算第 n 个斐波那契数…

初识C语言指针(4)

目录 1. 字符指针变量 2. 数组指针变量 3. ⼆维数组传参的本质 4. 函数指针变量 5. typedef 关键字 6. 函数指针数组 结语 1. 字符指针变量 字符指针变量就是存储字符或字符串首字符地址的变量&#xff0c;字符指针变量有2种使用方式。 最常用的使用方式&#xff1a…

Datawhale X 李宏毅苹果书 AI夏令营(深度学习入门)task3

实践方法论 在应用机器学习算法时&#xff0c;实践方法论能够帮助我们更好地训练模型。如果在 Kaggle 上的结果不太好&#xff0c;虽然 Kaggle 上呈现的是测试数据的结果&#xff0c;但要先检查训练数据的损失。看看模型在训练数据上面&#xff0c;有没有学起来&#xff0c;再…

智能手机摄影综评:品牌联名与自建影像品牌的战略分析

随着智能手机摄影技术的飞速发展&#xff0c;各大厂商不仅与知名摄影品牌展开合作&#xff0c;还通过自建影像品牌来提升产品的摄影能力和品牌形象。本文将重点分析小米、华为、荣耀、OPPO、Vivo和苹果在摄影品牌联名与自建影像品牌方面的战略&#xff0c;探讨这些策略如何影响…

【案例55】WebSphere非root用户启动方案

问题背景 很多项目为了安全因素考虑&#xff0c;想让在Linux服务器中启动的程序都用非root用户启动。 解决方案 创建用户和组 现在我们用 root 用户登录&#xff0c;并创建用户和组。 ##创建用户 [rootnc-test ~]# useradd wasadmin##修改密码 [rootnc-test~]# passwd was…

Python优化算法16——鲸鱼优化算法(WOA)

科研里面优化算法都用的多&#xff0c;尤其是各种动物园里面的智能仿生优化算法&#xff0c;但是目前都是MATLAB的代码多&#xff0c;python几乎没有什么包&#xff0c;这次把优化算法系列的代码都从底层手写开始。 需要看以前的优化算法文章可以参考&#xff1a;Python优化算…

【学习笔记】技术分析-华为智驾控制器MDC Pro 610分析

华为的智能驾驶控制器一直在迭代&#xff0c;和网络上广泛披露的早期MDC 610相比&#xff0c;华为 MDC Pro 610 智能驾驶控制器&#xff0c;现在的样品设计采用了海思的双系统级芯片 (SoC) 提高了处理能力&#xff0c;三星的存储模块为无缝数据处理提供了充足的内存&#xff0c…

一分钟制作电子版的招生简章

​在当今信息化社会&#xff0c;快速、高效地传播信息显得尤为重要。招生简章作为学校、机构招生的重要宣传材料&#xff0c;其电子版制作更是需要简洁明了、吸引眼球。一分钟你就能制作出一份精美的电子版招生简章。让我们一起来看看&#xff0c;如何实现这一目标。 1.要制作电…

Linux 可视化管理工具:Webmin

&#x1f600;前言 在 Linux 系统的运维管理中&#xff0c;命令行界面&#xff08;CLI&#xff09;是主要的操作方式。然而&#xff0c;对于许多系统管理员或开发者来说&#xff0c;使用 CLI 进行管理和维护任务并不总是最直观或最方便的方式。为了简化操作并提高效率&#xff…

今天你City了吗?维乐Angel Revo带你穿梭都市自由随风~

当7月的热浪在都市中翻滚&#xff0c;你是否渴望逃离钢筋水泥的束缚&#xff0c;寻找一片属于自己的绿意盎然&#xff1f;今天你City了吗&#xff1f;快带上VELO Angel Revo一起抓住夏日的尾巴&#xff0c;用一场骑行与这座城市的风景共舞&#xff01;      轻巧出行&#…

面向对象编程:深入PHP的封装、继承和多态性!

文章目录 面向对象OOP的核心概念定义类、创建对象构造函数和析构函数访问修饰符继承方法重写接口和抽象类静态方法和属性魔术方法 错误处理错误处理概述错误级别异常处理自定义异常设置错误处理忽略错误错误日志断言 总结 面向对象编程&#xff08;OOP&#xff09;是一种编程范…

海绵城市雨水监测系统简介

海绵城市雨水监测系统主要有&#xff1a;数据采集、无线数据传输、后台云服务、终端平台显示等部分组成。系统通过前端数据采集水质&#xff08;ss\cod\浊度、PH等&#xff09;、雨水雨量、流量、水位、土壤湿度、气象等数据。通过无线数据传输通讯&#xff08;4G、5G、以太网、…

洞见数据价值,激活组织活力,让决策更精准的智慧交通开源了。

智慧交通视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用户只需在界面上…