#include <windows.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
#define IDC_BUTTON_ADD 101
#define IDC_BUTTON_SUB 102
#define IDC_BUTTON_MUL 103
#define IDC_BUTTON_DIV 104
#define IDC_BUTTON_SQRT 105
#define IDC_BUTTON_POW 106
#define IDC_EDIT 107
#define IDC_BUTTON_CLEAR 108
#define IDC_BUTTON_BACKSPACE 109
#define IDC_BUTTON_EQUAL 110
#define IDC_BUTTON_DOT 111
#define IDC_BUTTON_SIGN 112
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
const char CLASS_NAME[] = "CalculatorClass";
WNDCLASS wc = { };
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
RegisterClass(&wc);
HWND hwnd = CreateWindowEx(
0,
CLASS_NAME,
"Scientific Calculator",
WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, 320, 400,
NULL, NULL, hInstance, NULL
);
if (hwnd == NULL) {
return 0;
}
ShowWindow(hwnd, nCmdShow);
UpdateWindow(hwnd);
MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
static double num1 = 0, num2 = 0, result = 0;
static char operation = '\0';
static BOOL isContinuous = FALSE;
static BOOL isDecimal = FALSE;
static int decimalPlaces = 0;
switch (msg) {
case WM_CREATE:
// 创建编辑框(显示区域)
CreateWindow("edit", "0", WS_CHILD | WS_VISIBLE | WS_BORDER | ES_RIGHT | ES_READONLY,
10, 10, 280, 40, hwnd, (HMENU)IDC_EDIT, NULL, NULL);
// 创建数字按钮
CreateWindow("button", "7", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 60, 50, 40, hwnd, (HMENU)'7', NULL, NULL);
CreateWindow("button", "8", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 70, 60, 50, 40, hwnd, (HMENU)'8', NULL, NULL);
CreateWindow("button", "9", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 130, 60, 50, 40, hwnd, (HMENU)'9', NULL, NULL);
CreateWindow("button", "4", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 110, 50, 40, hwnd, (HMENU)'4', NULL, NULL);
CreateWindow("button", "5", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 70, 110, 50, 40, hwnd, (HMENU)'5', NULL, NULL);
CreateWindow("button", "6", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 130, 110, 50, 40, hwnd, (HMENU)'6', NULL, NULL);
CreateWindow("button", "1", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 160, 50, 40, hwnd, (HMENU)'1', NULL, NULL);
CreateWindow("button", "2", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 70, 160, 50, 40, hwnd, (HMENU)'2', NULL, NULL);
CreateWindow("button", "3", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 130, 160, 50, 40, hwnd, (HMENU)'3', NULL, NULL);
CreateWindow("button", "0", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 210, 110, 40, hwnd, (HMENU)'0', NULL, NULL);
CreateWindow("button", ".", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 130, 210, 50, 40, hwnd, (HMENU)IDC_BUTTON_DOT, NULL, NULL);
CreateWindow("button", "+/-", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 190, 210, 50, 40, hwnd, (HMENU)IDC_BUTTON_SIGN, NULL, NULL);
// 操作符按钮
CreateWindow("button", "+", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 190, 60, 50, 40, hwnd, (HMENU)IDC_BUTTON_ADD, NULL, NULL);
CreateWindow("button", "-", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 190, 110, 50, 40, hwnd, (HMENU)IDC_BUTTON_SUB, NULL, NULL);
CreateWindow("button", "*", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 190, 160, 50, 40, hwnd, (HMENU)IDC_BUTTON_MUL, NULL, NULL);
CreateWindow("button", "/", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 250, 60, 50, 40, hwnd, (HMENU)IDC_BUTTON_DIV, NULL, NULL);
// 科学计算按钮
CreateWindow("button", "√", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 250, 110, 50, 40, hwnd, (HMENU)IDC_BUTTON_SQRT, NULL, NULL);
CreateWindow("button", "^", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 250, 160, 50, 40, hwnd, (HMENU)IDC_BUTTON_POW, NULL, NULL);
// 功能按钮
CreateWindow("button", "=", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 250, 210, 50, 40, hwnd, (HMENU)IDC_BUTTON_EQUAL, NULL, NULL);
CreateWindow("button", "C", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 260, 70, 40, hwnd, (HMENU)IDC_BUTTON_CLEAR, NULL, NULL);
CreateWindow("button", "←", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 90, 260, 70, 40, hwnd, (HMENU)IDC_BUTTON_BACKSPACE, NULL, NULL);
break;
case WM_COMMAND:
char buffer[256];
GetDlgItemText(hwnd, IDC_EDIT, buffer, sizeof(buffer));
// 处理数字输入
if (LOWORD(wParam) >= '0' && LOWORD(wParam) <= '9') {
if (strcmp(buffer, "0") == 0 || isContinuous) {
buffer[0] = '\0';
isContinuous = FALSE;
}
char digit[2] = { (char)LOWORD(wParam), '\0' };
strcat(buffer, digit);
SetDlgItemText(hwnd, IDC_EDIT, buffer);
break;
}
switch (LOWORD(wParam)) {
case IDC_BUTTON_DOT: // 小数点
if (!strchr(buffer, '.')) {
strcat(buffer, ".");
SetDlgItemText(hwnd, IDC_EDIT, buffer);
}
break;
case IDC_BUTTON_SIGN: // 正负号
if (buffer[0] != '\0') {
double num = atof(buffer);
num = -num;
sprintf(buffer, "%.6g", num);
SetDlgItemText(hwnd, IDC_EDIT, buffer);
}
break;
case IDC_BUTTON_CLEAR: // 清除
SetDlgItemText(hwnd, IDC_EDIT, "0");
num1 = num2 = result = 0;
operation = '\0';
isContinuous = FALSE;
isDecimal = FALSE;
decimalPlaces = 0;
break;
case IDC_BUTTON_BACKSPACE: // 退格
if (strlen(buffer) > 0) {
buffer[strlen(buffer) - 1] = '\0';
if (strlen(buffer) == 0) strcpy(buffer, "0");
SetDlgItemText(hwnd, IDC_EDIT, buffer);
}
break;
case IDC_BUTTON_ADD: // 加法
case IDC_BUTTON_SUB: // 减法
case IDC_BUTTON_MUL: // 乘法
case IDC_BUTTON_DIV: // 除法
case IDC_BUTTON_POW: // 乘方
if (isContinuous) {
num1 = result;
} else {
num1 = atof(buffer);
}
operation = LOWORD(wParam);
SetDlgItemText(hwnd, IDC_EDIT, "");
isContinuous = FALSE;
break;
case IDC_BUTTON_SQRT: // 开方
num1 = atof(buffer);
if (num1 >= 0) {
result = sqrt(num1);
sprintf(buffer, "%.6g", result);
SetDlgItemText(hwnd, IDC_EDIT, buffer);
num1 = result;
isContinuous = TRUE;
} else {
MessageBox(hwnd, "Cannot calculate square root of negative number", "Error", MB_OK | MB_ICONERROR);
}
break;
case IDC_BUTTON_EQUAL: // 等号
num2 = atof(buffer);
switch (operation) {
case IDC_BUTTON_ADD:
result = num1 + num2;
break;
case IDC_BUTTON_SUB:
result = num1 - num2;
break;
case IDC_BUTTON_MUL:
result = num1 * num2;
break;
case IDC_BUTTON_DIV:
if (num2 != 0.0) {
result = num1 / num2;
} else {
MessageBox(hwnd, "Division by zero is not allowed", "Error", MB_OK | MB_ICONERROR);
return 0;
}
break;
case IDC_BUTTON_POW:
result = pow(num1, num2);
break;
default:
result = num2; // 没有操作符时直接显示当前值
break;
}
// 格式化显示结果
if (fabs(result) < 1e10 && fabs(result) > 1e-5) {
sprintf(buffer, "%.6g", result);
} else {
sprintf(buffer, "%.6e", result);
}
SetDlgItemText(hwnd, IDC_EDIT, buffer);
num1 = result;
operation = '\0';
isContinuous = TRUE;
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
return 0;
}
104 9 C:\Users\朱明康\Desktop\5.c [Error] a label can only be part of a statement and a declaration is not a statement此步出错改进一下
最新发布