教你如何用MFC编写计算器(WIN32版本)

1.效果图

2.主要代码

#include "Calc.h"

int WINAPI  WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, LPSTR lpCmdLine, int nCmdShow)
{
	g_hInstance = hInstance;

	//弹出一个对话框
	DialogBox(hInstance, MAKEINTRESOURCE(IDD_MAIN_DLG), NULL, MainProc);


	return 0;
}

//对话框处理函数
BOOL CALLBACK MainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_INITDIALOG://对话框初始化消息
		OnInitDialog(hWnd);
		break;
	case WM_COMMAND://命令消息
	{
		switch (LOWORD(wParam))
		{
		case IDC_BTN_CLEAR://清零
			OnBtnClear(hWnd);
			break;
		case IDC_BTN_BACK://退格
			OnBack(hWnd);
			break;
		case IDC_BTN_0://0
			OnBtn0(hWnd);
			break;
		case IDC_BTN_1://1
			OnBtn1(hWnd);
			break;
		case IDC_BTN_2://2
			OnBtn2(hWnd);
			break;
		case IDC_BTN_3://3
			OnBtn3(hWnd);
			break;
		case IDC_BTN_4://4
			OnBtn4(hWnd);
			break;
		case IDC_BTN_5://5
			OnBtn5(hWnd);
			break;
		case IDC_BTN_6://6
			OnBtn6(hWnd);
			break;
		case IDC_BTN_7://7
			OnBtn7(hWnd);
			break;
		case IDC_BTN_8://8
			OnBtn8(hWnd);
			break;
		case IDC_BTN_9://9
			OnBtn9(hWnd);
			break;
		case IDC_BTN_DOT://9
			OnBtnDot(hWnd);
			break;
		case IDC_BTN_ADD://加
			OnBtnAdd(hWnd);
			break;
		case IDC_BTN_SUB://减去
			OnBtnSub(hWnd);
			break;
		case IDC_BTN_MUL://乘法
			OnBtnMul(hWnd);
			break;
		case IDC_BTN_CHU://除法
			OnBtnChu(hWnd);
			break;
		case IDC_BTN_EQUAL://等于
			OnBtnEqual(hWnd);
			break;
		}
		break;
	}
	case WM_CLOSE:
		EndDialog(hWnd,IDCANCEL);
		return TRUE;
	}

	return FALSE;
}
//对话框初始化处理函数
void OnInitDialog(HWND hWnd)
{
	//加载一下图标
	HICON hIcon = LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_ICON1));
	SendMessage(hWnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
	SendMessage(hWnd, WM_SETICON, ICON_SMALL, (LPARAM)hIcon);

	//设置初始化显示文本
	SetDlgItemText(hWnd,IDC_STATIC_RESULT, L"0");
	//字体修改一下
	HFONT hFont = CreateFont(
		40,                        // nHeight
		0,                         // nWidth
		0,                         // nEscapement
		0,                         // nOrientation
		FW_NORMAL,                 // nWeight
		FALSE,                     // bItalic
		FALSE,                     // bUnderline
		0,                         // cStrikeOut
		ANSI_CHARSET,              // nCharSet
		OUT_DEFAULT_PRECIS,        // nOutPrecision
		CLIP_DEFAULT_PRECIS,       // nClipPrecision
		DEFAULT_QUALITY,           // nQuality
		DEFAULT_PITCH | FF_SWISS,  // nPitchAndFamily
		L"Arial");

	//设置字体
	HWND hResultStatic = GetDlgItem(hWnd,IDC_STATIC_RESULT);
	SendMessage(hResultStatic, WM_SETFONT, (WPARAM)hFont, NULL);
}

//清零处理函数
void OnBtnClear(HWND hWnd)
{
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_RESULT, L"0");
	SetDlgItemText(hWnd, IDC_STATIC_SHOW, L"0");
	//后面还要处理
	memset(szShowText, 0, sizeof(szShowText));
	memset(szResultText, 0, sizeof(szResultText));
	num1 = 0;
	num2 = 0;
	result = 0;
	symbol = 0;
}

//处理退格
void OnBack(HWND hWnd)
{
	//判断字符串是否为空
	if (wcslen(szResultText) == 0)
	{
		//设置初始化显示文本
		SetDlgItemText(hWnd, IDC_STATIC_RESULT, L"0");
	}
	else if (wcslen(szResultText) == 1)
	{
		szResultText[wcslen(szResultText) - 1] = L'\0';
		//设置初始化显示文本
		SetDlgItemText(hWnd, IDC_STATIC_RESULT, L"0");
	}
	else
	{
		szResultText[wcslen(szResultText) - 1] = L'\0';
		//设置初始化显示文本
		SetDlgItemText(hWnd, IDC_STATIC_RESULT, szResultText);
	}
}

//点处理函数
void OnBtnDot(HWND hWnd)
{
	//字符串连接
	wcscat(szResultText, L".");
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_RESULT, szResultText);
}

//0处理函数
void OnBtn0(HWND hWnd)
{
	//字符串连接
	wcscat(szResultText, L"0");
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_RESULT, szResultText);
}

//1处理函数
void OnBtn1(HWND hWnd)
{
	//字符串连接
	wcscat(szResultText, L"1");
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_RESULT, szResultText);
}

//2处理函数
void OnBtn2(HWND hWnd)
{
	//字符串连接
	wcscat(szResultText, L"2");
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_RESULT, szResultText);
}

//3处理函数
void OnBtn3(HWND hWnd)
{
	//字符串连接
	wcscat(szResultText, L"3");
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_RESULT, szResultText);
}

//4处理函数
void OnBtn4(HWND hWnd)
{
	//字符串连接
	wcscat(szResultText, L"4");
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_RESULT, szResultText);
}

//5处理函数
void OnBtn5(HWND hWnd)
{
	//字符串连接
	wcscat(szResultText, L"5");
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_RESULT, szResultText);
}

//6处理函数
void OnBtn6(HWND hWnd)
{
	//字符串连接
	wcscat(szResultText, L"6");
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_RESULT, szResultText);
}

//7处理函数
void OnBtn7(HWND hWnd)
{
	//字符串连接
	wcscat(szResultText, L"7");
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_RESULT, szResultText);
}

//8处理函数
void OnBtn8(HWND hWnd)
{
	//字符串连接
	wcscat(szResultText, L"8");
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_RESULT, szResultText);
}

//9处理函数
void OnBtn9(HWND hWnd)
{
	//字符串连接
	wcscat(szResultText, L"9");
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_RESULT, szResultText);
}

//加法处理函数
void OnBtnAdd(HWND hWnd)
{
	//获取第一个数
	if (wcslen(szResultText) != 0)
		num2 = _wtof(szResultText);
	else
		num2 = _wtof(szTemp);

	switch (symbol)
	{
	case '+':
		result = result + num2;
		break;
	case '-':
		result = result - num2;
		break;
	case '*':
		result = result * num2;
		break;
	case '/':
		result = result / num2;
		break;
	default:
		result = num2;
		break;
	}

	symbol = '+';

	//字符串连接
	//字符串连接
	if (wcslen(szResultText) != 0)
	{
		wcscat(szShowText, szResultText);
		wcscat(szShowText, L"+");
	}
	else
	{
		wcscat(szShowText, szTemp);
		wcscat(szShowText, L"+");
	}
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_SHOW, szShowText);

	//清空result
	memset(szResultText, 0, sizeof(szResultText));

	TCHAR szText[100];
	swprintf(szText, L"%f", result);
	RemoveDecimal(szText);
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_RESULT, szText);
}

//减法处理函数
void OnBtnSub(HWND hWnd)
{
	//获取第一个数
	if (wcslen(szResultText) != 0)
		num2 = _wtof(szResultText);
	else
		num2 = _wtof(szTemp);

	switch (symbol)
	{
	case '+':
		result = result + num2;
		break;
	case '-':
		result = result - num2;
		break;
	case '*':
		result = result * num2;
		break;
	case '/':
		result = result / num2;
		break;
	default:
		result = num2;
		break;
	}

	symbol = '-';

	//字符串连接
	//字符串连接
	if (wcslen(szResultText) != 0)
	{
		wcscat(szShowText, szResultText);
		wcscat(szShowText, L"-");
	}
	else
	{
		wcscat(szShowText, szTemp);
		wcscat(szShowText, L"-");
	}
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_SHOW, szShowText);

	//清空result
	memset(szResultText, 0, sizeof(szResultText));

	TCHAR szText[100];
	swprintf(szText, L"%f", result);
	RemoveDecimal(szText);
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_RESULT, szText);
}

//乘法处理函数
void OnBtnMul(HWND hWnd)
{
	//获取第一个数
	if (wcslen(szResultText) != 0)
		num2 = _wtof(szResultText);
	else
		num2 = _wtof(szTemp);

	switch (symbol)
	{
	case '+':
		result = result + num2;
		break;
	case '-':
		result = result - num2;
		break;
	case '*':
		result = result * num2;
		break;
	case '/':
		result = result / num2;
		break;
	default:
		result = num2;
		break;
	}

	symbol = '*';

	//字符串连接
	if (wcslen(szResultText) != 0)
	{
		wcscat(szShowText, szResultText);
		wcscat(szShowText, L"*");
	}
	else
	{
		wcscat(szShowText, szTemp);
		wcscat(szShowText, L"*");
	}
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_SHOW, szShowText);

	//清空result
	memset(szResultText, 0, sizeof(szResultText));

	TCHAR szText[100];
	swprintf(szText, L"%f", result);
	RemoveDecimal(szText);
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_RESULT, szText);
}

//除法处理函数
void OnBtnChu(HWND hWnd)
{
	//获取第一个数
	if (wcslen(szResultText)!=0)
		num2 = _wtof(szResultText);
	else
		num2 = _wtof(szTemp);

	switch (symbol)
	{
	case '+':
		result = result + num2;
		break;
	case '-':
		result = result - num2;
		break;
	case '*':
		result = result * num2;
		break;
	case '/':
		result = result / num2;
		break;
	default:
		result = num2;
		break;
	}

	symbol = '/';


	//字符串连接
	if (wcslen(szResultText) != 0)
	{
		wcscat(szShowText, szResultText);
		wcscat(szShowText, L"/");
	}
	else
	{
		wcscat(szShowText, szTemp);
		wcscat(szShowText, L"/");
	}
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_SHOW, szShowText);

	//清空result
	memset(szResultText, 0, sizeof(szResultText));

	TCHAR szText[100];
	swprintf(szText, L"%f", result);
	RemoveDecimal(szText);
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_RESULT, szText);
}


//等于处理函数
void OnBtnEqual(HWND hWnd)
{
	//清除上面的文本
	memset(szShowText, 0, sizeof(szShowText));
	//清除原来结果
	SetDlgItemText(hWnd, IDC_STATIC_SHOW, szShowText);

	//获取第一个数
	num2 = _wtof(szResultText);

	switch (symbol)
	{
	case '+':
		result = result + num2;
		break;
	case '-':
		result = result - num2;
		break;
	case '*':
		result = result * num2;
		break;
	case '/':
		result = result / num2;
		break;
	}	

	TCHAR szText[100];
	swprintf(szText, L"%f", result);
	RemoveDecimal(szText);
	//设置初始化显示文本
	SetDlgItemText(hWnd, IDC_STATIC_RESULT, szText);
	//赋值给结果文本
	wcscpy(szResultText, szText);
	//清除结果文本
	wcscpy(szTemp, szResultText);
	memset(szResultText, 0, sizeof(szResultText));
	//result = 0;

	//清除符号
	symbol = 0;
}

//去除多余的小数位
wchar_t* RemoveDecimal(wchar_t* szResultText)
{
	//"123.0000000"
	for (int i = wcslen(szResultText) - 1; i >= 0; i--)
	{
		if (szResultText[i] == L'0')
		{
			szResultText[i] = L'\0';

			if (szResultText[i - 1] == L'.')
			{
				szResultText[i-1] = L'\0';
				break;
			}
		}
		else
		{
			break;
		}
	}

	return szResultText;
}

 3.完整代码获取,C/C++学习交流:https://jq.qq.com/?_wv=1027&k=Xm4p7P15icon-default.png?t=LA46https://jq.qq.com/?_wv=1027&k=Xm4p7P15

猜你喜欢

转载自blog.csdn.net/qq958948605/article/details/121216422