EMWIN 计算器的简单功能实现

这次学emwin也是模棱两可,个人有点想往嵌入式GUI方面学习,不知道前景好不好,学了一点之后就想简单的实现一些功能,主要目标值做一个可以在STM32F4开发板上运行的简单菜单界面。
这个是初步实现的页面
在这里插入图片描述
虽然感觉不怎么行,但我现在还就是这个水平(哈哈哈哈),个人自我感觉良好,可能审美不行,图片有点丑。。。。
做好页面之后就是实现各个功能了,目前就做了计算器和时钟。不过我主要做的是页面设置,计算表达式的功能就有点实现不了了,数据结构这门课没学好。。下面是我借鉴的这位兄弟的代码的链接。
c语言实现简单的计算机

我能把这个简单的功能做好,还是站在别人的肩膀上做的,看来还是有很多需要学习的。
下面是计算器实现的效果图
在这里插入图片描述
嗯,你没看错,很简洁明了,没有其他的什么,它就是一个计算器的页面。他的计算规则是这样的,
在这里插入图片描述
把你想要的计算的表达式一并写上,只有点击 “=” 按钮才能得出答案。不过这上面的键的功能并没有全部实现,求余符号“%”还有位运算“《”和“》”以及“+/-”符号的功能没有实现。至于这个计算器还有没有其他BUG还有待调试。

下面是主要代码


#include "DIALOG.h"
#include "WM.h"
#include "GUI.h"
#include "BUTTON.h"
#include "TEXT.h"
#include  <stdio.h>
#include <string.h>
#include "counter1.h"
#include <stdlib.h>

/* ------------------------------------自定义消息----------------------------------*/
#define  ID_BUTTON_10      (GUI_ID_USER + 0x20)
#define  ID_BUTTON_11      (GUI_ID_USER + 0x21)
#define  ID_BUTTON_12      (GUI_ID_USER + 0x22)
#define  ID_BUTTON_13      (GUI_ID_USER + 0x23)
#define  ID_BUTTON_14      (GUI_ID_USER + 0x24)
#define  ID_BUTTON_15      (GUI_ID_USER + 0x25)
#define  ID_BUTTON_16      (GUI_ID_USER + 0x26)
#define  ID_BUTTON_17      (GUI_ID_USER + 0x27)
#define  ID_BUTTON_18      (GUI_ID_USER + 0x28)
#define  ID_BUTTON_19      (GUI_ID_USER + 0x29)
#define  ID_BUTTON_20      (GUI_ID_USER + 0x2A)
#define  ID_BUTTON_21      (GUI_ID_USER + 0x2B)
#define  ID_BUTTON_22      (GUI_ID_USER + 0x2C)
#define  ID_BUTTON_23      (GUI_ID_USER + 0x2D)
#define  ID_BUTTON_24      (GUI_ID_USER + 0x2E)
#define  ID_BUTTON_25      (GUI_ID_USER + 0x2F)
#define  ID_BUTTON_26      (GUI_ID_USER + 0x30)
#define  ID_BUTTON_27      (GUI_ID_USER + 0x31)
#define  ID_BUTTON_28      (GUI_ID_USER + 0x32)
#define  ID_BUTTON_29      (GUI_ID_USER + 0x33)
#define  ID_BUTTON_30      (GUI_ID_USER + 0x34)
#define  ID_BUTTON_31      (GUI_ID_USER + 0x35)
#define  ID_BUTTON_32      (GUI_ID_USER + 0x36)
#define  ID_BUTTON_33      (GUI_ID_USER + 0x37)
#define  ID_BUTTON_34      (GUI_ID_USER + 0x38)

#define  ID_FRAMEWIN_1     (GUI_ID_USER + 0x39)
#define  ID_EDIT_0         (GUI_ID_USER + 0x3A)
#define  ID_TEXT_5         (GUI_ID_USER + 0x3B)

/*---------------------------------------------------------对话框创建-----------------------------------*/
static const GUI_WIDGET_CREATE_INFO _aDialogCreate[] = {
	{ WINDOW_CreateIndirect, "Window", ID_FRAMEWIN_1, 0, 0, 420, 320, 0, 0, 0 },
	{ EDIT_CreateIndirect, "Edit",   ID_EDIT_0,    20, 35, 360, 40, 0, 100, 0 },
	{ TEXT_CreateIndirect, "Text1",  ID_TEXT_5,     160, 0, 66, 22, 0, 0x64, 0 },

	{ BUTTON_CreateIndirect, "7", ID_BUTTON_10,  20,  100,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, "8", ID_BUTTON_11,  80,  100,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, "9", ID_BUTTON_12,  140, 100,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, "<<", ID_BUTTON_13,  200, 100,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, "C", ID_BUTTON_14,  260, 100,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, "", ID_BUTTON_15,  320, 100,  60, 50, 0, 0, 0 },

	{ BUTTON_CreateIndirect, "4", ID_BUTTON_16,  20,  150,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, "5", ID_BUTTON_17,	 80,  150,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, "6", ID_BUTTON_18,  140, 150,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, ">>", ID_BUTTON_19,  200, 150,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, "%", ID_BUTTON_20,  260, 150,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, "-", ID_BUTTON_21,  320, 150,  60, 50, 0, 0, 0 },

	{ BUTTON_CreateIndirect, "1", ID_BUTTON_27,  20,  200,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, "2", ID_BUTTON_22,  80,  200,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, "3", ID_BUTTON_23,  140, 200,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, "(", ID_BUTTON_24,  200, 200,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, "/", ID_BUTTON_25,  260, 200,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, "+", ID_BUTTON_26,  320, 200,  60, 50, 0, 0, 0 },
	
	{ BUTTON_CreateIndirect, "+/-", ID_BUTTON_28,  20,  250,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, "0", ID_BUTTON_29,  80,  250,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, ".", ID_BUTTON_30,  140, 250,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, ")", ID_BUTTON_31,  200, 250,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, "*", ID_BUTTON_32,  260, 250,  60, 50, 0, 0, 0 },
	{ BUTTON_CreateIndirect, "=", ID_BUTTON_33,  320, 250,  60, 50, 0, 0, 0 }

};
/*----------------------------------------------------功能函数模块-----------------------------------*/
char pbuffer1[20]; //全局定义字符数组,最终显示在EDIT 中的内容
static int i = 0;   //定义字符数组下表位置
void showtext(WM_HWIN hItem1, char pas)//EDIT显示函数
{
	pbuffer1[i] = pas;
	EDIT_SetText(WM_GetDialogItem(hItem1, ID_EDIT_0), pbuffer1);
	if (i == 18)i = 0;
	else  i++;
}
static int getanswer(WM_HWIN hItem1,char* str) //把计算的值显示在EDIT上
{
	for(int i=0;i<20;i++)
		if (str[i] == NULL)
		{
			str[i] = '#';
			break;
		}
	double q;
	char st[20];
	q = geta(str);
	int x;
	x = (double)q;
	itoa(x, st, 10);
	EDIT_SetText(WM_GetDialogItem(hItem1, ID_EDIT_0), st);

}

static void counterCE(void) //清空字符数组的值
{
	for (int j = 0; j < 20; j++)
		if (pbuffer1[j] != NULL)
			pbuffer1[j] = NULL;
	i = 0;  //下表重新设置为0

}

/*---------------------------------------------------------对话框的回调函数---------------------------*/
static void _cbBkButton(WM_MESSAGE* pMsg) {

	WM_HWIN hItem1;
	
	int Id, NCode;
	char pbuffer[2];  //放置按钮上的文本
	switch (pMsg->MsgId) {
	case WM_PAINT:
		break;
	case WM_INIT_DIALOG:
		hItem1 = WM_GetDialogItem(pMsg->hWin, ID_TEXT_5);     //初始化TEXT1
		TEXT_SetTextColor(hItem1,GUI_BLACK);
		TEXT_SetTextAlign(hItem1, GUI_TA_HCENTER | GUI_TA_TOP);
		TEXT_SetFont(hItem1, GUI_FONT_20_1);
		TEXT_SetText(hItem1, "counter");

		hItem1 = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0);     //初始化EDIT
		EDIT_SetTextAlign(hItem1,GUI_TA_BOTTOM | GUI_TA_RIGHT);
		EDIT_SetFont(hItem1, GUI_FONT_20_ASCII);
		EDIT_SetText(hItem1,"0");
		break;
	case WM_NOTIFY_PARENT:
		Id = WM_GetId(pMsg->hWinSrc);
		NCode = pMsg->Data.v;
		switch (Id)
		{
		case ID_BUTTON_10 :
		case ID_BUTTON_11:
		case ID_BUTTON_12:
		case ID_BUTTON_16:
		case ID_BUTTON_17:
		case ID_BUTTON_18:
		case ID_BUTTON_22 :
		case ID_BUTTON_27 :
		case ID_BUTTON_23 :
		case ID_BUTTON_29 :
		case ID_BUTTON_30 :
		case ID_BUTTON_20:
		case ID_BUTTON_21:
		case ID_BUTTON_25:
		case ID_BUTTON_26: 
		case ID_BUTTON_24: 
		case ID_BUTTON_32: 
		case ID_BUTTON_31:	
			switch (NCode)
			{
			case WM_NOTIFICATION_CLICKED://数字,运算符被点击
				
				hItem1 = WM_GetDialogItem(pMsg->hWin, Id);
				BUTTON_GetText(hItem1, pbuffer, 2);

				showtext(pMsg->hWin,pbuffer[0]);	//记录按钮上的文本		
				break;
			case WM_NOTIFICATION_RELEASED:
				break;
			}
			break;
		case  ID_BUTTON_15:
		case  ID_BUTTON_14:
			switch (NCode)
			{
			case WM_NOTIFICATION_CLICKED://C键和空白键被按
				counterCE();
				hItem1 = WM_GetDialogItem(pMsg->hWin, ID_EDIT_0);
				EDIT_SetTextAlign(hItem1, GUI_TA_BOTTOM | GUI_TA_RIGHT);
				EDIT_SetFont(hItem1, GUI_FONT_20_ASCII);
				EDIT_SetText(hItem1, "0");
				break;
			}
			break;
		case  ID_BUTTON_33:

			switch (NCode)
			{
			case WM_NOTIFICATION_CLICKED: //"=" 按钮被按
				getanswer(pMsg->hWin,pbuffer1);
				counterCE();
				break;
			case WM_NOTIFICATION_RELEASED:
				break;
			}
			break;
		}
		break;
	default:
		WM_DefaultProc(pMsg);
		break;
	}
}
//主函数
void MainTask(void) {
	WM_SetCreateFlags(WM_CF_MEMDEV);
	GUI_Init();
	WM_HWIN TextDialoghWin;
	TextDialoghWin = GUI_CreateDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), _cbBkButton, WM_HBKWIN, 0, 0);
	while (1)
	{
		GUI_Delay(100);
	}
}








链接:https://pan.baidu.com/s/1z5y4OGT_aZVKV0wEzYVJPA
提取码:9nyd
这是整个计算器实现的代码。

发布了3 篇原创文章 · 获赞 4 · 访问量 2423

猜你喜欢

转载自blog.csdn.net/sanla1/article/details/104595064
今日推荐