win32 写简单的计算器

3 篇文章 0 订阅

大约两年前自己写了一个界面,(那个时候刚学WINDOWS编程)后面没有完成,现在接下把它完成,零散地用了两三个小时只写一个简单的计算器,自己记一下:

下面是文件设置

VS下的文件

 

main.cpp 代码如下:

#include <Windows.h>
#include <tchar.h>
#include<stdlib.h>
#include <locale>
#include <cmath>
#include "resource.h"
#include <string>

using namespace std;
INT_PTR CALLBACK DialogProc(
	_In_ HWND   hwndDlg,
	_In_ UINT   uMsg,
	_In_ WPARAM wParam,
	_In_ LPARAM lParam
);
enum tagOperator {
	ADD,MINUS,MULTIPLY,DIVIDE,EQUALS,SQRT
	} iOperator;

int WINAPI wWinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPWSTR lpCmdLine,
	int nCmdShow)
{
	
	DialogBox(hInstance, MAKEINTATOM(IDD_DLGCALCULATOR), NULL, DialogProc);
	return 0;
}

INT_PTR CALLBACK GetNumFromScreen(HWND hwndDlg, TCHAR * szBuffer)
{
	//如果函数调用成功,返回值为拷贝到缓冲区中的 TCHAR 字符个数(不包括结束空字符)。
				//如果函数调用失败,返回值为 0
	if (GetDlgItemText(hwndDlg, IDC_ETRES, szBuffer, 1024))
	{
		_locale_t fr = _create_locale(LC_NUMERIC, "zh-CN");
		return  _wtof_l(szBuffer, fr);
	}
	else {
		return 0;
	}
}

BOOL ShowNum(BOOL isFistNum, TCHAR * szBuffer)
{
	if (isFistNum)
	{
		memset(szBuffer, 0, sizeof(TCHAR));
	}
	isFistNum = FALSE;				
	return isFistNum;
}

INT_PTR CALLBACK DialogProc(
	_In_ HWND   hwndDlg,
	_In_ UINT   uMsg,
	_In_ WPARAM wParam,
	_In_ LPARAM lParam
) {
	static LPWSTR szBuffer = new TCHAR[1024];//用来存放显示结果
	//static TCHAR szBuffer[1024] = { 0 };//用来存放显示结果
	
	static double ResultNum;
	
	static BOOL isFistNum = TRUE;
	static int cxChar, cyChar;
	static RECT rect;
	/*PAINTSTRUCT ps;
	HDC hdc;*/
	static HWND hwndEdit = GetDlgItem(hwndDlg, IDC_ETRES);
	switch (uMsg)

	{
	case WM_CREATE:
		cxChar = LOWORD(GetDialogBaseUnits());
		cyChar = HIWORD(GetDialogBaseUnits());
		break;

	case WM_INITDIALOG:
		
		break;
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
			case IDC_BTN0:
				isFistNum = ShowNum(isFistNum, szBuffer);

				lstrcat(szBuffer, _T("0"));
				SetDlgItemText(hwndDlg, IDC_ETRES,szBuffer);				
				break;
			case IDC_BTN1:
				isFistNum = ShowNum(isFistNum, szBuffer);
				lstrcat(szBuffer, _T("1"));
				SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
				break;
			case IDC_BTN2:
				isFistNum = ShowNum(isFistNum, szBuffer);
				lstrcat(szBuffer, _T("2"));
				SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
				break;
			case IDC_BTN3:
				isFistNum = ShowNum(isFistNum, szBuffer);
				lstrcat(szBuffer, _T("3"));
				SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
				break;
			case IDC_BTN4:
				isFistNum = ShowNum(isFistNum, szBuffer);
				lstrcat(szBuffer, _T("4"));
				SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
				break;
			case IDC_BTN5:
				isFistNum = ShowNum(isFistNum, szBuffer);
				lstrcat(szBuffer, _T("5"));
				SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
				break;
			case IDC_BTN6:
				isFistNum = ShowNum(isFistNum, szBuffer);
				lstrcat(szBuffer, _T("6"));
				SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
				break;
			case IDC_BTN7:
				isFistNum = ShowNum(isFistNum, szBuffer);
				lstrcat(szBuffer, _T("7"));
				SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
				break;
			case IDC_BTN8:
				isFistNum = ShowNum(isFistNum, szBuffer);
				lstrcat(szBuffer, _T("8"));
				SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
				break;
			case IDC_BTN9:
				isFistNum = ShowNum(isFistNum, szBuffer);
				lstrcat(szBuffer, _T("9"));
				SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
				break;
			case IDC_BTNZERO:
				isFistNum = ShowNum(isFistNum, szBuffer);
				memset(szBuffer, '\0', sizeof(szBuffer));				
				SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
				break;
			case IDC_BTNDOT:
				lstrcat(szBuffer, _T("."));
				SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
				break;
			case IDC_BTNADD:
				iOperator = ADD;				
				ResultNum = GetNumFromScreen(hwndDlg, szBuffer);
				isFistNum = TRUE;
				break;
			case IDC_BTNMUN:
				iOperator = MINUS;
				ResultNum = GetNumFromScreen(hwndDlg, szBuffer);
				isFistNum = TRUE;
				break;
			case IDC_BTNMUL:
				iOperator = MULTIPLY;
				ResultNum = GetNumFromScreen(hwndDlg, szBuffer);
				isFistNum = TRUE;
				break;
			case IDC_BTNDIV:
				iOperator = DIVIDE;
				ResultNum = GetNumFromScreen(hwndDlg, szBuffer);
				isFistNum = TRUE;
				break;
			case IDC_BTNSQRT:
				iOperator = SQRT;
				ResultNum = GetNumFromScreen(hwndDlg, szBuffer);
				break;
			case IDC_BTNEQU:
				double tempNum = GetNumFromScreen(hwndDlg, szBuffer);
				switch (iOperator)
				{
				case ADD:
					ResultNum += tempNum;
					break;
				case MINUS:
					ResultNum -= tempNum;
					break;
				case MULTIPLY:
					ResultNum *= tempNum;
					break;
				case DIVIDE:
					ResultNum /= tempNum;
					break;
				case SQRT:
					ResultNum = sqrt(ResultNum);
					break;

				default:
					ResultNum = tempNum;
					break;
				}
				/*string tempstr = to_string(ResultNum);*/
				memset(szBuffer, 0, sizeof(TCHAR));
				//szBuffer = to_string(ResultNum).c_str();
				wsprintf(szBuffer, _T("%S"), to_string(ResultNum).c_str());
				SetDlgItemText(hwndDlg, IDC_ETRES, szBuffer);
				//SetDlgItemInt(hwndDlg, IDC_ETRES, ResultNum,TRUE);
				isFistNum = TRUE;
				break;
				
		}
	
		break;
	case WM_PAINT:
		//InvalidateRect(hwndDlg, &rect, TRUE);
		//hdc = BeginPaint(hwndDlg, &ps);
		//SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));
		;
		//HPEN hpen1=(HPEN)SelectObject(hdc, hpen);*/
		//SetBkMode(hdc, TRANSPARENT);
		SetDlgItemText(hwndEdit, IDC_ETRES, szBuffer);
		//EndPaint(hwndDlg, &ps);
		break;
	case WM_CLOSE:
		EndDialog(hwndDlg, 0);
		break;
	default:
		break;
	}
	return 0;
}

calcu.rc 代码如下:

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"

/
#undef APSTUDIO_READONLY_SYMBOLS

/
// 中文(简体,中国) resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

#ifdef APSTUDIO_INVOKED
/
//
// TEXTINCLUDE
//

1 TEXTINCLUDE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE 
BEGIN
    "#include ""winres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/
//
// Dialog
//

IDD_DLGCALCULATOR DIALOGEX 0, 0, 297, 372
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "计算器"
FONT 9, "Microsoft YaHei UI", 400, 0, 0x0
BEGIN
    EDITTEXT        IDC_ETRES,15,14,266,52,ES_AUTOHSCROLL | ES_READONLY
    PUSHBUTTON      "CE",IDC_BTNZERO,18,86,45,37
    PUSHBUTTON      "←",IDC_BTNDEL,88,86,45,37
    PUSHBUTTON      "SQRT",IDC_BTNSQRT,158,86,45,37
    PUSHBUTTON      "÷",IDC_BTNDIV,228,86,45,37
    PUSHBUTTON      "7",IDC_BTN7,18,142,45,37
    PUSHBUTTON      "8",IDC_BTN8,88,142,45,37
    PUSHBUTTON      "9",IDC_BTN9,158,142,45,37
    PUSHBUTTON      "×",IDC_BTNMUL,228,142,45,37
    PUSHBUTTON      "4",IDC_BTN4,19,199,45,37
    PUSHBUTTON      "5",IDC_BTN5,89,199,45,37
    PUSHBUTTON      "6",IDC_BTN6,159,199,45,37
    PUSHBUTTON      "-",IDC_BTNMUN,229,199,45,37
    PUSHBUTTON      "1",IDC_BTN1,19,257,45,37
    PUSHBUTTON      "2",IDC_BTN2,89,257,45,37
    PUSHBUTTON      "3",IDC_BTN3,159,257,45,37
    PUSHBUTTON      "+",IDC_BTNADD,229,257,45,37
    PUSHBUTTON      "0",IDC_BTN0,20,310,113,37
    PUSHBUTTON      ".",IDC_BTNDOT,157,311,45,37
    PUSHBUTTON      "=",IDC_BTNEQU,230,310,45,37
END


/
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
    IDD_DLGCALCULATOR, DIALOG
    BEGIN
        LEFTMARGIN, 7
        RIGHTMARGIN, 290
        TOPMARGIN, 7
        BOTTOMMARGIN, 365
    END
END
#endif    // APSTUDIO_INVOKED


/
//
// AFX_DIALOG_LAYOUT
//

IDD_DLGCALCULATOR AFX_DIALOG_LAYOUT
BEGIN
    0
END

#endif    // 中文(简体,中国) resources
/

#ifndef APSTUDIO_INVOKED
/
//
// Generated from the TEXTINCLUDE 3 resource.
//


/
#endif    // not APSTUDIO_INVOKED

 

界面如下所示:

 

 

 

因为时间关系,显示字体和小数点现在还没有写好怎么处理,只弄了一个加减乘除,还有求算术平方根,因为最后的结果还是double,精度还是没有很好控制,另外显示字体也没有好好美化一下,算是半成品吧。

——最后吐槽一下,用C写界面真的很慢,mfc还好一点点,C#就很快了,开发效率不是相差一点点,可能是我比较菜的原因吧!

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用Java编Win10计算器,需要先了解计算器的基本功能和界面布局。计算器的基本功能包括加、减、乘、除四则运算以及括号的支持。 首先,需要创建一个Java窗口应用程序。可以使用Java Swing或JavaFX作为界面库。通过创建一个主窗口,可以将计算器的界面元素放置在窗口上,例如按钮、文本框等。可以使用布局管理器来更好地控制界面元素的布局。 其次,可以创建不同的按钮来实现不同的功能,例如数字按钮、运算符按钮、清除按钮、等号按钮等。可以通过添加事件监听器来处理按钮的点击事件。当用户点击数字按钮时,应该将对应的数字显示在文本框中。当用户点击运算符按钮时,应该将运算符添加到文本框中。当用户点击等号按钮时,应该将文本框中的表达式进行计算,并将结果显示在文本框中。 在进行运算之前,需要将文本框中的表达式转换为可执行的代码。可以使用Java的动态编译功能,将表达式编译为可执行的代码。然后,通过调用编译后的代码执行计算操作,并将结果返回。 最后,需要处理异常情况,例如用户输入非法表达式、除数为零等。可以使用try-catch语句来捕获异常,并在界面上显示错误信息。 总之,通过使用Java的窗口应用程序和界面库,以及动态编译功能,可以实现一个Win10计算器。以适当的布局和事件处理,能够满足用户的基本计算需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值