#include <windows.h>
#include <stdio.h>
#include <string.h>
#define ID_BUTTON_0 100
#define ID_BUTTON_1 101
#define ID_BUTTON_2 102
#define ID_BUTTON_3 103
#define ID_BUTTON_4 104
#define ID_BUTTON_5 105
#define ID_BUTTON_6 106
#define ID_BUTTON_7 107
#define ID_BUTTON_8 108
#define ID_BUTTON_9 109
#define ID_BUTTON_ADD 110
#define ID_BUTTON_SUB 111
#define ID_BUTTON_MUL 112
#define ID_BUTTON_DIV 113
#define ID_BUTTON_EQUAL 114
#define ID_BUTTON_CLEAR 115
#define ID_BUTTON_DOT 116
#define ID_EDIT_DISPLAY 117
// 全局变量
double num1 = 0, num2 = 0, result = 0;
char operation = '\0';
BOOL newNumber = TRUE;
char displayText[50] = "0";
// 函数声明
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void CreateCalculatorControls(HWND hwnd);
void UpdateDisplay(HWND hEdit);
void HandleNumberClick(int number, HWND hEdit);
void HandleOperationClick(char op, HWND hEdit);
void CalculateResult(HWND hEdit);
void ClearCalculator(HWND hEdit);
// 主函数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
const char CLASS_NAME[] = "CalculatorClass";
WNDCLASS wc = {0};
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
wc.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wc);
// 创建窗口
HWND hwnd = CreateWindowEx(
0,
CLASS_NAME,
"C语言计算器",
WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX,
CW_USEDEFAULT, CW_USEDEFAULT, 300, 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 WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
static HWND hEdit;
switch (uMsg) {
case WM_CREATE:
CreateCalculatorControls(hwnd);
hEdit = GetDlgItem(hwnd, ID_EDIT_DISPLAY);
break;
case WM_COMMAND:
switch (LOWORD(wParam)) {
// 数字按钮
case ID_BUTTON_0: HandleNumberClick(0, hEdit); break;
case ID_BUTTON_1: HandleNumberClick(1, hEdit); break;
case ID_BUTTON_2: HandleNumberClick(2, hEdit); break;
case ID_BUTTON_3: HandleNumberClick(3, hEdit); break;
case ID_BUTTON_4: HandleNumberClick(4, hEdit); break;
case ID_BUTTON_5: HandleNumberClick(5, hEdit); break;
case ID_BUTTON_6: HandleNumberClick(6, hEdit); break;
case ID_BUTTON_7: HandleNumberClick(7, hEdit); break;
case ID_BUTTON_8: HandleNumberClick(8, hEdit); break;
case ID_BUTTON_9: HandleNumberClick(9, hEdit); break;
// 操作符按钮
case ID_BUTTON_ADD: HandleOperationClick('+', hEdit); break;
case ID_BUTTON_SUB: HandleOperationClick('-', hEdit); break;
case ID_BUTTON_MUL: HandleOperationClick('*', hEdit); break;
case ID_BUTTON_DIV: HandleOperationClick('/', hEdit); break;
// 功能按钮
case ID_BUTTON_EQUAL: CalculateResult(hEdit); break;
case ID_BUTTON_CLEAR: ClearCalculator(hEdit); break;
case ID_BUTTON_DOT:
if (strchr(displayText, '.') == NULL) {
strcat(displayText, ".");
UpdateDisplay(hEdit);
}
break;
}
break;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
// 创建计算器控件
void CreateCalculatorControls(HWND hwnd) {
int row, col; // 在函数开头声明循环变量
int index, width, x, y;
// 创建显示框
CreateWindow("EDIT", "0",
WS_CHILD | WS_VISIBLE | ES_RIGHT | ES_READONLY,
10, 10, 260, 30,
hwnd, (HMENU)ID_EDIT_DISPLAY,
NULL, NULL);
// 创建按钮
char* buttons[] = {
"7", "8", "9", "/",
"4", "5", "6", "*",
"1", "2", "3", "-",
"0", ".", "=", "+",
"C"
};
int ids[] = {
ID_BUTTON_7, ID_BUTTON_8, ID_BUTTON_9, ID_BUTTON_DIV,
ID_BUTTON_4, ID_BUTTON_5, ID_BUTTON_6, ID_BUTTON_MUL,
ID_BUTTON_1, ID_BUTTON_2, ID_BUTTON_3, ID_BUTTON_SUB,
ID_BUTTON_0, ID_BUTTON_DOT, ID_BUTTON_EQUAL, ID_BUTTON_ADD,
ID_BUTTON_CLEAR
};
// 使用传统的循环变量声明方式
row = 0;
for (row = 0; row < 5; row++) {
col = 0;
for (col = 0; col < 4; col++) {
index = row * 4 + col;
if (index >= 17) break;
width = (index == 16) ? 260 : 60; // 清除按钮宽度不同
x = 10 + col * 65;
y = 50 + row * 60;
if (index == 16) { // 清除按钮
x = 10;
width = 260;
}
CreateWindow("BUTTON", buttons[index],
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
x, y, width, 50,
hwnd, (HMENU)ids[index],
NULL, NULL);
}
}
}
// 更新显示
void UpdateDisplay(HWND hEdit) {
SetWindowText(hEdit, displayText);
}
// 处理数字点击
void HandleNumberClick(int number, HWND hEdit) {
if (newNumber) {
strcpy(displayText, "0");
newNumber = FALSE;
}
if (strcmp(displayText, "0") == 0) {
sprintf(displayText, "%d", number);
} else {
char temp[50];
sprintf(temp, "%s%d", displayText, number);
if (strlen(temp) < 20) { // 限制长度
strcpy(displayText, temp);
}
}
UpdateDisplay(hEdit);
}
// 处理操作符点击
void HandleOperationClick(char op, HWND hEdit) {
if (!newNumber) {
num1 = atof(displayText);
operation = op;
newNumber = TRUE;
}
}
// 计算结果
void CalculateResult(HWND hEdit) {
if (operation != '\0') {
num2 = atof(displayText);
switch (operation) {
case '+': result = num1 + num2; break;
case '-': result = num1 - num2; break;
case '*': result = num1 * num2; break;
case '/':
if (num2 != 0) {
result = num1 / num2;
} else {
MessageBox(NULL, "错误:除数不能为零!", "计算错误", MB_ICONERROR);
ClearCalculator(hEdit);
return;
}
break;
}
sprintf(displayText, "%.10g", result); // 格式化输出,避免多余的小数位
UpdateDisplay(hEdit);
operation = '\0';
newNumber = TRUE;
}
}
// 清除计算器
void ClearCalculator(HWND hEdit) {
num1 = 0;
num2 = 0;
result = 0;
operation = '\0';
newNumber = TRUE;
strcpy(displayText, "0");
UpdateDisplay(hEdit);
}
-----------------------------

3122

被折叠的 条评论
为什么被折叠?



